Javascript React/Redux/Immutable.js-不可变操作(错误:操作必须是普通对象)
我正在使用React with Redux和Immutable.js-我的状态由不可变对象组成,工作正常 现在,我正试图使我的操作成为不可变对象,而不是普通的Javascript对象 我的还原器和动作创建者工作正常,所有的单元测试都通过了,但是当我尝试在React组件中使用不可变的动作对象时,我会得到一个错误,因为我的动作对象是不可变的映射(而不是普通的javascript对象) 以下是我的行动:Javascript React/Redux/Immutable.js-不可变操作(错误:操作必须是普通对象),javascript,reactjs,react-redux,immutable.js,Javascript,Reactjs,React Redux,Immutable.js,我正在使用React with Redux和Immutable.js-我的状态由不可变对象组成,工作正常 现在,我正试图使我的操作成为不可变对象,而不是普通的Javascript对象 我的还原器和动作创建者工作正常,所有的单元测试都通过了,但是当我尝试在React组件中使用不可变的动作对象时,我会得到一个错误,因为我的动作对象是不可变的映射(而不是普通的javascript对象) 以下是我的行动: export const cancel = () => { return Immut
export const cancel = () => {
return Immutable.Map({
type: ACTION_TYPES.get('CANCEL')
})
}
我的减速机是这样的(在单元测试时工作,但由于错误,React从不调用它):
以下是测试组件时出现的错误:
FAIL src/App.test.js
● Test suite failed to run
Actions must be plain objects. Use custom middleware for async actions.
我需要添加什么中间件才能使Immutable.js对象作为操作工作?我在文档中找不到它
我需要添加什么中间件才能使Immutable.js对象作为操作工作?我在文档中找不到它
如果要构建自定义行为,则需要自己构建中间件。大概是这样的:
import { isImmutable } from 'immutable';
// Allows immutable objects to be passed in as actions. Unwraps them, then
// forwards them on to the reducer (or the next middleware).
const immutableMiddleware = store => next => action => {
if (isImmutable(action)) {
next(action.toJS())
} else {
next(action);
}
};
也就是说,我真的不知道作为不可变对象执行操作有什么好处。动作通常是在需要的时候创建的,并且永远不会被再次访问,所以保护它不受突变的影响几乎从来都不是一个问题。您通常不会克隆它们,因此immutablejs在从旧对象创建新的不可变对象时提供的性能优势将无法实现。您可能需要编写自己的中间件。我不认为将操作作为不可变映射有足够的好处,大多数开发工具和其他库都希望操作作为普通对象
import { isImmutable } from 'immutable';
// Allows immutable objects to be passed in as actions. Unwraps them, then
// forwards them on to the reducer (or the next middleware).
const immutableMiddleware = store => next => action => {
if (isImmutable(action)) {
next(action.toJS())
} else {
next(action);
}
};