【问题标题】:How addChangeListener works in Facebook React Todo exampleaddChangeListener 在 Facebook React Todo 示例中的工作原理
【发布时间】:2016-03-04 12:57:32
【问题描述】:

全部:

我对 React 还是很陌生。当我关注它的 TodoMVC example 时,有一个问题让我非常困惑:

在 TodoApp 组件内部,它使用 TodoStore.addChangeListener 注册其处理程序:

componentDidMount: function() {
    TodoStore.addChangeListener(this._onChange);
  },
_onChange: function() {
    this.setState(getTodoState());
  }

并让 TodoStore.addChangeListener 中的 CHANGE_EVENT 触发 _onChange 回调:

addChangeListener: function(callback) {
    this.on(CHANGE_EVENT, callback);
  },

让我困惑的是:

  1. “this.on”如何知道回调的上下文(我的意思是它如何记住来自 _onChange 的“this”)

  2. 如果有多个TodoApp注册他们的_onChange,那么todoStore会维护一个所有回调的列表?

谢谢

【问题讨论】:

    标签: reactjs reactjs-flux


    【解决方案1】:
    1. 没有。 this.on 中的 this 指的是商店。提供的回调引用了_onChange 函数,该函数使用自己的this。为了让它工作,它需要绑定到TodoApp。我认为这个例子来自 React 的自动绑定时代。现在,您可以在 componentDidMount 或类构造函数中使用 .bind

    本地绑定

    componentDidMount: function() {
        TodoStore.addChangeListener(this._onChange.bind(this));
      },
    

    OR 类绑定(= () => 为类创建一个arrow function,在构造函数范围内关闭this

    class TodoApp extends React.Component {
      componentDidMount = () => {
       TodoStore.addChangeListener(this._onChange);
      }
    
      _onChange = () => {
        this.setState(getTodoState());
      }
    }
    
    1. 是的。 Flux Stores 中有 EventEmitters,旨在为每个事件提供多个侦听器。

    【讨论】:

    • 谢谢,是的,我认为“this._onChange.bind(this)”也是如此。但是为什么没有它的当前代码也可以工作,或者您的意思是该代码实际上不起作用?我想如果没有显式的上下文绑定,那么在调用this.on的时候,回调会以window为上下文调用,对吧?
    • React 曾经有一个功能,默认情况下,称为Autobind,与React.createClass 一起使用,并在每个函数上调用bind。该代码可以使用该功能。
    • 谢谢。这太神奇了,所以这意味着即使我们定义了 _onChange: function() { this.setState(getTodoState()); } 像这样,但实际上 this._onChange 类似于 function() { this.setState(getTodoState()); }.bind(this) ?
    • 是的,但是这个特性在默认情况下不再启用,甚至在 ES6 Class 语法中也不可用。对于 ES6,你可以使用我上面展示的箭头语法,或者在构造函数中调用 bind
    • 所以这段代码可能是很久以前写的,如果没有启用默认功能,现在就不能工作了。无论如何,我得到了基本的想法。谢谢,这很有帮助
    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2017-10-04
    • 2015-12-21
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多