javascript - ...state 究竟做了什么?
问题描述
我正在 Angular 中尝试 NgRx (redux),...state
在下面的示例中,我无法完全理解。我搜索了它并通常将其理解为传播,但不确定为什么在reducer 的块Interface State
中重复数据属性,因为 ... 无论如何都会传播它们?谁能帮我理解这一点?return{}
switch
export interface State {
sessionData: Map<string, string>;
requesting: boolean;
hasError: boolean;
status: StatusModel;
}
export function sessionReducer(state: State = INITIAL_STATE, action: Session.Actions): State {
switch (action.type) {
case Session.REQUEST_SESSION_DATA:
return {
...state,
requesting: true,
hasError: false,
status: undefined,
};
}
}
PS:我已经查看了这里的线程,并且通常认为传播正是这样做的,传播了。但这里是在 Redux/NgRx 的上下文中,试图理解为什么return{}
has...state
和三个附加属性。
解决方案
状态的要点是它是不可变的(返回一个新对象,而不是修改后的对象)。所以,如果你想修改状态添加新值,你需要返回当前状态加上你想添加到前一个状态的新值。在使用扩展运算符的示例中...
,您将返回一个新的不可变对象,该对象包含先前的状态以及三个新属性requesting
和。你可以考虑这样做:hasError
status
export function sessionReducer(state: State = INITIAL_STATE, action: Session.Actions): State {
switch (action.type) {
case Session.REQUEST_SESSION_DATA:
state.requesting = true;
state.hasError: false;
state.status: undefined;
return state;
}
}
但是你不能这样做,因为你打破了状态的哲学,新的不可变对象而不是修改过的对象:)
在您的示例中,我们需要知道它INITIAL_STATE
是如何初始化的,但我认为它只包含sessionData
属性。因此,在该示例中,您将返回sessionData
加上剩余的属性。
在下面的链接中,您可以看到扩展运算符是 Redux 世界中常用的运算符,用于将当前状态作为新对象返回(它是 React 的 Redux 示例,但它在 Angular 中的工作方式完全相同)。
Redux
在 Angular 中,使用带有更改检测策略的模式是一种非常常见的模式OnPush
,因为您告诉 Angular 只检查组件中的参考更改,@Input
而不是逐个比较对象的属性。这是性能上的一大优势。
推荐阅读
- apache - 使用 Raspbian 和 Apache 的反向代理
- r - 在同一个 dplyr 管道中读取文件并设置文件名
- python - Python plt.show 显示一个空白图
- python - cx_Freeze: LookupError: 未知编码: cp437
- python-3.7 - pyrcc5:没有这样的文件或目录
- android - 如何使用firebaseAuth从firebase获取当前活动的android应用用户电子邮件
- regex - 使用 grep 和 regex 从仅包含一种元音的文件中提取单词
- javascript - 使用 url 设置活动导航选项卡的 Jquery 函数选择的数量超出了应有的范围
- amazon-ec2 - 无需重启或分离/附加 AWS ec2 实例中的卷即可替换密钥对
- python - 为什么背景在我不动的情况下滚动?