reactjs - 在外部 API 服务层使用 React hooks

标签 reactjs react-hooks

我正在为电子商务网站构建一个 React 应用程序。 我有一个产品搜索页面。我正在使用 SWR 库(useSWR hook),因为我喜欢它的缓存能力。但是,由于它使用了钩子(Hook),所以我似乎无法将此调用放在我的函数组件之外。 理想情况下,我想将所有 API 功能分割成一个单独的库/服务层。

让我用一些极其精简的代码来演示我正在尝试做什么:

import React, { useState } from 'react';
import { useParams } from "react-router";
import * as ProductAPI from 'common/libs/ProductAPI';

function ProductSearch() {

    const [searchResults, setSearchResults] = useState(null);

    let { keywords } = useParams();

    const results = ProductAPI.getProductSearchResults(keywords);

    if (searchResults != results)
        setSearchResults(results);

    function renderSearchResults() {
        ...
    }

    return (
        <>
            {renderSearchResults()}
        </>
    );
}

export default ProductSearch;

和 API 库:

import useSWR from 'swr';

var productSearchURL = process.env.REACT_APP_API_ENDPOINT + '/product/search';

export function getProductSearchResults(keywords) {

    let url = productSearchURL;
    url += "/" + encodeURI(keywords);

    const { data } = useSWR(url);

    return data;
}

现在,React 遇到了“你违反了钩子(Hook)规则”的错误:

Invalid hook call. Hooks can only be called inside of the body of a function component.

我一直在努力寻找一种解决方案,让我能够将 API 功能抽象化到它自己的函数/组件中。

如果使用我当前的方法无法解决此问题,那么实现这种 API 实现分层方法的最佳方法是什么?

最佳答案

您应该创建一个使用 useSWR 来获取数据的自定义 Hook 。 React 将允许使用其中使用的其他钩子(Hook)创建自定义钩子(Hook)。像这样的东西:

export function useProductSearchResults(keywords) {

    let url = productSearchURL;
    url += "/" + encodeURI(keywords);

    const { data } = useSWR(url);

    return data;
}

然后在您的代码中使用这个自定义钩子(Hook):

.
.
 let { keywords } = useParams();

    const results = useProductSearchResults(keywords);

    if (searchResults != results)
        setSearchResults(results);
.
.
.

关于reactjs - 在外部 API 服务层使用 React hooks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61815138/

相关文章:

reactjs - Redux 开发工具和 React Native

html - 如何使react的valueLink与选择元素一起工作?

javascript - 更改默认文本 Material 表

javascript - 不变违规 : Element type is invalid on login page react-native

reactjs - react-hook-form - 无法将表单数据传递给父组件

javascript - 子类组件来重写事件处理程序?

ajax - 在自定义 React hook 中的 AJAX 函数之后进行清理

reactjs - 使用 React Hook useEffect 加载所有外部库后如何执行函数?

reactjs - 没有 Redux 的情况下组合Reducer

html - 在React中使用callback ref修改scrollLeft属性