简体   繁体   English

回流:让多个组件访问同一商店

[英]Reflux: having multiple components access the same Store

tl;dr : The UUID for the GraphStore changes every time I add a new Graph to it. tl; dr :每次我向其添加新Graph时,GraphStore的UUID都会更改。 This leads me to assume each Graph is creating its own unique GraphStore. 这使我假设每个图都在创建自己的唯一GraphStore。 I want them all to share a single store. 我希望他们所有人共享一个商店。

I have a React Dashboard component that contains multiple Graph components. 我有一个包含多个Graph组件的React Dashboard组件。

My Graph component is passed an id props from the Dashboard. 我的Graph组件从仪表板传递了一个id道具。 Using that id, it then looks for data in a graphs array stored in a GraphStore. 然后使用该id在GraphStore中存储的graphs数组中查找数据。 However, it seems to me that each Graph is creating its own GraphStore, rather than all sharing the same (the desired behavior). 但是,在我看来,每个Graph都在创建自己的GraphStore,而不是共享相同的(期望的行为)。 How do I make them all use the same GraphStore? 如何使它们全部使用相同的GraphStore?

I thought about passing in the correct GraphStore from the dashboard, but then it is not possible for me to have each Graph listen for changes from the GraphStore. 我曾考虑过从仪表板传递正确的GraphStore,但是我不可能让每个Graph都监听GraphStore中的更改。

I'm happy to not use Reflux.connectFilter, but it seems like the perfect thing for this. 我很高兴不使用Reflux.connectFilter,但这似乎很完美。

My code (the key parts at least): 我的代码(至少是关键部分):

Dashboard 仪表板

var React        = require('react');
var Graph        = require('./graph').Graph;
var GraphActions = require('./graphActions').GraphActions;
var UUID         = require('uuid');

var Dashboard = React.createClass({
    ...
    render: function() {
        var graphs = [];
        for(var i = 0; i < 10; ++i) {
            var id = UUID.v4();
            GraphActions.createGraph(id);
            graphs.push(
                <Graph id={id} />
            );
        }
    }
});

module.exports = {Dashboard: Dashboard}; 

Graph 图形

var React      = require('react');
var GraphStore = require('./graphStore').GraphStore;

var Graph = React.createClass({
    mixins: [Reflux.connectFilter(GraphStore, "graph", function(){
        return graphs.filter(function(graph) {
            return graph.id === this.props.id;
        }.bind(this))[0];
    })],
    propTypes: {
        id: React.PropTypes.string
    },
    render: function() {
        // Needed because the AJAX call in GraphStore might not have completed yet
        if(typeof this.state.graph == "undefined") {
            return (<div>Graph loading...</div>);
        }

        return (<div>Data: {this.state.graph.data}</div>);
    }
});

module.exports = {Graph: Graph};

GraphStore GraphStore

var Reflux       = require('reflux');
var jQuery       = require('jquery');
var GraphActions = require('./graphActions').GraphActions;
var UUID         = require('uuid');

var GraphStore = Reflux.createStore({
    listenables: [GraphActions],
    onCreateGraph: function(graphId) {
        console.log("GraphStore " + this.id + " is adding new graph " + graphId);

         jQuery.ajax({
              ...
              success: this.addGraph
         });
    },
    addGraph: function(data) {
        this.graphs.push(
            {
                id:   graphId,
                data: data
            }
        );

        this.trigger({graphs: this.graphs});
    },
    getInitialState: function() {
        this.graphs = [];

        // Here I give the store a UUID so I can identify it later
        this.id = UUID.v4();

        return {
            graphs: this.graphs
        };
    }
});

getInitialState on the Reflux Store fires each time a component subscribes to the store (it's the initial data for the component ). 每当组件订阅商店时,Reflux Store上的getInitialState触发(这是该组件的初始数据)。

If you require something to only run once on the store, use init : 如果您只需要在商店上运行一次 ,请使用init

var GraphStore = Reflux.createStore({
    listenables: [GraphActions],
    init: function() {
        this.graphs = [];

        // Here I give the store a UUID so I can identify it later
        this.id = UUID.v4();
    },
    getInitialState: function() {
        return {
            graphs: this.graphs
        };
    }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM