【问题标题】:React Hook useEffect has a missing dependency arrayReact Hook useEffect 缺少依赖数组
【发布时间】:2019-06-27 18:15:35
【问题描述】:

我正在使用 firebase 数据库来存储数据,并且正在使用 useEffect 挂钩挂载数据。但它给了我缺少依赖数组的警告。

每当我传递依赖项时,它都会进入无限循环

const Channels = props => {
  const [channels, setChannels] = useState([]);
  const [firstLoad, setFirstLoad] = useState(false);

  useEffect(() => {
    let loadedChannels = [];

    firebase
      .database()
      .ref("channels")
      .on("child_added", snap => {
        loadedChannels.push(snap.val());
        setChannels(channels.concat(loadedChannels));
        setFirstLoad(true);
      });
  }, []);
}

【问题讨论】:

  • 您是否检查过触发 useEffect 时依赖关系没有改变?这样它将再次触发 useEffect 。在无限垂下
  • UseEffect 具有通道依赖关系,每当我使用 setChannels() 设置通道时,它内部都会不断变化。这就是为什么我不将频道作为依赖项传递。
  • But it gives me warning of missing dependency arrays 缺少哪些依赖项?
  • 尝试使用基于回调的 setter,例如 setChannels(({ channels}) => ({channels: channels.concat(loadedChannels) }));(不太确定,这就是为什么没有给出答案)

标签: javascript reactjs react-hooks


【解决方案1】:

编辑:再看一遍,您收到该错误的原因是因为您在 useEffect() 第一次运行时关闭了 channels 的初始值。所以channels 确实应该在您的依赖数组中,因为当该值更改时,您希望从那时起新值反映在状态更新中。您正在尝试使用 loadedChannels 数组绕过它,这是一种奇怪的反模式。

我实际上建议您将其调整为类似的内容。请注意现在如何使用函数调用 setChannels,该函数将 channels 的实际最新值作为参数,并允许您更新该值而不会因为闭包而过时.

还要注意useEffect() 函数如何返回另一个 函数,该函数会在组件卸载时移除 Firebase 事件侦听器!

const Channels = props => {
  const [channels, setChannels] = useState([]);
  const [firstLoad, setFirstLoad] = useState(false);

  useEffect(() => {
    function onFirebaseUpdate(snap) {
      setChannels((previousChannelsValue) => {
        return previousChannelsValue.concat(snap.val())
      });
      setFirstLoad(true);
    }

    firebase
      .database()
      .ref("channels")
      .on("child_added", onFirebaseUpdate);

    // You'll want to remove this listener when the component unmounts...
    return function() {
      firebase
        .database()
        .ref("channels")
        .off("child_added", onFirebaseUpdate);
    }
  }, []);
}

如果您仍然收到警告,可能是因为 firebasesetChannels 是函数中的引用,应该考虑添加到依赖数组中。但在这种情况下,您(希望)知道自己在做什么以及发生了什么,并且可以忽略警告。

【讨论】:

  • 非常感谢您提供上述解决方案。它对我有用
  • @AnjuBudhwan 如果它适合你,请投票并接受答案! :)
猜你喜欢
  • 2021-02-23
  • 2019-10-24
  • 2020-10-26
  • 2022-06-12
  • 2020-03-07
  • 2020-02-25
  • 2020-06-11
  • 2020-03-30
  • 2020-12-29
相关资源
最近更新 更多