查看是否应该直接致电商店?

Should view call the store directly?

从 Flux 的 TodoMVC 示例中,我看到 TodoApp 组件正在要求商店获取状态。

视图是否应该创建操作并让调度程序改为调用商店?

View可以直接获取Stores的状态

Action + Dispatcher 是改变 Store 状态的灵活方法,而不是访问现有的 Store 数据。

您应该以某种方式从商店获取值:

  1. 直接从商店获取价值。例如。 postsStore.get('firstPost')

    您不会收到有关更改的通知。所以,不要用这个方法。

  2. 使用组件上的生命周期方法获取和订阅商店

    componentWillMount: function(){
        var _this = this;
        myStore.subscribe(function(newValue){
            _this.setState({
                myValue: newValue
            });
        })
    },
    componentWillUnmount: function(){
        // don't forget to unsubscribe from store here
    }
    
  3. 使用 mixins 获取和订阅商店。通常 Flux 实现会为您提供 Mixin。因此,从商店设置到组件状态的价值取决于商店中价值的变化。

    来自 Reflux 的例子

     mixins: Reflux.connect(myStore, 'myValue'),
     render: function(){
         // here you have access to this.state.myValue
     }
    
  4. 订阅操作。它对于您不想存储的渲染错误很有用。但是你可以随心所欲地使用它。

    实现与之前相同,但 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。