【发布时间】:2019-12-05 23:41:10
【问题描述】:
要限制 useEffect 在第一次渲染时运行,我们可以这样做:
const isFirstRun = useRef(true);
useEffect (() => {
if (isFirstRun.current) {
isFirstRun.current = false;
return;
}
console.log("Effect was run");
});
根据这里的例子:https://stackoverflow.com/a/53351556/3102993
但是如果我的组件有多个 useEffects,每个 useEffects 处理不同的 useState 变化怎么办?我已经尝试在另一个 useEffect 中使用 isFirstRun.current 逻辑,但是由于一个返回,另一个仍然在初始渲染上运行。
一些上下文:
const Comp = () => {
const [ amount, setAmount ] = useState(props.Item ? Item.Val : 0);
const [ type, setType ] = useState(props.Item ? Item.Type : "Type1");
useEffect(() => {
props.OnAmountChange(amount);
}, [amount]);
useEffect(() => {
props.OnTypeChange(type);
}, [type]);
return {
<>
// Radio button group for selecting Type
// Input field for setting Amount
</>
}
}
我为每个使用单独的 useEffects 的原因是,如果我执行以下操作,它不会更新数量。
useEffect(() => {
if (amount) {
props.OnAmountChange(amount);
} else if (type) {
props.OnTypeChange(type)
}
}, [amount, type]);
【问题讨论】:
-
请展示一个完整的例子
-
如果要求在第一次渲染后运行多个效果,为什么不在单个 useEffect 调用中放置多个效果?
-
是 reactjs(如何实现)或 jest(如何进行单元测试)上下文中的问题?
-
您能否提供更多详细信息,说明您为什么需要这样的逻辑?对我来说,将组件分解为具有不同职责的 2 个组件会更容易。
-
@skyboyer 更多关于如何实现它的 React 前沿
标签: reactjs react-hooks