gpt4 book ai didi

javascript - 在 redux 中使用不可变 js(toJS 和 from JS)的正确方法

转载 作者:行者123 更新时间:2023-11-30 14:18:14 27 4
gpt4 key购买 nike

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

  1. 我在向 saga 发送数据时使用 toJS()
  2. 不在 reducer 中使用 fromJS() 因为我认为无论如何我使用 fromJS()对于初始状态。还是我错了?
  3. 我在 reselect 的选择器中使用了 toJS(),所以我可以在 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. saga——作为 redux 中间件——可以直接处理不可变类型,无需在此处使用昂贵的 toJS 调用

  2. 您要转换的任何点(例如 setsetInupdate 等)为普通 JS 非简单类型进入 Immutable redux 状态树,使用 fromJS 确保完全不可变类型 Make entire state tree immutable

  3. 恕我直言,选择器(例如 reselect)——通过在初始检索后提供内存——可能是使用昂贵的 toJS 调用的最理想的地方,如您的示例 #3 所示。我想这真的取决于人们有多不喜欢在他们的“容器/智能”组件中使用不可变检索方法,和/或创建一大堆选择器来从 redux 状态树中检索简单的 JS 类型 Use Immutable everywhere

对我来说,问题是在哪里实际使用 fromJS 调用,例如 Action 创建者,在“容器/智能”组件分派(dispatch)中,或者在 reducer 中,例如react-boilerplate 在 reducer 中使用 fromJS 调用。

关于javascript - 在 redux 中使用不可变 js(toJS 和 from JS)的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53186890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com