reactjs - 如何修复自定义 Hook 中的 "useEffect has a missing dependency"

标签 reactjs eslint react-hooks use-effect

我正在使用自定义 Hook 从 API 中提取一些数据,以便在一组 React 函数组件中使用。然而,esLint 抛出了一个可爱的警告:

React Hook useEffect has a missing dependency: 'fetchFromAPI'. Either include it or remove the dependency array.

我不认为它是依赖项,因为它位于 useFetch() 本身内部。我需要这样做,因为我正在使用 await。我究竟做错了什么?直接关闭这条线的警告就可以了吗?或者我应该使用更规范的语法?

function useFetch (url) {
  const [data, setData] = useState(null);

  async function fetchFromAPI() {
    const json = await( await fetch(url) ).json();
    setData(json);
  }

  useEffect(() => {fetchFromAPI()},[url]);

  return data;
};

export {
  useFetch
};

最佳答案

我建议您在 useEffect 本身内部定义异步函数:

function useFetch (url) {
  const [data, setData] = useState(null);
  useEffect(() => {
    async function fetchFromAPI() {
      const json = await( await fetch(url) ).json();
      setData(json);
    }
    fetchFromAPI()
  },[url]);

  return data;
};

您可以查看 doc faqs 中的有效示例它在 useEffect 本身内部使用异步函数:

function ProductPage({ productId }) {
  const [product, setProduct] = useState(null);

  useEffect(() => {
    // By moving this function inside the effect, 
    // we can clearly see the values it uses.
    async function fetchProduct() {
      const response = await fetch('http://myapi/product' + productId);
      const json = await response.json();
      setProduct(json);
    }

    fetchProduct();
  }, [productId]); // ✅ Valid because our effect only uses productId
  // ...
}

关于reactjs - 如何修复自定义 Hook 中的 "useEffect has a missing dependency",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58413705/

相关文章:

reactjs - 如何设置 Flow 类型声明 - 错误 "not defined"的 lint ?

css - 使用样式组件的媒体查询中的语法问题

reactjs - 使用 Formik + Yup 验证 react 输入掩码长度

javascript - 在非 React 组件中使用钩子(Hook)的替代方法是什么?

javascript - 无法使用带有 TypeScript 的 React Native 找到变量符号

javascript - 基于slate.js的reactjs富文本编辑器逆向工程

javascript - ESlint Angular - no-unused-vars 命中类型定义

javascript - 抑制 VSCode 中的 ESLint 警告

javascript - 如何在reactjs中使用原型(prototype)

reactjs - `useEffect` 的预期返回是用来做什么的?