Javascript 将突变应用于嵌套映射和干映射
我们一直在使用React+Redux+Immutable JS开发SPA。 我们的Redux状态包含17个具有完全相同结构的映射(目前,但承诺会增长){page,pages,sortBy,items,…},我们希望避免复制粘贴缩减器(和测试),下面是一个简单的示例:Javascript 将突变应用于嵌套映射和干映射,javascript,redux,immutable.js,Javascript,Redux,Immutable.js,我们一直在使用React+Redux+Immutable JS开发SPA。 我们的Redux状态包含17个具有完全相同结构的映射(目前,但承诺会增长){page,pages,sortBy,items,…},我们希望避免复制粘贴缩减器(和测试),下面是一个简单的示例: state = fromJS({ pageA: { tableA1: {loading:..., page:...., pages:..., items:...}, tableA2: {loa
state = fromJS({
pageA: {
tableA1: {loading:..., page:...., pages:..., items:...},
tableA2: {loading:..., page:...., pages:..., items:...}
},
pageB: {
tableB1: {loading:..., page:...., pages:..., items:...},
tableB2: {loading:..., page:...., pages:..., items:...}
}
});
// reducers:
setLoadingTableA1 = state => state.setIn(['pageA', 'tableA1', 'loading'], true);
setLoadingTableA2 = state => state.setIn(['pageA', 'tableA2', 'loading'], true);
setLoadingTableB1 = state => state.setIn(['pageB', 'tableB1', 'loading'], true);
setLoadingTableB2 = state => state.setIn(['pageB', 'tableB2', 'loading'], true);
显然,所有四个减速器均可更换为可重复使用的减速器,例如:
composeSetLoading=selector=>state=>selector(state).set('load',true)代码>
用法:
selectPageATable1 = state => state.getIn(['pageA', 'tableA1']);
// ^^^ It works only for mapping data from state to props
// Unfortunately, it can't be used for composing reducers
setLoadingTableA1 = composeSetLoading(selectPageATable1);
其他好处:composeSetLoading
需要测试一次setLoadingTableA1
也可在@connect
上重用:
@connect(state => ({loading : selectPageATable1(state).get('loading')}))
class TableA1 extends React.Component {...}
有没有可能实现这一点?如有任何建议/想法,我将不胜感激
更新一:
我知道Map.updateIn(…,updater)代码>,它是不同的。它允许移出state=>state.set('loading',true)
,但我们正在寻找一种移出选择器的方法
更新二:
我尝试过使用Map.updateIn(…,updater)代码>不幸的是,它不够好,因为在大多数情况下,更新程序
应该提供旧状态和一些数据。。。因此,唯一的方法是每次创建一个新函数:
setItemsTableA1 = (state, items) => state.updateIn(['pageA','tableA1'], state => state.set('items', items));