如何在 NGXS 中使用 patchState 与 setState?

Posted

技术标签:

【中文标题】如何在 NGXS 中使用 patchState 与 setState?【英文标题】:How to use patchState vs setState in NGXS? 【发布时间】:2018-10-31 22:38:49 【问题描述】:

我正在学习 ngxs,但我不明白什么时候应该使用 patchStatesetState?有什么区别?

const state = ctx.getState();
let data =  this.service.list();
ctx.setState(
    ...state,
    feedAnimals: data
);

对比

let data =  this.service.list();
ctx.patchState(
    feedAnimals: data
);

【问题讨论】:

【参考方案1】:

它不能正常工作

const state = context.getState();
state.permissions = action.payload;
context.setState(state);

它工作正常

const state = context.getState();
state.permissions = action.payload;
context.setState( ...state );

它工作正常

const state = context.getState();
state.permissions = action.payload;
context.patchState(state);

所有的例子都更新了状态...但是第一个例子并没有激活 observable 来改变状态,因为状态是不可变的,这意味着你不能简单地编辑它并保存它,它不可编辑,您始终必须克隆旧状态,编辑新副本并保存此新状态。 patchState 只为你做。

【讨论】:

天哪!我已经在第一个问题上苦苦挣扎了一个小时。希望我能给你 10 票来指出这一点。它是一个错误还是它应该如何工作? 由于某种原因这不起作用:context.setState(...state, someProp: action.payload)。你能解释一下为什么吗?文档上就是这样 ...state, ...someProp: action.payload 试试这个 @dasfdsa 是的,它应该是这样工作的。 NGXS 检测状态对象身份的变化。当分配给state 的对象更改时,标识会更改。因此,如果我执行state.property = 'some new value;,那么即使state 已被修改,它仍然是同一个变量。如果我执行state = 并将其传递给setState(),那么它将注册为更改。【参考方案2】:

这两段代码是等价的。 patchState 只是 setState(...state, ... 代码的简写版本。

在未来,patchState 很可能会演变为一个更有用的不变性助手,包括相等测试(即,只有在补丁实际更改任何值时才会更改状态)和补丁运算符(这仍在讨论中)。

我建议使用 patchState 以保持整洁并利用即将推出的功能。

【讨论】:

感谢您的回复!但是在源代码 [link] (github.com/ngxs/store/blob/…) patchState 中克隆对象。性能怎么样? 阅读关于性能不变性的好处。与在每个更改检测周期中遍历变异对象以检查更改相比,克隆对象并不昂贵。在 YouTube 上查找 Performance Tuning Angular,那里有很多很棒的视频(我推荐 Minko Gechev 的视频)

以上是关于如何在 NGXS 中使用 patchState 与 setState?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NGXS 与路由解析器一起使用?

如何在 HttpInterceptor 中使用 NGXS 存储中的值?

使用模拟商店时如何在ngxs中模拟@Select

NGXS store 中的数据是如何存储的? ngxs store 的内存限制是多少? ngxs 在浏览器中存储内存在哪里?

NGXS @Select 与状态模型一起使用

NGXS:如何测试一个动作是不是被调度?