我正在使用React和Redux来完成我当前的项目.
我有一个像这样的状态对象:
state: {
reducerOne: {
keyOne: valueOne,
keyTwo: valueTwo
}
reducerTwo: {
keyThree: valueThree
keyFour: valueFour
}
}
假设valueFour是一个对象数组.我使用valueFour数组在render方法中映射一堆React元素:
this.props.valueFour.map(()=> <div/>)
(显然以上是简化的,但我想表明的是我渲染了一堆元素)
现在,我想只更新上述元素中的一个.在我的action / reducer代码中,我返回整个valueFour数组,在这样的函数中更新了1个元素:
行动代码
export function updateThingInArray(elementId){
return (dispatch, getState) => {
const myArray = getState().reducerTwo.keyFour
for (let i=0; i < myArray.length; i++) {
if (myArray[i].id === elementId){
const result= [
...myArray.slice(0,i),
Object.assign({},
myArray[i],
{field:newValue}),
...myArray.slice(i+1)
]
dispatch(update(result))
}
}
}
}
减速机代码:
export default handleActions({
[UPDATE]: (state,{payload}) => Object.assign({},state, {keyFour: payload})
},{
keyThree:{},
keyFour:{}
})
(我的reducer代码使用库redux-actions)
我希望这一切都有道理.如果没有请问,我会澄清.
但我的问题是,因为keyFour在整个技术上更新了整个阵列,这是否意味着所有我的元素都会更新,即使只有1个有新数据?如果是这样,有没有更有效的方式来实现我目前正在做的事情?
最佳答案 将再次调用render方法,这意味着它将再次映射该数组.您可以查看chrome中的元素选项卡,您可以看到闪烁的html,它是更改的部分.如果组件具有相同的数据和相同的键,则不会更改实际的html,但会在子项中调用render方法.
编辑:没有意识到你正在更新嵌套密钥,React只检查浅平等:https://facebook.github.io/react/docs/shallow-compare.html