javascript - 为什么 IF 语句会导致循环
问题描述
我有这样一段简单的代码:
ReactDOM.render(<Change />, document.getElementById('app'));
function Change() {
const [i, setI] = React.useState(0);
let rnd = 9;
if (i !== rnd) {
setTimeout(() => {
setI(i + 1);
}, 500);
}
React.useMemo(() => {
console.log(i);
}, [i]);
return (
<div>
<h1>I change the state</h1>
</div>
);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script>
<div id="app"></div>
我不明白为什么if (i !== rnd)
启动一个循环,因为条件应该只检查一次条件并继续使用代码。
我的思考过程是这样的:
i
为 0 且不等于 9,因此进入超时并等待 500 毫秒运行增量并
i
变为 1console.log
应该显示 1 正在打印结尾
为什么它会变成一个循环并检查是否i
等于rnd
或不i
等于不等于rnd
?
解决方案
看起来您正在调用setI
它将更新状态并反过来重新渲染组件和if
条件?
推荐阅读
- spring - 使用 Criteria API Pageable 的内存泄漏
- c++ - 如何使用 QTimeLine 类在 C++ 中重写 QML 时间线?
- sql - Hive 将单个 Integer 列分成多行
- python - Unittest - 通过@patch 模拟对象和方法的返回值
- java - Azure Java SDK - Azure Authenticated Object - 到期和处理
- android - 如何为 Spinner DropDown 设置圆角?
- html - DataTable 实现但不适用于我在 Laravel 中的数据?
- javascript - 如何在 React Fullcallendar 中将事件注入适当的小时单元
- postgresql - 如何在插入原始表之前将记录插入到引用的表中?
- javascript - 用javascript连续旋转图像