javascript - 在我的反应应用程序中对状态变量所做的更改未更新为子函数调用
问题描述
const [ change , setChange ] = useState(0);
const funct = () => {
if (change === 100){
return 0;
}
setChange((pre) => {
return pre + 10
});
funct()
}
如果我在任何事件发生时调用函数fuct(),它将不得不调用自身(递归函数),直到变化的值变为 100。但这里函数无限运行(无限递归)。这是因为状态变量在setChange()调用的每一刻都没有改变。
为什么 ?为什么状态在递归函数调用之间没有改变?
解决方案
为什么 ?为什么状态在递归函数调用之间没有改变?
由于funct()
是通过基于 React 的事件触发的,因此状态更新是批处理的。
为了不批量更新状态,触发器应该在基于 React 的事件之外,比如setInterval()
.
话虽如此,这里有一个使用useEffect()
钩子的例子setInterval()
。
const {useState, useEffect} = React;
const App = (props) => {
const [change, setChange] = useState(0);
useEffect(() => {
const t = setInterval(() => (
setChange((change) => (change + 10))
), 1000);
return () => clearInterval(t);
}, [change]);
return (
<div>{`Change: ${change}`}</div>
);
}
ReactDOM.render(
<App />,
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>
推荐阅读
- xslt - XSLT 使用属性复制父元素并更改子元素
- javascript - 如何在nodejs中使用html创建pdf
- laravel - 字符串数据,右截断:1406 第 1 行的“图像”列数据太长
- python - 我可以在应用程序运行时多次加载 .kv 文件吗?
- php - 你能发现错误吗?
- powerbi - 度量 - 累积总计
- python - 如何在python中识别不同颜色/肤色的相同表情符号?
- java - 输入通道被破坏,firebase 有问题
- azure - 如何在 ARM 模板中包含外部逻辑应用实现
- reactjs - 如何在 Firebase Firestore 中使用用户“uid”创建文档