Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React/Redux/Immutable.js-不可变操作(错误:操作必须是普通对象)_Javascript_Reactjs_React Redux_Immutable.js - Fatal编程技术网

Javascript React/Redux/Immutable.js-不可变操作(错误:操作必须是普通对象)

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

我正在使用React with Redux和Immutable.js-我的状态由不可变对象组成,工作正常

现在,我正试图使我的操作成为不可变对象,而不是普通的Javascript对象

我的还原器和动作创建者工作正常,所有的单元测试都通过了,但是当我尝试在React组件中使用不可变的动作对象时,我会得到一个错误,因为我的动作对象是不可变的映射(而不是普通的javascript对象)

以下是我的行动:

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);
    }
};