我想知道这是否是immutable.js
与 redux 和reselect
(也redux-saga
)一起使用的正确方法。具体来说,我想知道如何使用它们toJS()
以及从fromJS()
哪里使用它们。我的想法是:
- 我
toJS()
在向传奇发送数据时使用。 - 我不在
fromJS()
reducer 中使用,因为我认为它是通过我fromJS()
用于 initialState的事实来完成的。还是我错了? - 我
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 docs你应该):
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 和不可变之间的正确转换流程。或者可以以某种方式进行优化(更少的转换步骤)?也许以上是一种非最佳的逻辑方式?
最好的祝福