Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将突变应用于嵌套映射和干映射_Javascript_Redux_Immutable.js - Fatal编程技术网

Javascript 将突变应用于嵌套映射和干映射

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

我们一直在使用React+Redux+Immutable JS开发SPA。 我们的Redux状态包含17个具有完全相同结构的映射(目前,但承诺会增长){page,pages,sortBy,items,…},我们希望避免复制粘贴缩减器(和测试),下面是一个简单的示例:

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));