使用reducer更新Redux中的特定状态

时间:2019-03-04 10:19:18

标签: javascript redux react-redux

我想知道,如何更新状态中的特定值。我有状态配置,我想更新“偏移”值而不修改限制或总值,只需使用this.props.setParams()...设置新偏移即可。

使用此功能,我想修改offset this.props.setParams({offset:10}),或限制this.props.setParams({limit:40}),依此类推...只需发送一个参数并直接修改关联状态。

searchList.js

this.props.setParams({ offset: 10})

actions-search.js

export function setFilters(newFilters) {
    return {
        type   : SEARCH.SET_NEW_FILTERS,
        payload: newFilters
    };
}

export function setParams(newParams) {
    return {
        type   : SEARCH.SET_NEW_PARAMS,
        payload: newParams
    };
}

reducer-search.js

...

    /*State : CONFIG*/
    /*config: {
        filters : {
            ...
        }
        params: {
            offset: 0,
            limit: 25,
            total: 100
        }
    }*/

case SEARCH.SET_NEW_FILTERS :
    let newFilters = action.payload;

    return {
        ...state,
        config: {
            ...state.config,
            filters : {
                ...state.config.filters,
                newFilters
            }
            params : {
                ...state.config.params
            }
        }
    };
case SEARCH.SET_NEW_PARAMS :
    let newParams = action.payload; // {offset: 10}

    return {
        ...state,
        config: {
            ...state.config,
            filters : {
                ...state.config.filters
            }
            params : {
                ...state.config.params,
                newParams
            }
        }
    };
....

目前,我必须写这个:

return {
    ...state,
    config: {
        ...state.config,
        params : {
            ...state.config.params,
            offset : newParams.offset
        }
    }
};

如何在我的减速器中使用更多“通用”产品?没有指定特定的属性,而是更全局的。

只需在我的动作创建者中发送一个对象“ params”,例如:this.props.setParams({offset:30,total:120})?

1 个答案:

答案 0 :(得分:2)

实际行为

您的代码正在添加newFiltersnewParams作为属性。这样,您将必须以以下方式访问offset

state.config.params.newParams.offset

解决方案

要直接使用这些新的过滤器或参数

state.config.params.offset

您应该使用spread syntax newFilters在减速器中传播newParams...

            filters : {
                ...state.config.filters,
                ...newFilters
            }

            params : {
                ...state.config.params,
                ...newParams
            }

spread语法将分别将有效负载newFiltersnewParams的内部属性添加(或替换)到state.config.filtersstate.config.params的属性中。

改进

要简化减速器,您可以直接传播action.payload并删除一些可能不必要的传播:

actions-search.js

...

case SEARCH.SET_NEW_FILTERS :
    return {
        ...state,
        config: {
            ...state.config,
            filters : {
                ...state.config.filters,
                ...action.payload
            }
        }
    };
case SEARCH.SET_NEW_PARAMS :
    return {
        ...state,
        config: {
            ...state.config,
            params : {
                ...state.config.params,
                ...action.payload
            }
        }
    };
...