【发布时间】:2019-04-10 17:32:27
【问题描述】:
我想知道这是否是将immutable.js 与redux 和reselect(也称为redux-saga)一起使用的正确方法。具体来说,我想知道toJS() 和fromJS() 以及在哪里使用它们。
我的想法是:
- 我在向 saga 发送数据时使用
toJS()。 - 我不使用
fromJS()在reducer 中,因为我认为无论如何我使用fromJS()来表示initialState。还是我错了? - 我在
reselect的选择器中使用toJS(),所以我可以在反应组件中使用js 数据。
例子:
1) 在我的反应组件中,我这样做:
// 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 和不可变之间的正确转换流程。或者它可以以某种方式优化(更少的转换步骤)?也许以上是一种非最佳的逻辑方式?
最好的问候
【问题讨论】:
标签: javascript reactjs redux immutable.js