为什么我的 reducer 没有使用 Immutable JS 更新我的存储状态?

Why does my reducer isnt updating my store state with ImmutableJS?

我的减速器中有这段代码

            const copy_states       = fromJS(state);

            const i_copy_jobs        = copy_states.get('calendar_jobs').get(s_from_day_key).get(s_dept_id).get(s_job_id);
            let i_calendar_removed   = copy_states.get('calendar_jobs').deleteIn([s_from_day_key,s_dept_id,s_job_id]);
            const newstate           = copy_states.toJS();

            console.log("BEFORE",state,newstate);

            return newstate;

所以我正在使用 Immutable.js,它的基本作用是复制状态,获取稍后将使用的复制值。然后删除该值并返回还原状态。

日志确认它确实删除了该值。我不明白的是,我在首页有一个按钮来检查状态是否已经改变。当我去点击按钮时,它说状态保持不变,依赖它的其他组件也是如此。

我的其他 reducer 工作得很好..我是否遗漏了一些关于如何使用 Immutable 的信息?

首先,你的代码(在我重构之后)

const copiedState = fromJS(state);
const copiedJobs = copiedState.getIn(['calendar_jobs', s_from_day_key, s_dept_id, s_job_id]);
const calendarRemoved = copiedState.deleteIn(['calendar_jobs', s_from_day_key,s_dept_id,s_job_id])
const newState = copiedState.toJS();
return newState;

不会导致不同的状态,因为对 copiedState 的任何操作都不会改变它。在应用您在不可变对象上声明的方法后,对不可变对象(在您的情况下为 copiedState)的任何操作 returns 一个新对象。因此 copiedStatenewState 中的值将完全相同,这就是您看不到变化的原因。即您的日志 console.log("BEFORE",state,newstate); 应该显示它们完全相同。

所以你想做的是:

const copiedState = fromJS(state);
const copiedJobs = copiedState.getIn(['calendar_jobs', s_from_day_key, s_dept_id, s_job_id]);
const calendarRemoved = copiedState.deleteIn(['calendar_jobs', s_from_day_key,s_dept_id,s_job_id]);
const newState = calendarRemoved.toJS();
return newState;