解决 next中的“React Hook useEffect has missing dependencies”

在项目中,使用useEffect中去获取数据,useEffect(()=>{},[])如果第二个参数是空数组,默认是dom渲染完后,就执行一次Hook函数。项目中很容易提示一些错误React Hook useEffect has missing dependencies: 'lang' and 'search'.本文就针对这种现象,列举一些解决方法

1、useEffect

  • 第一个参数:是指定一个副效应函数,组件每渲染一次,该函数就自动执行一次。如果副效应函数返回一个函数,组件卸载后,会执行该返回的函数
  • 第二个参数:使用一个数组指定副效应函数的依赖项,只有依赖项发生变化,才会重新渲染
    • 不传第二个参数,每次渲染都执行第一个函数
    • 传[],表示只执行一次函数
    • 传[lang,search],其中一个参数发生变化,才重新执行函数

2、原因

React Hook useEffect has missing dependencies:不是 React 错误,而是 ESLint 错误。ESLint 提供了专门针对 React 的插件,其中包含一组旨在帮助开发人员编写更好的 React 代码的规则。这些规则之一是"react-hooks/exhaustive-deps"检测"React Hook useEffect 缺少依赖项"错误的规则

3、解决

a、 添加包括所有缺少的依赖项(lang、search)

scss 复制代码
  useEffect(() => {
    async function fetchData() {
      if (search) {
        setLoading(true);
        try {
          const searchs = await getSearch(lang, search, false);
          setSearchSimilarContents(searchs);
        } catch (error) {
          console.warn(error);
        }
        setLoading(false);
      }
    }
    fetchData();
  }, [lang, search]);

b、禁用eslint规则,只执行一次

scss 复制代码
  useEffect(() => {
    async function fetchData() {
      if (search) {
        setLoading(true);
        try {
          const searchs = await getSearch(lang, search, false);
          setSearchSimilarContents(searchs);
        } catch (error) {
          console.warn(error);
        }
        setLoading(false);
      }
    }
    fetchData();
// eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

c、使用对象或者函数时候,使用useMemo,useCallback,或者useEffect中声明使用

  • 1、为了解决React Hook useEffect has missing dependencies,单纯添加fetchData作为依赖,而出现错误的实列(原因:在JavaScript中,对象和数组通过引用进行比较,并每次都指向内存中的不同位置,它的值将在每次渲染时发生变化,从而导致无限的重新渲染循环)
scss 复制代码
//单纯添加依赖,出现死循环错误案列
  async function fetchData() {
    try {
      const searchGuess = await getSearchGuess(lang, searchQuery ?? "", false);
      setSearchGuess(searchGuess);
    } catch (error) {
      console.warn(error);
    }
  }

  useEffect(() => {
    fetchData();
  }, [fetchData]);
  • 2、直接放在useEffect中,声明请求函数
scss 复制代码
  useEffect(() => {
    async function fetchData() {
      try {
        const searchGuess = await getSearchGuess(
          lang,
          searchQuery ?? "",
          false
        );
        setSearchGuess(searchGuess);
      } catch (error) {
        console.warn(error);
      }
    }
    fetchData();
  }, []);
  • 3、使用useCallback,依赖的lang、searchQuery发生变化,函数才会变化
ini 复制代码
  const fetchData = useCallback(async () => {
    try {
      const searchGuess = await getSearchGuess(lang, searchQuery ?? "", false);
      setSearchGuess(searchGuess);
    } catch (error) {
      console.warn(error);
    }
  }, [lang, searchQuery]);

  useEffect(() => {
    fetchData();
  }, [fetchData]);

总结:针对这种"React Hook useEffect 缺少依赖项,不能为了解决问题就单纯添加依赖,而是要具体分析使用情况,选择最佳方法来处理

4、参考

相关推荐
Johnny_FEer1 小时前
什么是 React 中的远程组件?
前端·react.js
艾小码1 小时前
用了这么久React,你真的搞懂useEffect了吗?
前端·javascript·react.js
江城开朗的豌豆2 小时前
React 跨级组件通信:避开 Context 的那些坑,我还有更好的选择!
前端·javascript·react.js
江城开朗的豌豆3 小时前
Redux 与 MobX:我的状态管理选择心路
前端·javascript·react.js
薛定谔的算法18 小时前
低代码编辑器项目设计与实现:以JSON为核心的数据驱动架构
前端·react.js·前端框架
小lan猫20 小时前
React学习笔记(一)
前端·react.js
江城开朗的豌豆1 天前
解密React虚拟DOM:我的高效渲染秘诀 🚀
前端·javascript·react.js
前端人类学1 天前
React框架详解:从入门到精通(详细版)
react.js·redux
江城开朗的豌豆1 天前
React应用优化指南:让我的项目性能“起飞”✨
前端·javascript·react.js
艾小码1 天前
还在被超长列表卡到崩溃?3招搞定虚拟滚动,性能直接起飞!
前端·javascript·react.js