在Redux上使用Immutablejs(toJS和fromJS)的正确方法

时间:2018-11-07 09:43:36

标签: javascript reactjs redux immutable.js

我想知道这是否是将immutable.js与redux和reselect(以及redux-saga)一起使用的正确方法。我特别想知道toJS()fromJS()的来源以及在哪里使用它们。 我的想法是:

  1. 我将toJS()发送到传奇时使用。
  2. 不要在简化程序中使用 fromJS(),因为我认为无论如何都可以通过将fromJS()用于initialState来完成。还是我错了?
  3. 我在toJS()的选择器中使用了reselect,因此可以在react组件中使用js数据。

示例:

1)在我的react组件中:

// mapDispatchToProps
   function mapDispatchToProps(dispatch) {
      return {
         loginRequest: values => dispatch(loginRequest(values)),
      };
   }

// Sending values.toJS() to my redux-saga. 
   submit = values => {
      this.props.loginRequest(values.toJS());
   };

2)我在reducer中做(应该在这里不使用fromJS()吗?根据redux文档,您应该使用):

const { fromJS } = require('immutable');
const state = fromJS({
  pages: {
    usersPage: {
      loading: false,
      isFetched: false,
      list: [],
    }
  }
});
function reducer(state, action) {
  switch(action.type) {
    case 'USERS_LOADED':
      return state
        .setIn(['usersPage', 'list'], action.payload) // fromJS() here or not?
        .setIn(['usersPage', 'isFetched'], true)
        .setIn(['usersPage', 'loading'], false)
        ;
    default:
      return state;
  }
}
export default reducer;

3)在选择器中,我再次执行toJS()

const selectUser = state => state.get('user', initialState);
const makeSelectList= () =>
   createSelector(selectUser, userState => userState.getIn(['usersPage', 
'list']).toJS());

// Which I then use in my react component:
const mapStateToProps = createStructuredSelector({
   list: makeSelectList(),
});

所以基本上我想知道这是否是js和不可变之间的正确转换流程。还是可以某种方式对其进行优化(转换步骤更少)?也许以上是一种非最佳的逻辑方式?

最好的问候

1 个答案:

答案 0 :(得分:2)

  1. 作为传奇的Redux中间件,可以直接处理不可变类型,而无需在此处使用昂贵的all调用

  2. 您要转换的任何点(例如toJSsetsetIn等)都将普通的JS非简单类型转换为不可变的redux状态树,请使用{ {1}}以确保完全不可变的类型Make entire state tree immutable

  3. 恕我直言,选择器(例如update)(通过在初始检索后提供备忘录)可以成为使用昂贵的fromJS调用的最理想的地方,如您的示例# 3。我想这真的取决于有多少人不喜欢在其“容器/智能”组件中使用不可变的检索方法,和/或创建一堆选择器以从redux状态树Use Immutable everywhere

对我来说,存在一个问题,即在哪里实际使用reselect调用,例如动作创建者,在“容器/智能”组件中调度,或者在简化器中,例如toJS在reducer中使用fromJS调用。