当前位置: 首页 > 知识库问答 >
问题:

如何将不可变.js与 redux 一起使用?

谢鸿飞
2023-03-14

Redux framework正在使用reducers来更改应用程序状态以响应操作。

关键要求是缩减器不能修改现有的状态对象;它必须产生一个新的对象。

错误示例:

import {
    ACTIVATE_LOCATION
} from './actions';

export let ui = (state = [], action) => {
    switch (action.type) {
        case ACTIVATE_LOCATION:
            state.activeLocationId = action.id;
            break;
    }

    return state;
};

好例子:

import {
    ACTIVATE_LOCATION
} from './actions';

export let ui = (state = [], action) => {
    switch (action.type) {
        case ACTIVATE_LOCATION:
            state = Object.assign({}, state, {
                activeLocationId: action.id
            });
            break;
    }

    return state;
};

这是一个很好的Immutable.js.用例

共有3个答案

宗政博文
2023-03-14

如果您只是在寻找一种简单的方法来进行没有突变的更新,我维护了一个库:https://github.com/substantial/updeep在我看来,这是使用redux做到这一点的好方法。

updeep允许您使用常规(冻结)对象层次结构,因此您可以执行销毁、查看日志和调试器中的对象等。它还具有强大的API,允许批量更新。它不会像“不可变”那样高效。js用于大型数据集,因为如果需要,它会克隆对象。

这里有一个例子(但更多信息请查看自述文件):

import {
    ACTIVATE_LOCATION
} from './actions';
import u from 'updeep';

export let ui = (state = [], action) => {
    switch (action.type) {
        case ACTIVATE_LOCATION:
            state = u({ activeLocation: action.id }, state);
            break;
    }

    return state;
};
徐君植
2023-03-14

不可变.js应根据需要在每个化简器中使用,例如

import {
    ACTIVATE_LOCATION
} from './actions';

import Immutable from 'immutable';

export let ui = (state, action) => {
    switch (action.type) {
        case ACTIVATE_LOCATION:
            state = Immutable
                .fromJS(state)
                .set('activeLocationId', action.id)
                .toJS();
            break;
    }

    return state;
};

然而,在这个例子中有很多开销:每次调用reducer动作时,它都必须将JavaScript对象转换为不可变的实例,对结果对象进行变异,然后将其转换回JavaScript对象。

更好的方法是将初始状态设置为Immutable的实例:

import {
    ACTIVATE_LOCATION
} from './actions';

import Immutable from 'immutable';

let initialState = Immutable.Map([]);

export let ui = (state = initialState, action) => {
    html" target="_blank">switch (action.type) {
        case ACTIVATE_LOCATION:
            state = state.set('activeLocationId', action.id);
            break;
    }

    return state;
};

这样,您只需要将初始状态转换为不可变盎司的实例。然后,每个化简器都会将其视为不可变的实例,并将其作为不可变的实例传递下去。问题是,现在您需要在将值传递给视图上下文之前将整个状态转换为 JavaScript。

如果您在一个reducer中执行多个状态突变,您可能想要考虑使用< code >来批处理突变。带有突变。

为了让事情变得更简单,我开发了一个redux不可变库。它提供了组合减少器函数,相当于redux包中同名函数,只是它期望初始状态和所有减少器都可以使用Immutable.js对象。

姚钊
2023-03-14

以Immutable为例

import {
    ACTIVATE_LOCATION
} from './actions';

import { Map } from 'immutable';

const initialState = Map({})

export let ui = (state = initialState, action) => {
  switch (action.type) {
    case ACTIVATE_LOCATION:
      return state.set('activeLocationId', action.id);
    default:
      return state;
  }
};
 类似资料:
  • 我给你的是不可变的。试试看。我需要的是能够指定一个类,所以我定义了 由immutables生成的生成器不接受此选项 因为它需要一门课 用@Value注释类型。参数很好地创建了一个有效的方法 但结果是一个实例,而不是一个生成器,因此只能使用withers设置后续值。

  • 我想在gradle中使用JMH,一个OpenJDK微基准工具。然而,我得到了关于编译的NPE。另一方面,JMH在使用maven时可以工作。 我没有发布任何,因为它是基本的-应用java插件并添加对JHM工具的依赖()。 我试过这里写的东西,但没有成功。 我还需要做什么?我想设置一个代理,但我还是没有弄清楚。 例外情况:

  • 问题内容: 我正在尝试使用lodash 以这种方式在指令中使用它: 存在: 但是不起作用,因此,没有任何 重复 。如果我将指令更改为它将起作用。 通过已经包含在之前 。我该如何运作? 问题答案: 我更喜欢在全局范围内引入“ _”并且可以注入以进行测试。

  • 我是一个新手程序员。我一直在制作一个非常小的网站。我没有遇到什么错误。我找到了一些解决办法。但我还没有得到答案。 如果你不介意,请给我你的触摸。T^T 我连接了节点。js with Mysql'GET正在运行,没有任何问题。但是“POST”部分无法获取我在网页上键入的一些数据。 我想知道的是,为什么“POST”无法获取数据。 错误消息 TypeError:无法读取应用程序中未定义的属性“name”

  • 我通常在设置配置文件后使用AWS CLI命令,使用环境变量,使用文件。这很有效。 我目前正在尝试通过环境变量设置访问权限。为此,我在文件-我从凭证文件中复制了和条目,并将它们放在我的文件中,名称为和。 环境变量正在被正确设置,然而,当我试图访问AWS资源时(在这种情况下,我试图在桶上运行一个S3命令,所以区域并不重要),我得到了消息 这对我来说很奇怪,因为钥匙是完全一样的。为了确认这一点,我切换到

  • 我正在使用mat-table,并试图将MatTableDataSource与observable一起使用(我从web服务获取数据),但我不知道如何将MatTableDataSource配置为使用observable而不是数组。 这个问题的唯一解决方案是订阅ngOnInit方法中的observable并在新数据到达时始终创建新的MatTableDataSource吗?