React Redux:无法在不可变的记录上设置

时间:2019-02-14 03:04:34

标签: reactjs redux immutable.js

我正在尝试从我的reducer更新我的redux模型。该模型是Immutable Record类的扩展。我正在尝试使用set方法更新Record:

import { List, Record } from 'immutable';
import { IFaqItem } from './api.models';

export interface IFaqsState {
  loading?: boolean;
  items?: List<IFaqItem>;
}
const faqsState = Record({
  loading: false,
  items: List()
});

class FaqsState extends faqsState implements IFaqsState {
  loading: boolean;
  items: List<IFaqItem>;

  with(props: IFaqsState) {
    this.set('loading', props.loading);
    return this;
  }
}

export default FaqsState;

reducer包含以下内容:

case ActionTypes.FAQS_GET_AJAX_RECEIVE:
  let response: IFaqsGetResponse = action.payload.response && action.payload.response.response;
  return state.with({
    loading: false,
    items: List(response)
  });

但是这给了我以下错误:

Error: Cannot set on an immutable record.

更新

当我从以下方式更换减速器时:

let initial = new FaqsState();

const faqsReducer: Reducer<FaqsState> = (state = initial, action: AppActions) => {

收件人:

const faqsReducer: Reducer<FaqsState> = (state = null, action: AppActions) => {

  state = new FaqsState();

它似乎有效。当我将初始状态作为参数输入时,为什么它不起作用?

4 个答案:

答案 0 :(得分:0)

嗯,它是不可变。调用{CODE => FORMAT}函数时,您对对象进行了突变,从而违反了它的唯一约束。
为避免这种情况,您应该使用新值创建一个新实例,并将其返回到商店。

答案 1 :(得分:0)

只需:

with(props: IFaqsState) {
  return this.set('loading', props.loading);
}

答案 2 :(得分:0)

尝试使用以下方法更新减速器 定义状态

let initialState = {
   // Create an immutable object 
   list: { loading: true, list: []}
};

然后在开关盒中

case ActionTypes.FAQS_GET_AJAX_RECEIVE:
    let response: IFaqsGetResponse = action.payload.response && 
    action.payload.response.response;
    return {...initialState.list, loading: false, items:List(response)}

答案 3 :(得分:0)

在更新中,每当调用reducer时,都会创建一个新的state = new FaqsState();

在先前的实现中,let initial = new FaqsState();是一次创建的,并且在化简函数的作用域外,因此,相同的引用/记录被循环用于化简的每个后续调用。首次调用该化径器时,initial为空,可以用with进行调用以设置initial的值,但是之后,initial的值已经是设置,然后在化简器上进行的第二次调用将尝试“覆盖” initial的值,从而导致异常。

但是,为了简洁和正确起见,我建议您对此签名

const faqsReducer: Reducer<FaqsState> = (state =(new FaqsState()), action: AppActions) => {

因为更新后的reducer无法获得以前的状态值。