javascript - Redux - 如何从状态中删除 Prop ?

标签 javascript redux

我正在创建一个 React/Redux 应用程序来为 Angular 色扮演游戏制作 Angular 色,并且我希望能够在玩家状态中添加和删除技能。

我目前删除技能的方式如下:

const initState = {
    activeSkills: {},
    knowledgeSkills: {},
    skillPointsSpent: 0
}

const skillReducer = (state=initState, action) => {
    var {category, name} = action.parameter

    const actionsToTake = {
        ...//other actions

        DECREMENT_SKILL: () => {
            var newState;

            if(state[category][name].rating === 1) {
                newState = Object.assign(
                    {},
                    state,
                    {
                        skillPointsSpent: state.skillPointsSpent - 1
                    }
                );

                delete newState[category][name];
            }

            return newState
        },

        ...//other actions
    }

    return (actionsToTake[action.type] || actionsToTake.DEFAULT)();
}

我正在减少的状态应该看起来像这样,我正在尝试删除 Archery。因此类别将为 activeSkills,名称将为 Archery

state = {
    activeSkills: {
         Archery: {rating: 1, spec: 'Bow'}
    },
    knowledgeSkills: {},
    skillPointsSpent: 1
}

这显然是错误的做法,因为它改变了我之前的状态。那么从状态对象中删除属性的不可变方法是什么?

最佳答案

编辑

就像 @flup 链接中的更新一样,处理此问题的更好方法是使用一些对象解构。

if(state[category][name].rating === 1) {
    const { [name]: discard, ...newCategory } = state[category];
    newState = {
        ...state,
        [category]: {
            ...newCategory
        },
        skillPointsSpent: state.skillPointsSpent - 1
    }
}

原创

喜欢这个答案@flup linked to我所需要做的就是制作更深层次嵌套对象的副本,然后我可以删除该属性而不改变以前的状态。

if(state[category][name].rating === 1) {
    newState = Object.assign(
        {},
        state,
        {
            [category] : Object.assign(
                {},
                state[category]
            ),
            skillPointsSpent: state.skillPointsSpent - 1
        }
    );

    delete newState[category][name];
}

关于javascript - Redux - 如何从状态中删除 Prop ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36017896/

相关文章:

javascript - JQGrid 在标题栏中显示过滤器详细信息

javascript - 运行从 ecmascript 6 模块加载的函数

reactjs - React 和 Redux 新手,为什么我会传递一个未定义的存储?

javascript - Redux 中一个 action 依赖另一个 async action 怎么办?

java - 设置 AJAX 进度条

javascript - 获取数组中的所有元素?

javascript - Ajax 到 PHP 安全登录脚本

javascript - Redux-React 通过 mapDispatchToProps 方法传递对象

reactjs - 基于ajax请求渲染重定向组件

reactjs - 在react上使用redux的原因是什么?