Javascript 为什么我的reducer没有用ImmutableJS更新我的存储状态?

Javascript 为什么我的reducer没有用ImmutableJS更新我的存储状态?,javascript,reactjs,immutability,Javascript,Reactjs,Immutability,我的减速机里有这个代码 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('calend

我的减速机里有这个代码

            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,它的基本功能是复制一个state,得到一个复制的值,稍后将使用它。然后删除该值并返回简化状态

日志确认它确实删除了该值。我不明白的是,我在头版有一个按钮来检查状态是否发生了变化。当我点击按钮时,它说状态保持不变,其他依赖它的组件也保持不变

我的其他减速器工作得很好。。我是否遗漏了一些关于如何在此处使用Immutable的信息?

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

不会导致不同的状态,因为对
copiedState
的任何操作都不会对其进行变异。对不可变对象的任何操作(在您的例子中是
copiedState
)都会在应用您在不可变对象上声明的方法后返回一个新对象。因此,
copiedState
newState
中的值将完全相同,这就是您没有看到更改的原因。i、 e您的日志
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;

因此,如果我理解正确的话,当您单击该按钮时,reducer中的console.log会确认正在更新的状态,但渲染的输出不会更改。好奇。可能需要显示包含按钮的组件的代码。这可能是组件的工作方式有问题connected@kingdaroreducer中的控制台日志(来自代码)告诉我newstate已使用“deleteIn”函数删除了该值。所以我返回它来更新存储状态。一切都很好,但我的头版没有看到任何变化。我用来检查状态的按钮显示我的状态仍然处于预删除状态,因此我的所有组件都保持不变。减速器之间会有什么阻碍它更新状态?谢谢您的回复。顺便说一句,这可能是与首页组件连接到redux的方式有关的问题。你能展示一下首页组件的代码吗?让我把代码重构成这个。我会让你知道的。非常感谢您抽出时间。谢谢你,成功了!我误用了immutable.js。任何函数调用都必须接收到变量中。简单地调用它,获取变量本身不会引起任何更改。非常感谢你!
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;