reflux connectFilter仍向所有侦听组件发送更新

马修·赫伯斯特(Matthew Herbst)

我正在使用Reflux.connectFilter mixin让一堆Graph组件监听我的GraphStore中的更改。使用过滤器,仅当GraphStore的graphs数组中匹配其ID的元素发生更改(或添加/删除)时,它们才应重新呈现。但是,当我更新数组的单个元素时,比如说通过设置名称变量,我仍然看到所有监听图都重新呈现。难道我做错了什么?

GraphStore

var Reflux       = require('reflux');
var GraphActions = require('./graphActions').GraphActions;

var GraphStore = Reflux.createStore({
  listenables: [GraphActions],
  init: function() {
    this.graphs         = [];
    this.metricMetaData = {};
  },
  onAddGraph: function(graphId, name) { // Called only by the Dashboard component that is a parent to all Graphs
       this.graphs.push(
          {
             id:   graphId,
             name: ""
          }
       );

       this.updateGraphs();
  },
  onSetName: function(graphId, name) { // Called only by the Dashboard component that is a parent to all Graphs
     for(var i = 0, gl = this.graphs.length; i < gl; ++i) {
        if(this.graphs[i].id === graphId) {
           this.graphs[i].name = name;
           this.updateGraphs();
           return;
        }
     }
  },
  ...
  updateGraphs: function() {
    this.trigger(this.graphs); // This is the only place in the store where trigger is called
  },
  getInitialState: function() {
    return this.graphs;
  }
});

module.exports = {GraphStore: GraphStore};

图形

/** @jsx React.DOM */
var React        = require('react');
var Reflux       = require('reflux');
var GraphActions = require('./graphActions').GraphActions;
var GraphStore   = require('./graphStore').GraphStore;

var Graph = React.createClass({
  mixins: [Reflux.connectFilter(GraphStore, "graph", function(graphs) {
    return graphs.filter(function(graph) {
      return graph.id === this.props.id;
    }.bind(this))[0];
  })],
  propTypes: {
    id: React.PropTypes.string.isRequired
  },
  ...
  render: function() {
    if(typeof this.state.graph === "undefined") {
       return (<div>The graph has not been created in the store yet</div>);
    } else {
       return (<div>Graph name: {this.state.graph.name}</div>);
    }
  }
};

module.exports = {Graph: Graph};

仪表板

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

var Dashboard = React.createClass({
  propTypes: {
    numGraphs: React.PropTypes.int.isRequired
  },
  ...
  render: function() {
    var graphs = [];
    for(var i = 0; i < this.props.numGraphs; ++i) {
        var currId = UUID.v4();
        GraphActions.addGraph(currId, "");
        graphs.push(<Graph id={currId} />);
    }

    return (<div>{graphs}</div>);
  }
};

module.exports = {Dashboard: Dashboard};
安德斯·埃克达尔

我没有使用Reflux,但我认为这里的问题是您的所有Graph实例都在监听GraphStore,并且一旦该存储发送事件,所有组件实例都将接收该事件。他们将过滤掉不感兴趣的数据,但Reflux仍将setState在所有实例上调用,从而触发它们重新渲染。如果滤波功能的结果与以前相同,则Reflux不会(就我所知)重新短路短路。

为了使它短路并避免在返回相同数据时重新渲染,您需要shouldComponentUpdate在组件上实现方法并将新状态与旧状态进行比较,如果相同则返回false。

一种流行的方法是将[1] Immutable.js与[2] PureRenderMixin一起使用,它会为您实现短路。

[1] https://github.com/facebook/immutable-js

[2] https://facebook.github.io/react/docs/pure-render-mixin.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使React.js组件侦听Reflux中的商店

来自分类Dev

使用带有ES6的mixins的ReactJS Reflux

来自分类Dev

如何获取所有Reflux动作名称的列表以及所有这些动作的preEmit钩子?

来自分类Dev

如何用Jest测试reflux动作

来自分类Dev

React Router导致Reflux存储中的AJAX调用失败

来自分类Dev

如何使用Reflux商店处理分层数据?

来自分类Dev

React + Reflux:将变量传递到数据存储

来自分类Dev

最好在React和Reflux中使用一些大型或多个小型商店

来自分类Dev

运行已编译的JSX时发生React Reflux错误,但使用Transformer时不发生

来自分类Dev

最好在React和Reflux中使用一些大型或多个小型商店

来自分类Dev

如何异步向所有侦听器/订阅者发送事件?

来自分类Dev

使用Reflux,需要2个商店还是1个资源商店?(自行车/ CurrentBike vs自行车)

来自分类Dev

获取在组件上注册的所有侦听器

来自分类Dev

将事件发送给所有侦听器

来自分类Dev

查找无向图的所有连接组件

来自分类Dev

在无向图的所有连接的组件的最小要素的总和

来自分类Dev

向所有路由声明组件 react-router

来自分类Dev

向与客户连接的所有房间发送消息

来自分类Dev

Symfony2,如何向所有视图发送参数?

来自分类Dev

向Java列表中的所有项目发送广播消息

来自分类Dev

向所有用户发送的GCM消息(无主题)

来自分类Dev

如何使用C(Linux)向所有终端发送消息?

来自分类Dev

向所有频道发送消息— Discord.py

来自分类Dev

定期向所有客户端发送数据

来自分类Dev

grpc 是否可以向所有子频道发送消息?

来自分类Dev

React - 向组件发送道具

来自分类Dev

向类中的所有元素添加唯一的侦听器

来自分类Dev

SignalR-向所有人发送消息,不包括用户的所有连接

来自分类Dev

当我添加新产品或更新产品时,WooCommerce会立即向所有客户发送电子邮件通知

Related 相关文章

  1. 1

    如何使React.js组件侦听Reflux中的商店

  2. 2

    使用带有ES6的mixins的ReactJS Reflux

  3. 3

    如何获取所有Reflux动作名称的列表以及所有这些动作的preEmit钩子?

  4. 4

    如何用Jest测试reflux动作

  5. 5

    React Router导致Reflux存储中的AJAX调用失败

  6. 6

    如何使用Reflux商店处理分层数据?

  7. 7

    React + Reflux:将变量传递到数据存储

  8. 8

    最好在React和Reflux中使用一些大型或多个小型商店

  9. 9

    运行已编译的JSX时发生React Reflux错误,但使用Transformer时不发生

  10. 10

    最好在React和Reflux中使用一些大型或多个小型商店

  11. 11

    如何异步向所有侦听器/订阅者发送事件?

  12. 12

    使用Reflux,需要2个商店还是1个资源商店?(自行车/ CurrentBike vs自行车)

  13. 13

    获取在组件上注册的所有侦听器

  14. 14

    将事件发送给所有侦听器

  15. 15

    查找无向图的所有连接组件

  16. 16

    在无向图的所有连接的组件的最小要素的总和

  17. 17

    向所有路由声明组件 react-router

  18. 18

    向与客户连接的所有房间发送消息

  19. 19

    Symfony2,如何向所有视图发送参数?

  20. 20

    向Java列表中的所有项目发送广播消息

  21. 21

    向所有用户发送的GCM消息(无主题)

  22. 22

    如何使用C(Linux)向所有终端发送消息?

  23. 23

    向所有频道发送消息— Discord.py

  24. 24

    定期向所有客户端发送数据

  25. 25

    grpc 是否可以向所有子频道发送消息?

  26. 26

    React - 向组件发送道具

  27. 27

    向类中的所有元素添加唯一的侦听器

  28. 28

    SignalR-向所有人发送消息,不包括用户的所有连接

  29. 29

    当我添加新产品或更新产品时,WooCommerce会立即向所有客户发送电子邮件通知

热门标签

归档