reactjs - 为什么在循环内设置 useState 执行不同?
问题描述
有人可以向我解释以下代码片段吗?为什么 handleClick() 不能正常工作(只设置了 newData 的 1 或 2 个数据属性)而 handleClick2() 工作正常。
我猜问题是由于循环造成的(因为这是唯一的区别),但为什么循环会导致这种效果?
沙盒链接:https ://codesandbox.io/s/restless-surf-u9i5s?file=/src/App.js:0-969
import React, { useState, useEffect } from "react";
import "./styles.css";
const App = () => {
const [newData, setNewData] = useState({
data1: '',
data2: '',
data3: '',
data4: ''
})
const handleClick = () => {
let fields = ['data1', 'data2', 'data3', 'data4']
let field
for (field of fields) {
setNewData(oldState => ({...oldState, [field]: 'test'}))
}
}
const handleClick2 = () => {
setNewData(oldState => ({...oldState, data1: 'test'}))
setNewData(oldState => ({...oldState, data2: 'test'}))
setNewData(oldState => ({...oldState, data3: 'test'}))
setNewData(oldState => ({...oldState, data4: 'test'}))
}
useEffect(() => {
console.log('State: ' + JSON.stringify(newData))
}, [newData])
return (
<div className="App">
<button onClick={handleClick}>Click</button>
<button onClick={handleClick2}>Click2</button>
</div>
);
}
export default App
解决方案
原因是:
setNewData
是异步函数。当你setNewData
以某种方式调用时,React 会在事件循环中推送它的回调函数,然后在主线程为空时在主线程中调用它。在setNewData
main 中调用回调函数field
是test4
因为 for (field of fields)
同步函数。==> 只有setNewData(oldState => ({...oldState, data4: 'test'}))
调用 4 次。
您可以记录回调函数的field
内部setNewData
并查看它的值。
for (field of fields) {
console.log(field)
setNewData(oldState => {
console.log(field)
return { ...oldState, [field]: "test" }
})
}
推荐阅读
- c# - 在 .Net Core 中模拟用户
- .htaccess - 重复页面。阻止没有变量PHP的地址
- javascript - 如何在 Wordpress 页面上使用 Javascript 将字符串转换为页面标题
- hibernate - 如何使用 JPA + MySQL 在 Spring Boot 中实现全文搜索
- excel - 比较 2 个列表位置并显示趋势 (+/-)
- angular - Angular HttpClient“内部连接”单独的 API 调用
- javascript - 忽略对“打印()”的调用。该文档已被沙盒化,并且未设置“allow-modals”关键字 Google App Script
- node.js - 无法追踪 Node JS 内存泄漏
- php - 避免业务逻辑的最佳实践
- sql - SQL按频率对ypositions进行分组