reactjs - 自定义钩子(Hook)和动态 useEffect 依赖

标签 reactjs react-hooks use-effect

我在多个组件中使用这个 useFetch 自定义 Hook 。


import {useState,useEffect} from 'react'
import {getToken} from './../services/token'

const useFetch = (url) => {

    const [data,setData]       = useState(null);
    const [error,setError]     = useState(null);
    const [loading,setPending] = useState(false);

    useEffect(() => {

        (async()=>{

          const abortCont = new AbortController();
          const token     = await getToken();

          try {

            setPending(true);

            const response = await fetch(url,{
              signal  : abortCont.signal,

              headers : {
                "Content-Type"  : "application/json",
                "Authorization" : "Bearer "+token
              }

            });

            const result    = await response.json();

            setData(result);
            setPending(false);

          } catch (err) {

            if(err.name === 'AbortError'){
                abortCont.abort();
                return;
            }

            setError(String(err));
            setPending(false);

          }

        })()

      }, [])

    return {data,error,loading}
}

export default useFetch;



我将其导入到用户组件中,如下所示。


const {data,error,loading} = useFetch('http://localhost:4040/users');

通常我会传递 UseEffect 的第二个参数,例如 [users.length] 以使用户数据具有反应性,但因为这是一个自定义 Hook 并在许多组件中使用, 当用户数据更改或更新时,如何使用户数据使用react?

Codesandbox Link

最佳答案

您可以将依赖项数组作为可选参数传递给自定义 Hook 。

const useFetch = async (url, deps) => {

const [data,setData]       = useState(null);
const [error,setError]     = useState(null);
const [loading,setPending] = useState(false);

useEffect(() => {

    (async()=>{

      const abortCont = new AbortController();
      const token     = await getToken();

      try {

        setPending(true);

        const response = await fetch(url,{
          signal  : abortCont.signal,

          headers : {
            "Content-Type"  : "application/json",
            "Authorization" : "Bearer "+token
          }

        });

        const result    = await response.json();

        setData(result);
        setPending(false);

      } catch (err) {

        if(err.name === 'AbortError'){
            abortCont.abort();
            return;
        }

        setError(String(err));
        setPending(false);

      }

    })()

  }, deps || [])

    return {data,error,loading}
}

export default useFetch;

然后这样调用它

const {data,error,loading} = useFetch('http://localhost:4040/users', [users.length]);

编辑

在您的情况下,您希望对渲染有更多的控制。所以我想说你必须修改你的钩子(Hook)以支持你安装的组件的设置数据。

const useFetch = async (url, holded, setHolded) => {

const [data,setData]       = useState(null);
const [error,setError]     = useState(null);
const [loading,setPending] = useState(false);

useEffect(() => {

    (async()=>{

      const abortCont = new AbortController();
      const token     = await getToken();

      try {

        setPending(true);

        const response = await fetch(url,{
          signal  : abortCont.signal,

          headers : {
            "Content-Type"  : "application/json",
            "Authorization" : "Bearer "+token
          }

        });

        const result    = await response.json();

        setData(result);
        if(setHolded) {
            setHolded(result);
        }
        setPending(false);

      } catch (err) {

        if(err.name === 'AbortError'){
            abortCont.abort();
            return;
        }

        setError(String(err));
        setPending(false);

      }

    })()

  }, (holded && setHolded && [holded,setHolded,url]) || [url])

    return {data,error,loading}
}

export default useFetch;

然后这样调用它

const {data,error,loading} = useFetch('http://localhost:4040/users', users, setUsers);

关于reactjs - 自定义钩子(Hook)和动态 useEffect 依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67365617/

相关文章:

javascript - 为什么我的 react\redux 应用程序没有触发 Action ?

javascript - 将自定义数据属性注入(inject) REACT `props.children`

javascript - 避免 useEffect 在第一次加载时渲染?

reactjs - 使用useEffect React axios获取请求而不会导致无限循环

javascript - ReactJS - 无法读取未定义的属性 'preventDefault'

javascript - Electron 数据库处理

reactjs - Rx fromPromise 无法将 then 识别为函数?

reactjs - 在功能组件中声明没有 useState 的变量可以吗? react Hook

javascript - 展开和折叠后保持状态 |导致 React 状态更新错误

javascript - 如何在标题组件中使用效果(ReactJS/Next.js)