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.用例
如果您只是在寻找一种简单的方法来进行没有突变的更新,我维护了一个库: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;
};
不可变.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对象。
以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吗?