摘要:拋磚引玉實現一個日志功能。一般都會抽出公共的部分。看起來挺完美的,實際上還是有個問題代碼的耦合性太強像這種日志功能應該同業(yè)務分離,不應該直接出現在業(yè)務代碼中。如果做過開發(fā),應該很容易想到一個概念面向切面編程。
拋磚引玉
實現一個日志功能。
組件在掛載前打印 Component will mount
組件掛載后打印 Component did mount
不能忍受的寫法var AComponent = React.createClass({ componentWillMount: function () { console.log("Component will mount"); }, componentDidMount: function () { console.log("Component did mount"); }, render: function () { return (AComponent) } }); var BComponent = React.createClass({ componentWillMount: function () { console.log("Component will mount"); }, componentDidMount: function () { console.log("Component did mount"); }, render: function () { return (BComponent) } });
看到上面的代碼,直接吐血而亡啊,寫的是什么幾把玩意兒。還好只寫了兩個組件,要是多個組件,相同的代碼就會重復多遍。相信大家看到上面的代碼也會發(fā)現一個致命的問題:可維護性太差差差!
改進相信大家都不會寫出上面的代碼,如果真有人會那樣寫,請允許我呵呵你。一般都會抽出公共的部分。
var Log = { componentWillMount: function () { console.log("Component will mount"); }, componentDidMount: function () { console.log("Component did mount"); } }; var AComponent = React.createClass({ componentWillMount: function () { Log.componentWillMount(); }, componentDidMount: function () { Log.componentDidMount(); }, render: function () { return (AComponent) } }); var BComponent = React.createClass({ componentWillMount: function () { Log.componentWillMount(); }, componentDidMount: function () { Log.componentDidMount(); }, render: function () { return (BComponent) } });
看起來挺完美的,實際上還是有個問題:代碼的耦合性太強!像這種日志功能應該同業(yè)務分離,不應該直接出現在業(yè)務代碼中。如果做過Java開發(fā),應該很容易想到一個概念:AOP—面向切面編程。
Mixins利用React的Mixins,編寫的代碼就像這樣的:
var LogMixin = { componentWillMount: function () { console.log("Component will mount"); }, componentDidMount: function () { console.log("Component did mount"); } }; var AComponent = React.createClass({ mixins: [LogMixin], render: function () { return (AComponent) } }); var BComponent = React.createClass({ mixins: [LogMixin], render: function () { return (BComponent) } });
Mixins有點類似AOP。所謂的mixins就是將組件里的方法抽出來。實際上Mixins里的this是指向組件的,使用了Mixins以后,組件也可以調用Mixins里的方法。
組件調用Mixins方法var Mixin = { log:function(){ console.log("Mixin log"); } }; var Component = React.createClass({ mixins: [Mixin], componentWillMount: function () { this.log(); }, render: function () { return (Component) } });
控制臺打印:
$ Mixin log生命周期方法
Mixins里也可以編寫組件生命周期的方法,需要注意的是:Mixins里的方法并不會覆蓋組件的生命周期方法,會在先于組件生命周期方法執(zhí)行。
var Mixin = { componentWillMount: function () { console.log("Mixin Will Mount"); } }; var Component = React.createClass({ mixins: [Mixin], componentWillMount: function () { console.log("Component Will Mount"); }, render: function () { return (Component) } });
控制臺打印:
$ Mixin Will Mount $ Component Will Mount使用多個Mixin
組件也可以使用多個Mixin
var AMixin = { componentWillMount: function () { console.log("AMixin Will Mount"); } }; var BMixin = { componentWillMount: function () { console.log("BMixin Will Mount"); } }; var Component = React.createClass({ mixins: [AMixin,BMixin], componentWillMount: function () { console.log("Component Will Mount"); }, render: function () { return (Component) } });
控制臺打印:
$ AMixin Will Mount $ BMixin Will Mount $ Component Will Mount
數組引入的順序,決定了Mxins里生命周期方法的執(zhí)行順序。
不允許重復除了生命周期方法可以重復以外,其他的方法都不可以重復,否則會報錯
情景1var AMixin = { log: function () { console.log("AMixin Log"); } }; var BMixin = { log: function () { console.log("BMixin Log"); } }; var Component = React.createClass({ mixins: [AMixin,BMixin], render: function () { return (情景2Component) } });
var Mixin = { log: function () { console.log("Mixin Log"); } }; var Component = React.createClass({ mixins: [Mixin], log:function(){ console.log("Component Log"); }, render: function () { return (Component) } });
以上兩種情景,都會報錯,控制信息如下,所以使用的時候要小心了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85654.html
摘要:跟非常相似,但是在開始嘗試你第一個之前,也需要了解兩者之間的一些差異。推薦的方式是使用提供的。能用到組件中的或者上以啟用這個組件的觸摸事件。 華翔,Web前端開發(fā)工程師著作權歸作者所有,轉載請聯系作者獲得授權。 showImg(https://segmentfault.com/img/bVUliz?w=640&h=235); React-Native已經誕生有兩年左右了,自從適配了An...
摘要:當或的值發(fā)生變化時觸發(fā),并通過返回值確定是否觸發(fā)更新事件但初始化組件時不會觸發(fā)。該方式僅在未使用的時候適用。 React簡述 React是由fackbook開放的一個構建用戶接口的javascript類庫,其主要目的是為了開發(fā)隨時間數據不斷變化的大型應用程序,許多開發(fā)者將React視作為MVC模式中的V.2011年React開始被fackbook工程師著手開發(fā),并作為內部使用,2013...
摘要:下一步我們將結果輸出到文件。這是我們用編寫的第一個非常簡單的組建。使用將創(chuàng)建的組建導出以便在其它地方能夠正常導入使用。 這是React和ECMAScript6結合使用系列文章的第一篇。 本文出自從零到壹全棧部落 下面是所有系列文章章節(jié)的鏈接: React 、 ES6 - 介紹(第一部分) React類、ES7屬性初始化(第二部分) React類,方法綁定(第三部分) ES6中Reac...
摘要:飛機就是一種交通工具,可飛行的能力是是飛機的屬性,通過繼承接口來獲取語言可沒有接口功能,但是它可以多重繼承。說是,因為從語法上看,的確是通過多重繼承實現的。所以從含義上理解,只是一個,不是一個。比如飛機照樣可以載客,就是不能飛了 REST API設計理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...
摘要:飛機就是一種交通工具,可飛行的能力是是飛機的屬性,通過繼承接口來獲取語言可沒有接口功能,但是它可以多重繼承。說是,因為從語法上看,的確是通過多重繼承實現的。所以從含義上理解,只是一個,不是一個。比如飛機照樣可以載客,就是不能飛了 REST API設計理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...
閱讀 3904·2021-11-22 09:34
閱讀 1490·2021-11-04 16:10
閱讀 1721·2021-10-11 10:59
閱讀 3271·2019-08-30 15:44
閱讀 2036·2019-08-30 13:17
閱讀 3445·2019-08-30 11:05
閱讀 744·2019-08-29 14:02
閱讀 2618·2019-08-26 13:34