我正在使用Reaction开发一个Web应用程序.在我的项目中,有多个实例需要向服务器发送GET request并接收dataloading状态.所以我为同样的问题定制了一个钩子

以下是自定义挂钩:

export const useGetApi = (link) => {
    const [data, setData] = useState();
    const [loading, setLoading] = useState(true);

    const handleFetch = async () => {
        const cancelToken = axios.CancelToken.source();
        try {
            const response = await axios.get(link, { cancelToken: cancelToken.token });
            setLoading(false);
            setData(response.data.data);
        } catch (err) {
            setLoading(true);
            //handle error
        }
    };

    useEffect(() => {
        handleFetch();
    }, [JSON.stringify(data)]);

    return [data, loading];
};

在大多数情况下,它是有效的,我只需将link作为参数传递给钩子.但在某些情况下,我需要首先修改链接,然后将修改后的链接作为参数传递给挂钩.

我try 使用以下方法来实现这一点:

export const App=()=>{
    const link='/helloworld'
    const modifiedLink= getModifiedLink(link);

    useEffect(()=>{
       const [data,loading]= useGetApi(modifiedLink);
    },[])

}

我收到以下错误:

React Hook "useGetApi" cannot be called inside a callback. React Hooks must be called in a React function component or a custom React Hook function.

我是否需要为链接先修改后传递的情况创建单独的钩子?因为这将导致大量可重复的代码.有没有办法使用我现有的钩子,同时仍然满足我的要求.请给我带路.

推荐答案

与Reaction挂钩一样,自定义挂钩不能在另一个挂钩内或循环中有条件地调用.无论是否自定义挂钩,都需要称为组件的顶层.

您的代码中有几个错误:

  1. 您的定制钩子只运行一次,如果您想像使用useEffect一样重新设置它(我可以看到您try 使用另一个useEffect来实现这一点),您可以将键传递给您的自定义钩子useEffect键.这样,您就可以随时重新刷新查询.
export const useGetApi = (link) => {
    const [data, setData] = useState();
    const [loading, setLoading] = useState(true);

    const handleFetch = async () => {
        const cancelToken = axios.CancelToken.source();
        try {
            const response = await axios.get(link, { cancelToken: cancelToken.token });
            setLoading(false);
            setData(response.data.data);
        } catch (err) {
            setLoading(true);
            //handle error
        }
    };

    useEffect(() => {
        handleFetch();
    }, [link]); // this way your query runs whenever your link changes

    return [data, loading];
};
  1. 在另一个钩子中使用自定义钩子:
export const App=()=>{
    const link='/helloworld'
    const modifiedLink= getModifiedLink(link);
    const [data,loading]= useGetApi(modifiedLink); // this is the true way

}

您可以将链接放在一个useState钩子中并将其发送到您的useGetApi,这样每当链接更改时,您的查询就会重新获取.

我建议你使用react-query,它基本上做了你试图在这里做的事情,但更稳定和易于使用的方法.

Reactjs相关问答推荐

如何在react组件中使用formik进行验证

使用Overpass API Endpoint计算 map 上的面积

值在返回页面时不更新,即使我已经更新了它们

如何解决Reaction中遗留的上下文API错误?

自定义变量默认、聚焦和填充时所需TextField中标签的星号 colored颜色

Gitlab CI和VITE环境变量出现问题

无法在下一个标头上使用 React hooks

如何删除 bootstrap 手风琴上的边框

在 React 中是否有任何理由要记住 Redux 操作创建者?

useEffect内部的RETURN语句在首次按钮点击事件中似乎无效的原因是什么?

解决在React测试库中的act()警告

useState 在生命周期中的位置

list 组件未按预期运行

如何根据数据库中的值设置单选按钮选中? - react

当父组件重新渲染时做出react ,我失go 了子状态.我错过了什么?

如何实现两个 SVG 形状相互叠加的 XOR 操作?

React - useParams() 不会失败 null / undefined 判断

RTK 查询 POST 方法不会改变数据

react / firebase 基地.如何在我的项目中保存更新的数据?

如何从另一个切片中的不同切片获取状态并对其进行处理?