reux-form和不可变.js

redux-form and immutable.js

本文关键字:js 不可变 reux-form      更新时间:2023-09-26

使用不可变.js和 redux 形式时,是否有任何不需要调用.toJS()的方法?

我可以看到关于这个问题的建议方法是在将Map对象传递给表单之前调用.toJS()

getFormState: (state, reduxMountPoint) => state.get(reduxMountPoint).toJS()

这是否不会影响您从使用不可变.js和限制内存中获得的性能优势?

我很想知道这样做对性能的影响,是否仍然值得在表单繁重的应用程序中使用不可变.js?还有其他不依赖.toJS()的方法吗?

当我考虑 redux-form 的未来时,我一直在讨论是否在内部使用 ImmutableJS。我短暂地考虑了这样的想法,即我可以通过某种外观以某种方式获得相同的代码库来使用两者,但是,最终,接口太不同了,ImmutableJS接口由于不喜欢本地语言语法而更加冗长。

制作使用ImmutableJS的redux-form的替代版本几乎需要更改每一行代码,并且将是一场维护噩梦。

除非有人能向我证明使用ImmutableJS的性能优势超过了将.toJS()负担交给选择不使用ImmutableJS的人(大多数人?)的成本,否则我认为更好的做法是像Redux本身一样,对存储库保持不自以为是。

有没有其他不依赖.toJS()的方法?

所以,回答你的问题:不,如果管理你的 Redux reducer 的库需要普通的 javascript 对象,并且你正在为你的 Redux 存储使用 ImmutableJS,你必须自己进行转换。

希望有更好的答案...

编辑:Redux Form的版本6支持开箱即用的不可变JS。

正如Erik所提到的,不幸的是,Redux-Form还没有内置的解决方案,这部分是由于表单状态和模型状态是一起烘焙的,而不是单独的实体。

如果您可以分离表单和模型状态,那么允许您使用 Immutable.JS 的模块化解决方案变得更加可行。这就是我创建React-Redux-Form的原因。

以下是使用 React-Redux-Form 拥有一个不可变模型化简器的方法:

import { createStore, combineReducers } from 'redux';
import { createModelReducer } from 'react-redux-form/lib/immutable';
import Immutable from 'immutable';
const store = createStore(combineReducers({
  'user': createModelReducer('user', Immutable.Map())
}));
export default store;

如果你有一个表示模型的现有不可变化简器,则可以使用不可变modeled()修饰器来修饰它:

import { createStore, combineReducers } from 'redux';
import { modeled } from 'react-redux-form/lib/immutable';
// existing immutable reducer
import userReducer from '../reducers/user-reducer';
const store = createStore(combineReducers({
  'user': modeled(userReducer, 'user')
}));
export default store;

您可以通过从 redux-form/immutable 而不是 redux-form 导入来使用 redux-form 的"不可变"版本。
这是链接:http://redux-form.com/6.4.3/examples/immutable/