mixin

定義Actions

var Reflux = require(‘reflux’);
var BookmarkActions = Reflux.createActions([‘fetch’]);
module.exports = BookmarkActions;

定義Store

var $ = require(‘jquery’);
var Reflux = require(‘reflux’);
var BookmarkActions = require(‘…/cations/bookmark-actions’);

var Utils = require(‘../utils/fetch-client’);

var BookmarkStore = Reflux.createStore({
listenables: [BookmarkActions],

 init: function() {
      this.onFetch();

},

onFetch: function(){
var self = this;
Util.fetch(‘/bookmarks’).then(functions(bookmarks){
self.trigger({
data: bookmarks,
match: ”
})
})
}
})

module.exports = BookmarkStore;

React是基於組件的,也就是整個項目是各個組件組合到一起,這樣往往會用到通用的一些特性,這就衍生了,

mixin的概念。

其實mixin,可以非常簡單的理解爲,就是把一個mixin對象上方法都混合到另一個組件上去。

在mixin中寫的生命週期相關的回調,都會被合併,也就是說他們都會被執行,並且不會相互覆蓋。

比如你再mixin中定義componentDidmount來初始化組件,它不會覆蓋使用這個mixin的組件,

實際執行的時候,會先執行mixin中的componentDidMout,最後執行組件的componentDidmount方法。

需要注意的是,因爲 因爲mixin的作用是抽離公共功能,不存在渲染dom的需要,所以它沒有render方法。如果你定義了render方法,那麼他會和組件的render方法衝突而報錯。

同樣,mixin不應該污染state,所以他也沒有 setState 方法。mixin應該只提供接口(即方法),不應該提供任何屬性。mixin內部的屬性最好是通過閉包的形式作爲私有變量存在。

到處編寫同樣的代碼是不好的,所以爲了將同樣的功能太添加到多個組件當中,你需要將這些通用的功能包裝成一個mixin,然後導入到你的模塊中,可以說相比繼承React更喜歡這種方式,恩,我也喜歡。

寫一個簡單的mixin

現在假設我們在寫一個app,我們知道在某些情況下我們需要在好幾個組件當中設置默認的name屬性。
現在,我們不再是像以前一樣在每個組件中寫多個同樣的getDefaultProps方法,我們可以像下面一樣定義一個mixin:

var DefaultNameMixin = {
getDefaultProps: function(){
return {name: ‘xiaoyu’};
}
} // 沒什麼特殊的,就是一個簡單的對象而已
將它加入到React組件中去。

爲了使用mixin,我們只需要簡單得在組件中加入mixins屬性,然後把剛纔我們寫的mixin包裹成一個數組,將它作爲該屬性的值即可:

var ComponentOne = React.createClass({
mixins: [DefaultNameMixin],
render: function(){
return …
}
})

!!!!

生命週期方法會被重複調用!

如果你的mixin中包含了生命週期的方法,不用焦急,我們仍然可以在自己的組將中使用這些方法。,而且他們都會被調用。

但是唯獨render方法除外,這個方法只能有一個,如果你寫了兩個render方法,react是會報錯的。

多個生命週期方法的調用順序

如果我們的組件和mixin中都包含了相同的生命週期方法的話會怎樣呢?

回答: 我們的mixin方法首先會被調用,然後再是組件的中方法被調用。
那當我們的組件中包含多個mixin,而這些mixin中又包含相同的生命週期方法時,調用順序又是如何?

回答: 它們會根據mixins中的順序從左到右的進行調用

學習語言熊helloworld開始,學習框架從TODO開始,這是我們碼農界的文化傳統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章