2015-11-30 45 views
1

全部:addChangeListener如何在Facebook React Todo示例中工作

我是React的新手。當我跟隨其TodoMVC example,有一個問題是混淆了我這麼多:

裏面TodoApp組件,使用TodoStore.addChangeListener它註冊的處理程序:

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

而讓CHANGE_EVENT在TodoStore.addChangeListener來觸發_onChange回調:

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

什麼這裏讓我困惑的是:

  1. 如何「this.on」知道回調的背景下(我的意思是,它是如何記住「這個」從_onChange)

  2. 如果什麼有多個TodoApp註冊自己的_onChange,所以todoStore將保持所有回調列表?

感謝

回答

3
  1. 沒有。 thisthis.on是指商店。提供的回調引用_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()); 
    } 
} 
  • 是的。在Flux Stores中有EventEmitters,並且設計爲每個事件都有多個監聽器。
  • +0

    謝謝,是的,「this._onChange.bind(this)」是我認爲它應該也是。但爲什麼沒有它的當前代碼工作太多,或者你的意思是代碼實際上不起作用?我想如果沒有明確的上下文綁定,那麼當調用this.on時,回調將以window作爲上下文來調用,對吧? – Kuan

    +1

    反應過去有一個功能,默認情況下叫做[Autobind](https://facebook.github.io/react/blog/2013/07/02/react-v0-4-autobind-by-default.html ),與'React.createClass'一起工作,並在每個函數上調用'bind'。該代碼可以使用該功能。 – Tyrsius

    +0

    謝謝。這是驚人的,所以這意味着即使我們定義了_onChange:function()this.setState(getTodoState()); } 像這樣,但實際上this._onChange類似於function(){this.setState(getTodoState()); } .bind(this)? – Kuan