useEffect()的第二个参数是空数组时怎么取消这个警告

img


虽然对程序没什么影响,但是还是想解决一下
不要使用eslint-disable之类的语句

  let userInfo: any = userStore.userInfo;
  useEffect(() => {
    (async function () {
      let res = await orderApi.order1({ userId: userInfo.userId });
      if (res.err !== 0) {
        return;
      }
      setOrder1(res.data[0]);
    })();
  }, []);

添加个依赖项就可以了

let userInfo: any = userStore.userInfo;
  useEffect(() => {
    (async function () {
      let res = await orderApi.order1({ userId: userInfo.userId });
      if (res.err !== 0) {
        return;
      }
      setOrder1(res.data[0]);
    })();
  }, [userInfo]);

真正投入使用的程序中这种东西太多了,没谁去理会 甚至连一些错误都是直接try-catch压了。

如果你想要使用空数组作为第二个参数,那么你应该确保副效应函数中没有使用任何外部的变量,或者把这些变量都放到依赖数组中。如果你不想让副效应函数重新执行,那么你可以使用 useRef() 钩子来保存这些变量的引用,或者使用 useCallback() 钩子来缓存这些变量的值。这样可以避免一些不必要的警告和错误。

在eslint的配置文件中,添加

   react-hooks/exhaustive-deps: "off"

按提示追加就可以了啊,别用空,会有奇怪的BUG的,如果你确定是不会变的,可以换个其他的写法

  let userInfo: any = userStore.userInfo;
  useEffect(() => {
    (async function () {
      let res = await orderApi.order1({ userId: userInfo.userId });
      if (res.err !== 0) {
        return;
      }
      setOrder1(res.data[0]);
    })();
  }, [userInfo.userId]);

如果useEffect的第二个参数传入一个空数组,意味着这个effect只会在组件挂载时运行一次,不会在组件更新时运行。

这个会引起React Hook的警告,提示可能存在一些问题。

要避免这个警告,可以在useEffect中正确的指定依赖项,而不是传入空数组。

例如,如果effect里只使用了userInfo,那么可以:

useEffect(() => {
  // ...effect
}, [userInfo]) 

如果effect不依赖组件内的任何值,只需要在挂载时运行一次,可以:

useEffect(() => {
  // ...effect 
}, [])

并在effect内部加上:

useEffect(() => {
  //...

  return () => {
    // 清理工作
  }
}, [])

这样就避免了警告,也实现了只在挂载时运行一次的效果。

正确的指定effect的依赖项,而不是简单的使用空数组。这可以避免一些潜在的bug。

引用chatgpt内容作答:
这个警告通常是由于使用了空数组作为useEffect的第二个参数,表示依赖项为空,这会导致useEffect只在组件挂载时运行一次。在你的代码中,由于useEffect没有依赖项,它只会在组件挂载时运行一次,之后不会再更新。如果这正是你的意图,可以通过以下方式来解决警告,而不使用eslint-disable:

将userInfo添加为依赖项:

let userInfo: any = userStore.userInfo;
useEffect(() => {
  (async function () {
    let res = await orderApi.order1({ userId: userInfo.userId });
    if (res.err !== 0) {
      return;
    }
    setOrder1(res.data[0]);
  })();
}, [userInfo]);  // 将userInfo添加为依赖项

这将确保每当userInfo发生变化时,useEffect都会重新运行。这是有意义的,因为你的代码似乎是根据userInfo来获取特定用户的订单信息。

在useEffect内部使用回调:

如果你确实想要在组件挂载时运行一次,而且你不希望将userInfo作为依赖项,可以在useEffect内部使用回调函数来解决警告:

useEffect(() => {
  (async function () {
    let res = await orderApi.order1({ userId: userInfo.userId });
    if (res.err !== 0) {
      return;
    }
    setOrder1(res.data[0]);
  })();
}, [userInfo]);  // 这里只有userInfo作为依赖项,但内部仍然使用了userInfo

无论哪种方法,都会根据你的需求解决警告,并确保useEffect按照预期工作。

eslint 添加

   react-hooks/exhaustive-deps: "off"
 

【以下回答由 GPT 生成】

在React的useEffect()钩子函数中,第二个参数用于指定该effect所依赖的变量。当这些依赖变量发生变化时,effect函数会重新执行。不设置第二个参数时,effect会在每次组件重新渲染时都执行一次,这可能会导致不必要的性能开销。

根据你的代码,你想在组件挂载时调用一次async函数,并将其返回的数据作为组件的初始状态。为了消除警告问题,你可以将userInfo添加到useEffect的依赖数组中,以此告诉React该effect依赖于userInfo的变化。

修改后的代码如下所示:

let userInfo: any = userStore.userInfo;

useEffect(() => {
  (async function () {
    let res = await orderApi.order1({ userId: userInfo.userId });
    if (res.err !== 0) {
      return;
    }
    setOrder1(res.data[0]);
  })();
}, [userInfo]);

这样做的效果是,当userInfo发生变化时,useEffect会重新执行,从而实现获取最新数据并更新组件状态的目的。

希望这个解决方案对你有帮助!如果你还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^