成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

『譯』React Mixin 的使用

張巨偉 / 1427人閱讀

摘要:可以說(shuō),相比繼承而已,更喜歡這種組合的方式。需要指出的是,是可以包含在其他的中的程序會(huì)在控制臺(tái)打印出。包含多個(gè)我們的要包裹在數(shù)組當(dāng)中,提醒了我們可以在組件中包含多個(gè)注意事項(xiàng)這里有幾件事需要引起我們的注意,當(dāng)我們使用的時(shí)候。

update: Mixin 只適用于 ES5。如果你的項(xiàng)目里面用的是 ES6 ,可以采用高階組件來(lái)實(shí)現(xiàn) Mixin 的功能。

我使用 React.js 構(gòu)建大型項(xiàng)目已經(jīng)有一段時(shí)間了,我遇到過(guò)很多在不同的組件中都要用到相同功能的情況。因此,我花了一個(gè)小時(shí)左右的時(shí)間去了解mixin的用法,然后分享我所學(xué)習(xí)到的一些東西。

為什么使用 Mixin ?

React回避子類組件,但是我們知道,到處重復(fù)地編寫同樣的代碼是不好的。所以為了將同樣的功能添加到多個(gè)組件當(dāng)中,你需要將這些通用的功能包裝成一個(gè)mixin,然后導(dǎo)入到你的模塊中。 可以說(shuō),相比繼承而已,React更喜歡這種組合的方式。嗯,我也喜歡這樣。

寫一個(gè)簡(jiǎn)單的 Mixin

現(xiàn)在假設(shè)我們?cè)趯懸粋€(gè)app,我們知道在某些情況下我們需要在好幾個(gè)組件當(dāng)中設(shè)置默認(rèn)的name屬性。
現(xiàn)在,我們不再是像以前一樣在每個(gè)組件中寫多個(gè)同樣的getDefaultProps方法,我們可以像下面一樣定義一個(gè)mixin

var DefaultNameMixin = {
    getDefaultProps: function () {
        return {name: "Skippy"};
    }
};

它沒什么特殊的,就是一個(gè)簡(jiǎn)單的對(duì)象而已。

加入到 React 組件中

為了使用mixin,我們只需要簡(jiǎn)單得在組件中加入mixins屬性,然后把剛才我們寫的mixin包裹成一個(gè)數(shù)組,將它作為該屬性的值即可:

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

Hello {this.props.name}

; } }); React.renderComponent(, document.body);

JSFiddle 示例:一個(gè)簡(jiǎn)單的 mixin 例子

重復(fù)使用

就像你想象的那樣,我們可以在任何其他組件中包含我們的mixin

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

{this.props.name}

Favorite food: {this.props.food}

); } });

JSFiddle 示例:在多個(gè)組件中使用同一個(gè) mixin

生命周期方法會(huì)被重復(fù)調(diào)用!

如何你的mixin當(dāng)中包含生命周期方法,不要焦急,你仍然可以在你的組件中使用這些方法,而且它們都會(huì)被調(diào)用:

JSFiddle 示例:展示了兩個(gè) default props 都會(huì)被設(shè)置

兩個(gè)getDefaultProps方法都將被調(diào)用,所以我們可以得到默認(rèn)為Skippyname屬性和默認(rèn)為Pancakesfood屬性。任何一個(gè)生命周期方法或?qū)傩远紩?huì)被順利地重復(fù)調(diào)用,但是下面的情況除外:

render:包含多個(gè)render方法是不行的。React 會(huì)跑出異常:

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:你多次的對(duì)它進(jìn)行設(shè)置是沒有問題的,但是,最終的結(jié)果只以最后一次設(shè)置為準(zhǔn)。

需要指出的是,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);

程序會(huì)在控制臺(tái)打印出asdas。

包含多個(gè) Mixins

我們的mixins要包裹在數(shù)組當(dāng)中,提醒了我們可以在組件中包含多個(gè)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}

); } });
注意事項(xiàng)

這里有幾件事需要引起我們的注意,當(dāng)我們使用mixins的時(shí)候。 幸運(yùn)地是,這些看起來(lái)并不是什么大問題,下面是我們?cè)趯?shí)踐當(dāng)中發(fā)現(xiàn)的一些問題:

設(shè)置相同的 Prop 和 State

如果你嘗試在不同的地方定義相同的屬性時(shí)會(huì)出現(xiàn)下面的異常:

Uncaught Error: Invariant Violation: mergeObjectsWithNoDuplicateKeys(): 
Tried to merge two objects with the same key: name
設(shè)置相同的方法

在不同的mixin中定義相同的方法,或者mixin和組件中包含了相同的方法時(shí),會(huì)拋出異常:

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方法時(shí)拋出的異常一樣:

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.
多個(gè)生命周期方法的調(diào)用順序

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

我們的mixin方法首先會(huì)被調(diào)用,然后再是組件的中方法被調(diào)用。

那當(dāng)我們的組件中包含多個(gè)mixin,而這些mixin中又包含相同的生命周期方法時(shí),調(diào)用順序又是如何?

它們會(huì)根據(jù)mixins中的順序從左到右的進(jìn)行調(diào)用。

實(shí)例代碼:

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");
    },
    ...

控制臺(tái)將輸出:

another mixin mount method
mixin mount method 
component one mount method

mixin mount method
another mixin mount method 
component two mount method
總結(jié)

Mixin 使你React程序變得更為可重用,It"s a Good Thing.
我希望這篇文章能夠?qū)δ阌兴鶐椭绻腥魏畏答?,很高興你能夠在twitter上@veddermatic

原文鏈接:http://simblestudios.com/blog...

翻譯水平有限,文中帶有個(gè)人理解,如有不恰當(dāng)?shù)牡胤?,?qǐng)?jiān)谠u(píng)論中指出,非常感謝!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/85837.html

相關(guān)文章

  • []Mixin 函數(shù)

    摘要:函數(shù)通常是面向?qū)ο缶幊田L(fēng)格,具有副作用。因?yàn)樵诤瘮?shù)式編程中,很有可能這些引用指向的并不是同一個(gè)對(duì)象。記住,函數(shù)并不意味著函數(shù)式編程。函數(shù)可以用函數(shù)式編程風(fēng)格編寫,避免副作用并不修改參數(shù),但這并不保證。 軟件構(gòu)建系列 原文鏈接:Functional Mixins 譯者注:在編程中,mixin 類似于一個(gè)固有名詞,可以理解為混合或混入,通常不進(jìn)行直譯,本文也是同樣。 這是軟件構(gòu)建系列教...

    zxhaaa 評(píng)論0 收藏0
  • []看這些文章,足夠你學(xué)好redux

    摘要:原文地址我想分享一些文章,來(lái)幫你學(xué)習(xí)的概念和架構(gòu)在開始之前我們先來(lái)看這兩篇文章,用代替和然后我們通過(guò)一個(gè)代碼教程我翻譯地址深入了解,然后看一看超級(jí)介紹完成你對(duì)的探索之旅現(xiàn)在是時(shí)候去學(xué)習(xí)和再往前走理解并且看一看關(guān)于的一切注盡量中文地址的我用的 原文地址 我想分享一些文章,來(lái)幫你學(xué)習(xí)redux的概念和架構(gòu) 在開始redux之前我們先來(lái)看這兩篇文章,用High Order Component...

    fengxiuping 評(píng)論0 收藏0
  • React Mixin 前世今生

    摘要:但非常不幸,并不原生支持。這個(gè)單詞相信都很熟悉,高階函數(shù)在函數(shù)式編程是一個(gè)基本概念,它描述的是這樣一種函數(shù),接受函數(shù)作為輸入,或是輸出一個(gè)函數(shù)。比如常用的工具方法都是高階函數(shù)。恰與的定義完全一致。這種不同很可能會(huì)導(dǎo)致問題的產(chǎn)生。 在 React component 構(gòu)建過(guò)程中,常常有這樣的場(chǎng)景,有一類功能要被不同的 Component 公用,然后看得到文檔經(jīng)常提到 Mixin(混入) ...

    姘存按 評(píng)論0 收藏0
  • 2017-06-15 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選十問幫你理清前端工程師及大前端團(tuán)隊(duì)的成長(zhǎng)問題譯讀完細(xì)則之后學(xué)到的件事掘金怎么寫一個(gè)組件庫(kù)一眾成翻譯還有這操作一個(gè)能生成思維導(dǎo)圖的開源搜索引擎知乎專欄中文前端推薦第天值得收藏的基礎(chǔ)教程知乎專欄第期沒有的一天轉(zhuǎn)載中回調(diào)地 2017-06-15 前端日?qǐng)?bào) 精選 十問sofish:幫你理清前端工程師及大前端團(tuán)隊(duì)的成長(zhǎng)問題![譯] 讀完 flexbox 細(xì)則之后學(xué)到的 11 件事 -...

    Benedict Evans 評(píng)論0 收藏0
  • 學(xué)習(xí) underscore 源碼整體架構(gòu),打造屬于自己函數(shù)式編程類庫(kù)

    摘要:譯立即執(zhí)行函數(shù)表達(dá)式處理支持瀏覽器環(huán)境微信小程序。學(xué)習(xí)整體架構(gòu),利于打造屬于自己的函數(shù)式編程類庫(kù)。下一篇文章可能是學(xué)習(xí)的源碼整體架構(gòu)。也可以加微信,注明來(lái)源,拉您進(jìn)前端視野交流群。 前言 上一篇文章寫了jQuery整體架構(gòu),學(xué)習(xí) jQuery 源碼整體架構(gòu),打造屬于自己的 js 類庫(kù) 雖然看過(guò)挺多underscore.js分析類的文章,但總感覺少點(diǎn)什么。這也許就是紙上得來(lái)終覺淺,絕知此...

    junnplus 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<