【问题标题】:Reacts useEffects exhaustive deps only trigger to create component will unmount functionalityReact useEffect 详尽的 deps 仅触发创建组件将卸载功能
【发布时间】:2020-03-01 00:37:25
【问题描述】:

我正在尝试实现一个 useEffect 回调以在卸载组件之前调度一个操作。此操作的目的是存储组件的最后状态,以便下次加载该组件时可以从该状态恢复。我只希望在卸载时触发此回调。

当尝试为我的 useEffect 使用空的依赖数组时,“exhaustive-deps”规则会响应推荐的“eslint-plugin-react-hooks”要求,我会包含我试图坚持的值。这会导致每次存储状态时都会触发效果和动作。

有没有更好的方法来处理这种情况,然后禁用这条线的 eslint?

这就是我想要的:

...
const [value, setValue] = useState('');

useEffect(() => {
    return () => {
        storeValueAction(value);
    };
}, []);
...

eslint-plugin-react-hooks 想要的方式并导致在每次状态更改时调度操作:

...
const [value, setValue] = useState('');

useEffect(() => {
    return () => {
        storeValueAction(value);
    };
}, [value, storeValueAction]);
...

除了 useEffect 我还应该使用其他东西吗?

【问题讨论】:

  • storeValueAction 是道具吧?
  • 是的,storeValueAction 是一个道具。

标签: javascript reactjs use-effect eslint-plugin-react-hooks


【解决方案1】:

即使你以当前的方式实现它并禁用 eslint 规则,预期的结果也不会正确,因为 unmount 时调度的 state 值将是由于关闭而导致的初始 mount 期间的 state 值。

对于这种情况,您可以使用 useRef 和 useEffect 来实现所需的结果。一旦你这样做了,你就可以安全地禁用 eslint 规则,确保你的代码不会导致意外的行为

const [value, setValue] = useState('');
const valueRef = useRef(value);

useEffect(() => {
   valueRef.current = value;
}, [value]);

useEffect(() => {
    return () => {
        storeValueAction(valueRef.current);
    };
    // eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

【讨论】:

  • 你有不禁用规则的解决方案吗?
  • 您可以将valueRefstoreValueAction 添加到依赖数组中,因为这两个引用在渲染之间不会发生变化。
  • 谢谢。我认为这会奏效。我之前只使用 refs 来访问 dom 节点。
  • 对于valueRef.current = value,不需要useEffect。这可以直接放在函数中。
  • @Julian Eslint 规则并未完美地适用于每种情况,也不是严格的规则,当您知道完全正确时,您可以选择禁用该规则。但是,在上述情况下,您可以选择将 storeValueAction 和 valueRef 添加到依赖数组中,正如弗朗西斯科指出的那样,前提是您没有在每个渲染上创建 storeValueAction 函数
猜你喜欢
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2022-01-25
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 2021-10-30
相关资源
最近更新 更多