我学习ngxs但是当我应该用我无法理解patchState
和setState
?有什么不同?
const state = ctx.getState();
let data = this.service.list();
ctx.setState({
...state,
feedAnimals: data
});
Run Code Online (Sandbox Code Playgroud)
与
let data = this.service.list();
ctx.patchState({
feedAnimals: data
});
Run Code Online (Sandbox Code Playgroud) 我正在学习 Akita 以向 Angular 应用程序添加状态管理。在查看Akita 文档中的架构图和Akita GitHub 存储库中的示例(例如此示例)时,我看到 Query 是直接在组件中访问的。我很惊讶地看到这一点,因为我预计应用程序的状态管理部分将隐藏在服务后面,并从消费者(即组件)中抽象出来。与 Query 不同的是,Store 隐藏在 Service 后面,不能直接在组件中访问。在我看来,如果 Query 隐藏在 Service 后面,就像 Store 隐藏在 Service 后面一样,那么消费者只需要为每个数据源导入一件事,即服务。
所以我的问题是为什么 Akita 希望我们直接在组件中访问 Query 而不是 Store?将 Query 隐藏在服务背后是否有不利之处?
我来自 React,现在我已经使用 Angular 工作了几个月了。React 组件在重新渲染时仅更新必要的 HTML,而 Angular 组件在状态未发生变化时似乎会完全重新渲染。如果我直接改变状态似乎工作得很好。
这是我的非常基本的例子:
我有保存状态的主要组件:
items = [{ name: "John", age: 8 }, { name: "Jane", age: 20 }];
Run Code Online (Sandbox Code Playgroud)
在它的视图中它呈现一个项目列表:
items = [{ name: "John", age: 8 }, { name: "Jane", age: 20 }];
Run Code Online (Sandbox Code Playgroud)
item组件如下所示:
@Component({
selector: "item",
template: `
<p>
{{ item.name }}, {{ item.age }}
<input type="checkbox" />
</p>
`
})
export class ItemComponent {
@Input() item: any;
}
Run Code Online (Sandbox Code Playgroud)
我在项目组件中添加了该复选框,只是为了注意到组件何时完全重新渲染。
所以我要做的就是勾选复选框并age
为该州的每个用户增加 。
如果我通过改变状态来增加它,视图将按预期更新并且复选框保持选中状态:
this.items.forEach(item => {
item.age++;
}); …
Run Code Online (Sandbox Code Playgroud)