javascript - 反应重新渲染不显示更新的状态数组
问题描述
我正在事件处理函数中更新状态(将新对象添加到状态数组)。
const handleIncomingData = (data) => {
setState(state => {
var _state = state
if (_state.someDummyStateValue === 1234) {
_state.arr.push({ message: data.message })
}
return _state
})
}
React.useEffect(() => {
socket.on('data', handleIncomingData)
return()=>{
socket.off('data', handleIncomingData)
}
},[])
我以这种方式更新状态,因为事件处理函数无法访问最新的状态值。console.log(state) 显示更新状态,但重新渲染后不显示新添加的对象。同样,当再次触发相同的事件时,会显示先前接收到的数据,但不会显示最新的数据。以这种方式更新状态有什么问题吗?
解决方案
javascript中的对象是通过引用复制的(存储在内存中的地址)。当您执行以下操作时:
let obj1 = {}
let obj2 = obj1;
obj2
具有与 相同的参考obj1
。
在您的情况下,您直接复制状态对象。当您调用 时setState
,它会触发重新渲染。如果前一个渲染的值与当前渲染的值相同,React 不会打扰更新。因此,您需要创建您的状态的新副本。
试试这个:
setState(prevValue => [...prevValue, {message: data.message}])
为了更好地说明我的观点,这里有一个代码框:https ://codesandbox.io/s/wild-snowflake-vm1o4?file=/src/App.js
推荐阅读
- javascript - 为什么“这个”突然超出了我的范围?
- c# - Active Directory 中 UserPrincipal 对象的 GUID 属性是否唯一且不可欺骗?
- sql - Rails - 我如何查看我的 SQLite 表?
- java - 给玩家体验
- pandas - statsmodels 混合模型需要很长时间
- rx-java2 - 带有 RXJava2 的 Android 房间;发射器的 onNext() 未正确触发
- android-studio - 即使在安装 haxm 后 AVD 也无法正常工作
- node.js - 将 Firebase 添加到电子项目的问题,gRPC 依赖问题
- c# - 无法分配给“arg”,因为它是“foreach 迭代变量”
- vue.js - VUE,在v-for循环中,如何在样式中绑定循环的各个url