【发布时间】:2019-02-25 09:48:30
【问题描述】:
也许这只是我 Redux 知识中缺失的一条信息,但即使搜索了几个小时,我仍然不知道如何创建一个可重用的 reducer 来更新许多状态属性。
假设我创建了一个简单的组件MySwitch,它提供了一个用户界面来编辑布尔值。有一个相关的动作和一个reducer来更新状态。我了解如何使其适用于该州的特定财产。但是如何创建组件(和相关的减速器)以使用商店中的任何布尔值,而不为每个组件创建一个特殊的减速器?
假设,状态如下所示:
{
items: {
house: { isBig:true, location: ... },
car: { isMine:true, isBroken:false, ... }
},
books: [
{ id:1, available:true, title:... },
{ id:2, available:false, title:... }, ...
]
}
创建MySwitch 的各种实例以查看和编辑任何给定值(例如items.house.isBig、items.car.isMine 或books[1].available)并使用相同的reducer 更新它们的正确机制是什么?
我可以使用 connect 将属性注入到组件中,例如:
ASwitch = connect(state => ({
valueToEdit: state.items.car.isMine
})(MySwitch)
但我不知道如何将它传递给减速器以及如何让它更新状态的相应部分。我想我可以提供行动的路径(即"items.car.isMine"):
export const editBoolean = ( path, value ) => {
return {
type: 'BOOL_EDIT',
payload: { path, value }
}
}
然后在reducer中使用这样的东西:
case 'BOOL_EDIT': {
const { path, value } = action.payload;
return {
...state,
[path]: value
}
}
但它不起作用,似乎 ES6 不支持可变计算属性,而是创建了像 state["items.car.isMine"] 这样的属性。
我不知道如何在这里继续。感谢您的帮助。
【问题讨论】:
-
您的想法是对的,但您需要通过您的路径遍历状态树,以便使用更新的节点创建
nextState的浅表副本 -
好的,我可以做到(事实上,我已经准备好了一个遍历函数,因为我正在其他地方使用它)。我只是认为 Redux 中有更好的机制来做到这一点……
标签: javascript reactjs ecmascript-6 redux reducers