gpt4 book ai didi

javascript - 使用当前 Prop react useEffect 清理

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:08:13 25 4
gpt4 key购买 nike

当组件被卸载但可以访问当前 Prop 时,我遇到了清理 useEffect 的需要。就像 componentWillUnmount 可以通过获取 this.props.whatever 来做

这是一个小例子:单击“设置计数”按钮 5 次并查看您的控制台。您将从组件 B 的 console.log 中看到 0,无论“count”是否为 5 https://codesandbox.io/embed/vibrant-feather-v9f6o

如何在 useEffect 清理函数中实现获取当前 props 的行为(在我的例子中是 5 个)?

更新:将计数传递给 useEffect 的依赖项无济于事,因为:

  1. 每次将新计数传递给 props 时都会调用清理
  2. 最后一个值将是 4 而不是所需的 5

最佳答案

从另一个问题中引用了这个问题,因为没有公认的答案,所以将对其进行一些严重的挖掘。

您想要的行为永远不会发生,因为 B 永远不会以 5 的计数值呈现,当计数为 5 时,组件 A 不会呈现组件 B,因为它将呈现未安装的 而不是 B,呈现的最后一个值 B 将为 4。

如果您希望 B 在卸载时记录它的最后一个计数值,您可以执行以下操作:

请注意,效果在所有组件都已呈现后执行

const useIsMounted = () => {
const isMounted = React.useRef(false);
React.useEffect(() => {
isMounted.current = true;
return () => (isMounted.current = false);
}, []);
return isMounted;
};
const B = ({ count }) => {
const mounted = useIsMounted();
React.useEffect(() => {
// eslint-disable-next-line react-hooks/exhaustive-deps
return () => !mounted.current && console.log(count);
}, [count, mounted]);

return <div>{count}</div>;
};
const A = () => {
const [count, setCount] = React.useState(0);
const handleClick = React.useCallback(() => {
setCount(prevCount => prevCount + 1);
}, []);

if (count === 5) {
//B will never be rendered with 5
return <div>Unmounted</div>;
}

return (
<React.Fragment>
<B count={count} />
<button onClick={handleClick}>Set count</button>
</React.Fragment>
);
};

ReactDOM.render(<A />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>

关于javascript - 使用当前 Prop react useEffect 清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57481573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com