Javascript 在POJO状态下使用redux时,如何最小化减速机样板?

Javascript 在POJO状态下使用redux时,如何最小化减速机样板?,javascript,reactjs,redux,Javascript,Reactjs,Redux,我在为Redux编写减缩器方面面临困难。具体来说,我最终在.map、.slice等中包装了大量状态操作。当我的状态对象的结构变大时,还原程序变得难以读取,函数包装函数等 我不想使用Immutable.js,因为我想尽可能长时间地坚持使用简单的POJO 我试过使用和libs,它们都很棒。但通常我最终需要在我的减速机中占用大量的状态空间 我编写了一个小实用程序来帮助创建一个新状态: var path=require('immutable-path')。path; 让状态={ 第1级:{ 第21级

我在为Redux编写减缩器方面面临困难。具体来说,我最终在.map、.slice等中包装了大量状态操作。当我的状态对象的结构变大时,还原程序变得难以读取,函数包装函数等

  • 我不想使用Immutable.js,因为我想尽可能长时间地坚持使用简单的POJO
  • 我试过使用和libs,它们都很棒。但通常我最终需要在我的减速机中占用大量的状态空间
  • 我编写了一个小实用程序来帮助创建一个新状态:
var path=require('immutable-path')。path;
让状态={
第1级:{
第21级:{
级别3:3
},
第22级:[{
id:1,
瓦尔:1
}, {
id:2,
瓦尔:2
}]
}
};
让newState=path(状态为'level1.level22[id=1].val',x=>x+10);
它提供了一个新的状态,保持原始状态不变。未修改的对象和数组的引用保持不变(==比较为true)

有人能告诉我,我是否缺少一种使用es6语法执行相同结果的更简单方法?还是另一个更好的社区来获得同样的好处


感谢您的时间和专业知识。

我建议您将减速器拆分为更小的功能

下面是四个函数,每个函数依次处理状态的一小部分。(尽管在每种情况下,第一个参数称为state,但每次都不同)。然而,行动总是一样的

我还没有检查这段代码的正确性,但我希望你能理解

function reducerTop(state, action) {
    switch (action.type) {
        case SET_VAL:
            return Object.assign({}, state, {
                [action.topLevel]: reducerNext(state[action.topLevel], action);
            });
    }
    return state;
}

function reducerNext(state, action) {
    switch (action.type) {
        case SET_VAL:
            return Object.assign({}, state, {
                [action.nextLevel]: reducerArray(state[action.nextLevel], action);
            });
    }
    return state;
}

function reducerArray(state, action) {
    switch (action.type) {
        case SET_VAL:
            const index = state.findIndex((item) => item.id === action.id);
            if (index > -1) {
                return [
                    ...state.slice(0, index),
                    reducerFinal(state[index], action),
                    ...state.slice(index + 1)
                ];
            }
    }
    return state;
}

function reducerFinal(state, action) {
    switch (action.type) {
        case SET_VAL:
            return Object.assign({}, state, {
                value: action.value
            });
    }
    return state;
}

我认为这是redux本身的问题——它只是太低级了,有些事情(比如嵌套更新)应该更简单。此外,我相信将所有业务逻辑放入操作创建者中是没有问题的,而内部还原器只是更新我们的状态(并在需要时执行嵌套更新)

在我看来,还有一件不必要的事——常数。我们通常有一些包含所有redux实体的对象(例如,reducer),我认为它应该足以计算出所有需要的常量

基于这种想法,我编写了一个库,它正是这样做的——基于给定的类型,它为您创建常量,处理异步函数,并创建还原程序。因此,典型的API请求如下所示:

import { createTile } from 'redux-tiles';
const requestTile = createTile({
  type: ['api', 'request'],
  fn: ({ api, params }) => api.get('/items', params),
});

它将创建所有常量、减缩器,还将处理失败、成功和加载状态。您可以使用redux tiles查看完整的HNAPI示例。您可能会发现嵌套,它会自动更新所有内容,您只需返回一个值数组就可以进行嵌套。

谢谢!我试图避免这种代码,但它的优点是减少了给定操作所需的减缩器的数量。我现在发布的原始示例代码中存在大量的疏忽。我忘了保留该州未被开发的部分。现在,我已经通过使用Object.assign和数组切片/展开纠正了这一点。