解决 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、参考

相关推荐
独立开发者屿风7 小时前
在 React 里把 import 排得明明白白:一份让人极度舒适的配置指南
react.js·代码规范
smileNicky8 小时前
React 弹窗组件如何在新标签页打开?
javascript·react.js·ecmascript
光影少年10 小时前
react navite 简单原生方法双向调用示例
javascript·react native·react.js
zzzzzz31010 小时前
react-bits:把“酷炫组件”放回 React 组件化的语境里看
javascript·react.js·动效
zzz_236820 小时前
个人 AI 记忆如何跨工具复用:用 Markdown、索引和 Skill 搭一个可治理的记忆库
前端·人工智能·react.js·前端框架·agent·agent测评
l1m0_1 天前
智能电动自行车管理后台实战:AI生成页面与React组件化技巧
前端·react.js·ui·ai·设计
坚果的博客1 天前
认识 CPF-RN:React Native 鸿蒙官方社区与四大核心仓库
react native·react.js·harmonyos
Carl_奕然1 天前
【智能体】Agent的四种设计模式之:React(2026最新版)
javascript·人工智能·python·react.js·设计模式·语言模型
名为沙丁鱼的猫7291 天前
React/JSX 编码规范
前端·javascript·react.js