为什么我的 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 一个新对象。因此 copiedState
和 newState
中的值将完全相同,这就是您看不到变化的原因。即您的日志 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;
我的减速器中有这段代码
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 一个新对象。因此 copiedState
和 newState
中的值将完全相同,这就是您看不到变化的原因。即您的日志 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;