【发布时间】:2021-10-24 08:24:08
【问题描述】:
我在更新 useEffect() 中的 useState() 时遇到问题。我想我可能会陷入无限循环,并且无论我传入的布尔值如何,useState 都不会更新。它总是显示为 false。
export const useAlert = () => {
const action = useSelector(state => state.edit.action);
const dispatch = useDispatch();
const booleanA = true;
const booleanB = false;
const [isOverMax, setIsOverMax] = useState(false);
const reset = () => {
dispatch(resetEditAction());
};
useEffect(() => {
setIsOverMax(booleanA || booleanB);
}, isOverMax);
return [isOverMax, reset];
};
关于更多上下文,booleanA 和 booleanB 是使用其他代码动态生成的,但即使它们像上面那样被硬编码,isOverMax 也只有false。即使两个布尔值都被硬编码为真,我也永远无法获得真值。
【问题讨论】:
-
首先确保写
useEffect(() => { setIsOverMax(booleanA || booleanB); }, [isOverMax]);其次,我会小心更新useEffect中的状态可能会出现一些意想不到的副作用 -
免责声明:我是 JS 菜鸟,所以......你试过在 useEffect 中写
console.log(isOverMax)吗?因为 JS 是单线程的,所以你有可能马上就看到了这个函数的返回值。无论在何处调用它,您都可以运行一个将值记录到控制台的间隔。它可以设置为 true,但由于操作队列,您从未注意到。顺便说一句 +1 德鲁里斯的评论。您的 IDE 可能会为您指出这一点;如果没有,那么你可以使用 React/Vue 插件/预设运行 eslint,它会告诉你应该拥有什么。 -
你的
useEffect依赖不正确,应该是一个数组。此外,您不希望useEffect回调更新该数组中的任何依赖项,即如果调用setIsOverMax则isOverMax不应该是没有对状态更新程序进行条件检查的依赖项。我的猜测是您的依赖项应该是[booleanA, booleanB],因为这些是效果回调中引用的内容。您能否更新您的问题以包含更准确的代码表示? -
@HansKrohn 经过更多学习,我认为空的依赖数组比更新使用效果挂钩内的状态更可取。这可能会导致无限循环和渲染问题。并且具有正确值的填充依赖数组将是一个更好的选择。
-
@DrewReese 感谢您指出错误的依赖数组。
标签: reactjs react-redux react-hooks state