reactjs - 在 react redux 中设置状态是更好的做法
问题描述
我正在学习 Redux。我是个新手,所以我不想在一开始就养成一个坏习惯,这就是我写这篇文章的原因。
我正在阅读的文档说,在减速器中,我们需要始终设置我们更改它的状态 - 换句话说,请执行以下操作:
const someReducer = (state=initState, {type, payload}) => {
switch(type) {
case 'CHANGE_VALUE_ONE' : {
state = {...state, valueOne: payload }
break
}
case 'CHANGE_VALUE_TWO' : {
state = {...state, valueTwo: payload }
break
}
default:
state = state
}
return state
}
我的方法是创建一个与我们收到的状态相同的 newState 常量,更改虚拟对象并将其返回 - 或在代码中:
const userReducer = (state= {name: null, age: null}, {type, payload}) => {
const newState = {...state}
switch(type) {
case 'CHANGE_VALUE_ONE' : {
newState.valueOne= payload
break
}
case 'CHANGE_VALUE_TWO' : {
newState.valueTwo= payload
break
}
}
return newState
}
我认为我这样做的方式更简洁——如果我有一个复杂的状态,我可以很容易地改变我需要改变的东西,而不会改变原始状态。
解决方案
对于第一个片段,您违反了纯 reducer 的原则。这意味着不是直接在状态中更新值,而是创建它的新副本并在其中进行更改。
根据文档:
Reducers 只是纯粹的函数,它接受前一个状态和一个动作,然后返回下一个状态。记住要返回新的状态对象,而不是改变以前的状态。
您在这里为 分配新值显然违反了state
这一点:
state = {...state, valueOne: payload }
注意:不要忘记const newState = {...state}
,只会创建浅拷贝,所以如果你有嵌套状态,这也违反了原则。
在嵌套状态的情况下,以这种方式更新它:
var obj = { car: { model: '', num: '' } };
function update() {
return {
...obj,
car: {
...obj.car,
model: 'abc'
}
}
}
console.log('new obj = ', update());
console.log('old obj = ', obj);
推荐阅读
- node.js - 如何在 foreach 循环中使用多个异步等待调用将返回值推送到数组中
- python - python中某些字符类型的最长连续子字符串
- javascript - 使用 webpack [request] 魔术注释将动态模块捆绑在一起
- python - 如何在由第二列定义的固定间隔内对一列的元素求和?
- flutter - Flutter 中如何渲染字体或者如何避免垂直间距?
- python - 在 Python 中导入时未解析的引用
- laravel - Laravel 5.7 Testing with Passport in seeder
- python - 基于标签而不是绝对位置在 XML 中查找值
- exchange-server - 使用 Exchange 和 SonicWall 配置 HA 代理
- laravel - Laravel:更改密码路径中的 MethodNotAllowedHttpException 错误