javascript - 在 React.useReducer 中更新状态时使用哪种方法
问题描述
让我们想象一个简单的减速器:
const [state, setState] = React.useReducer(myReducer, {})
并且myReducer
只有一个案例(简化版):
const myReducer = (state, action) => {
switch (action.type) {
case 'UPDATE_STATE': {
// Code to update here...
}
}
}
现在,以下哪个语句最适合更新状态 - 以及原因:
注意:payload
= state
。
方法一
case 'UPDATE_STATE': {
const updatedState = action.payload
updatedState.object = true
return updatedState
}
方法二
case 'UPDATE_STATE': {
const updatedState = action.payload
updatedState.object= true
return { ...state, updatedState }
}
方法 3
case 'UPDATE_STATE': {
const updatedState = action.payload
updatedState.object= true
return { ...state, ...updatedState }
}
方法 4
case 'UPDATE_STATE': {
return ({ ...state, object: true })
}
解决方案
我认为你应该使用方法 4。你不是在这里改变状态,这是 React 的方式。
case 'UPDATE_STATE': {
return ({ ...state, object: true })
}
注意:Spread 运算符...
最多只能创建一个级别的不同引用。
编辑:根据评论,这里是一个简单的例子,说明你如何改变状态,即使是最简单的对象,如果你不使用...
.
let state = { object : true};
let payload = state;
state.object = false;
console.log(state);
console.log(payload);
即使...
你可能有深层嵌套的对象。他们会有同样的问题,除非你想在每个层面上传播。有一些库可以帮助您处理诸如 immutable.js 之类的深层对象。
推荐阅读
- python - 从列表中删除值的问题
- elasticsearch - elasticsearch集群不相互绑定
- reactjs - react js中代码转换(从函数到类)的初学者
- vhdl - 在 VHDL 中调用不同实体的最佳方法是什么?
- google-bigquery - Bigquery DML - SQL 输出
- python - 如何手动计算knn的准确度?
- java - 同步队列的所有消费者以一次只处理一条消息
- swift - SwiftUI:同步 2 个动画函数(CAMediaTimingFunction 和 Animation.timingCurve)
- ssis - 如何在 SSIS 中将 UNICODE 转换为字符串(ANSI 1256)
- html - Css横幅没有出现