摘要:可以說,相比繼承而已,更喜歡這種組合的方式。需要指出的是,是可以包含在其他的中的程序會在控制臺打印出。包含多個我們的要包裹在數組當中,提醒了我們可以在組件中包含多個注意事項這里有幾件事需要引起我們的注意,當我們使用的時候。
update: Mixin 只適用于 ES5。如果你的項目里面用的是 ES6 ,可以采用高階組件來實現 Mixin 的功能。
我使用 React.js 構建大型項目已經有一段時間了,我遇到過很多在不同的組件中都要用到相同功能的情況。因此,我花了一個小時左右的時間去了解mixin的用法,然后分享我所學習到的一些東西。
為什么使用 Mixin ?React回避子類組件,但是我們知道,到處重復地編寫同樣的代碼是不好的。所以為了將同樣的功能添加到多個組件當中,你需要將這些通用的功能包裝成一個mixin,然后導入到你的模塊中。 可以說,相比繼承而已,React更喜歡這種組合的方式。嗯,我也喜歡這樣。
寫一個簡單的 Mixin現在假設我們在寫一個app,我們知道在某些情況下我們需要在好幾個組件當中設置默認的name屬性。
現在,我們不再是像以前一樣在每個組件中寫多個同樣的getDefaultProps方法,我們可以像下面一樣定義一個mixin:
var DefaultNameMixin = { getDefaultProps: function () { return {name: "Skippy"}; } };
它沒什么特殊的,就是一個簡單的對象而已。
加入到 React 組件中為了使用mixin,我們只需要簡單得在組件中加入mixins屬性,然后把剛才我們寫的mixin包裹成一個數組,將它作為該屬性的值即可:
var ComponentOne = React.createClass({ mixins: [DefaultNameMixin], render: function() { returnHello {this.props.name}
; } }); React.renderComponent(, document.body);
JSFiddle 示例:一個簡單的 mixin 例子
重復使用就像你想象的那樣,我們可以在任何其他組件中包含我們的mixin:
var ComponentTwo = React.createClass({ mixins: [DefaultNameMixin], render: function () { return (); } });{this.props.name}
Favorite food: {this.props.food}
JSFiddle 示例:在多個組件中使用同一個 mixin
生命周期方法會被重復調用!如何你的mixin當中包含生命周期方法,不要焦急,你仍然可以在你的組件中使用這些方法,而且它們都會被調用:
JSFiddle 示例:展示了兩個 default props 都會被設置
兩個getDefaultProps方法都將被調用,所以我們可以得到默認為Skippy的name屬性和默認為Pancakes的food屬性。任何一個生命周期方法或屬性都會被順利地重復調用,但是下面的情況除外:
render:包含多個render方法是不行的。React 會跑出異常:
Uncaught Error: Invariant Violation: ReactCompositeComponentInterface: You are attempting to define `render` on your component more than once. This conflict may be due to a mixin.
displayName:你多次的對它進行設置是沒有問題的,但是,最終的結果只以最后一次設置為準。
需要指出的是,mixin是可以包含在其他的mixin中的:
var UselessMixin = { componentDidMount: function () { console.log("asdas"); } }; var LolMixin = { mixins: [UselessMixin] }; var PantsOpinion = React.createClass({ mixins: [LolMixin], render: function () { return (I dislike pants
); } }); React.renderComponent(, document.body);
程序會在控制臺打印出asdas。
包含多個 Mixins我們的mixins要包裹在數組當中,提醒了我們可以在組件中包含多個mixins:
var DefaultNameMixin = { getDefaultProps: function () { return {name: "Lizie"}; } }; var DefaultFoodMixin = { getDefaultProps: function () { return {food: "Pancakes"}; } }; var ComponentTwo = React.createClass({ mixins: [DefaultNameMixin, DefaultFoodMixin], render: function () { return (注意事項); } });{this.props.name}
Favorite food: {this.props.food}
這里有幾件事需要引起我們的注意,當我們使用mixins的時候。 幸運地是,這些看起來并不是什么大問題,下面是我們在實踐當中發現的一些問題:
設置相同的 Prop 和 State如果你嘗試在不同的地方定義相同的屬性時會出現下面的異常:
Uncaught Error: Invariant Violation: mergeObjectsWithNoDuplicateKeys(): Tried to merge two objects with the same key: name設置相同的方法
在不同的mixin中定義相同的方法,或者mixin和組件中包含了相同的方法時,會拋出異常:
var LogOnMountMixin = { componentDidMount: function () { console.log("mixin mount method"); this.logBlah() }, // add a logBlah method here... logBlah: function () { console.log("blah"); } }; var MoreLogOnMountMixin = { componentDidMount: function () { console.log("another mixin mount method"); }, // ... and again here. logBlah: function () { console.log("something other than blah"); } };
異常信息同多次定義rander方法時拋出的異常一樣:
Uncaught Error: Invariant Violation: ReactCompositeComponentInterface: You are attempting to define `logBlah` on your component more than once. This conflict may be due to a mixin.多個生命周期方法的調用順序
如果我們的組件和mixin中都包含了相同的生命周期方法的話會怎樣呢?
我們的mixin方法首先會被調用,然后再是組件的中方法被調用。
那當我們的組件中包含多個mixin,而這些mixin中又包含相同的生命周期方法時,調用順序又是如何?
它們會根據mixins中的順序從左到右的進行調用。
實例代碼:
var LogOnMountMixin = { componentDidMount: function () { console.log("mixin mount method"); } }; var MoreLogOnMountMixin = { componentDidMount: function () { console.log("another mixin mount method"); } }; var ComponentOne = React.createClass({ mixins: [MoreLogOnMountMixin, LogOnMountMixin], componentDidMount: function () { console.log("component one mount method"); }, ... var ComponentTwo = React.createClass({ mixins: [LogOnMountMixin, MoreLogOnMountMixin], componentDidMount: function () { console.log("component two mount method"); }, ...
控制臺將輸出:
another mixin mount method mixin mount method component one mount method mixin mount method another mixin mount method component two mount method總結
Mixin 使你React程序變得更為可重用,It"s a Good Thing.
我希望這篇文章能夠對你有所幫助,如果有任何反饋,很高興你能夠在twitter上@veddermatic
原文鏈接:http://simblestudios.com/blog...
翻譯水平有限,文中帶有個人理解,如有不恰當的地方,請在評論中指出,非常感謝!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85837.html
摘要:函數通常是面向對象編程風格,具有副作用。因為在函數式編程中,很有可能這些引用指向的并不是同一個對象。記住,函數并不意味著函數式編程。函數可以用函數式編程風格編寫,避免副作用并不修改參數,但這并不保證。 軟件構建系列 原文鏈接:Functional Mixins 譯者注:在編程中,mixin 類似于一個固有名詞,可以理解為混合或混入,通常不進行直譯,本文也是同樣。 這是軟件構建系列教...
摘要:原文地址我想分享一些文章,來幫你學習的概念和架構在開始之前我們先來看這兩篇文章,用代替和然后我們通過一個代碼教程我翻譯地址深入了解,然后看一看超級介紹完成你對的探索之旅現在是時候去學習和再往前走理解并且看一看關于的一切注盡量中文地址的我用的 原文地址 我想分享一些文章,來幫你學習redux的概念和架構 在開始redux之前我們先來看這兩篇文章,用High Order Component...
摘要:但非常不幸,并不原生支持。這個單詞相信都很熟悉,高階函數在函數式編程是一個基本概念,它描述的是這樣一種函數,接受函數作為輸入,或是輸出一個函數。比如常用的工具方法都是高階函數。恰與的定義完全一致。這種不同很可能會導致問題的產生。 在 React component 構建過程中,常常有這樣的場景,有一類功能要被不同的 Component 公用,然后看得到文檔經常提到 Mixin(混入) ...
摘要:前端日報精選十問幫你理清前端工程師及大前端團隊的成長問題譯讀完細則之后學到的件事掘金怎么寫一個組件庫一眾成翻譯還有這操作一個能生成思維導圖的開源搜索引擎知乎專欄中文前端推薦第天值得收藏的基礎教程知乎專欄第期沒有的一天轉載中回調地 2017-06-15 前端日報 精選 十問sofish:幫你理清前端工程師及大前端團隊的成長問題![譯] 讀完 flexbox 細則之后學到的 11 件事 -...
摘要:譯立即執行函數表達式處理支持瀏覽器環境微信小程序。學習整體架構,利于打造屬于自己的函數式編程類庫。下一篇文章可能是學習的源碼整體架構。也可以加微信,注明來源,拉您進前端視野交流群。 前言 上一篇文章寫了jQuery整體架構,學習 jQuery 源碼整體架構,打造屬于自己的 js 類庫 雖然看過挺多underscore.js分析類的文章,但總感覺少點什么。這也許就是紙上得來終覺淺,絕知此...
閱讀 2077·2023-04-25 19:15
閱讀 2245·2021-11-23 09:51
閱讀 1264·2021-11-17 09:33
閱讀 2165·2021-08-26 14:15
閱讀 2476·2019-08-30 15:54
閱讀 1582·2019-08-30 15:54
閱讀 2167·2019-08-30 12:50
閱讀 1132·2019-08-29 17:08