查看是否应该直接致电商店?
Should view call the store directly?
从 Flux 的 TodoMVC 示例中,我看到 TodoApp 组件正在要求商店获取状态。
视图是否应该创建操作并让调度程序改为调用商店?
View可以直接获取Stores的状态
Action + Dispatcher 是改变 Store 状态的灵活方法,而不是访问现有的 Store 数据。
您应该以某种方式从商店获取值:
直接从商店获取价值。例如。 postsStore.get('firstPost')
您不会收到有关更改的通知。所以,不要用这个方法。
使用组件上的生命周期方法获取和订阅商店
componentWillMount: function(){
var _this = this;
myStore.subscribe(function(newValue){
_this.setState({
myValue: newValue
});
})
},
componentWillUnmount: function(){
// don't forget to unsubscribe from store here
}
使用 mixins 获取和订阅商店。通常 Flux 实现会为您提供 Mixin。因此,从商店设置到组件状态的价值取决于商店中价值的变化。
来自 Reflux 的例子
mixins: Reflux.connect(myStore, 'myValue'),
render: function(){
// here you have access to this.state.myValue
}
订阅操作。它对于您不想存储的渲染错误很有用。但是你可以随心所欲地使用它。
实现与之前相同,但 store
使用 action
与商店同步的最佳方式是订阅商店。
所以你的问题的答案是:
是,没关系,否,你不应该在组件中的存储上调用方法。
如果它是 纯 方法(不会更改存储中的数据),则可以调用存储上的方法。所以你只能调用 get
方法。
但是,如果您希望(您应该)收到有关商店更改的通知,您应该订阅它。由于可以通过 mixin 添加手动订阅,因此应该使用它(你自己的,或来自 flux-library)。所以 SubscribingMixin(MyStore)
在内部调用存储上的一些方法,但不是你在组件中是正确的。
但是,如果您考虑重新发明 Flux,请注意,订阅商店和订阅操作之间没有区别。所以可以实现它,以便所有数据都将通过操作。
正在侦听商店的 "change" 事件的视图称为 controller-views,因为它们具有这一 controller-like 方面:每当商店发生变化时,它们都会从存储并通过道具将其传递给他们的children。
controller-views 是唯一应该调用商店的 getter 的视图。吸气剂应该是商店公开的唯一 public API 。商店没有二传手。
很容易在树深处的某个组件的 render()
方法中调用商店的 getter,但这是一个 anti-pattern。它违反了单向数据流,使理解应用程序中的数据流变得更加困难,并且使渲染成本更高。
在 TodoMVC Flux 示例中,TodoApp 组件是唯一的 controller-view。
从 Flux 的 TodoMVC 示例中,我看到 TodoApp 组件正在要求商店获取状态。
视图是否应该创建操作并让调度程序改为调用商店?
View可以直接获取Stores的状态
Action + Dispatcher 是改变 Store 状态的灵活方法,而不是访问现有的 Store 数据。
您应该以某种方式从商店获取值:
直接从商店获取价值。例如。
postsStore.get('firstPost')
您不会收到有关更改的通知。所以,不要用这个方法。
使用组件上的生命周期方法获取和订阅商店
componentWillMount: function(){ var _this = this; myStore.subscribe(function(newValue){ _this.setState({ myValue: newValue }); }) }, componentWillUnmount: function(){ // don't forget to unsubscribe from store here }
使用 mixins 获取和订阅商店。通常 Flux 实现会为您提供 Mixin。因此,从商店设置到组件状态的价值取决于商店中价值的变化。
来自 Reflux 的例子
mixins: Reflux.connect(myStore, 'myValue'), render: function(){ // here you have access to this.state.myValue }
订阅操作。它对于您不想存储的渲染错误很有用。但是你可以随心所欲地使用它。
实现与之前相同,但
store
使用action
与商店同步的最佳方式是订阅商店。
所以你的问题的答案是:
是,没关系,否,你不应该在组件中的存储上调用方法。
如果它是 纯 方法(不会更改存储中的数据),则可以调用存储上的方法。所以你只能调用 get
方法。
但是,如果您希望(您应该)收到有关商店更改的通知,您应该订阅它。由于可以通过 mixin 添加手动订阅,因此应该使用它(你自己的,或来自 flux-library)。所以 SubscribingMixin(MyStore)
在内部调用存储上的一些方法,但不是你在组件中是正确的。
但是,如果您考虑重新发明 Flux,请注意,订阅商店和订阅操作之间没有区别。所以可以实现它,以便所有数据都将通过操作。
正在侦听商店的 "change" 事件的视图称为 controller-views,因为它们具有这一 controller-like 方面:每当商店发生变化时,它们都会从存储并通过道具将其传递给他们的children。
controller-views 是唯一应该调用商店的 getter 的视图。吸气剂应该是商店公开的唯一 public API 。商店没有二传手。
很容易在树深处的某个组件的 render()
方法中调用商店的 getter,但这是一个 anti-pattern。它违反了单向数据流,使理解应用程序中的数据流变得更加困难,并且使渲染成本更高。
在 TodoMVC Flux 示例中,TodoApp 组件是唯一的 controller-view。