一種適應(yīng)性較好的擴(kuò)展Vue組件的方式(已過時(shí)

曾幾何時(shí)我們這樣做

多少次我們打算擴(kuò)展第三方Vue組件的時(shí)候是用這種方式:

// 已知有一個(gè)第三方組件  some-3rd-component
<templete>
    <some-3rd-component></some-3rd-component>
</templete>

<script>
...
some codes 寫下我們需要的功能代碼
...
</script>

但是這種方式有重大缺陷

  1. 第三方組件的事件蝶糯、屬性洋只、方法 等都被隱藏了
  2. 重新暴露十分麻煩,效率低下,可能需要大量復(fù)制粘貼
  3. 本質(zhì)是封裝而非擴(kuò)展

有什么辦法可以做到低侵入识虚、適應(yīng)性好肢扯、可以擴(kuò)展功能、又不影響被擴(kuò)展的組件呢担锤?

比如說以下場(chǎng)景

舉個(gè)例子比如已有一個(gè)ElementUi組件: el-select蔚晨,這個(gè)組件有一個(gè)缺陷,無法獲知選中的下拉選項(xiàng)在數(shù)組中的位置肛循。
比如說我有個(gè)數(shù)組

[{name:'廣州',code:'Guangzhou',population:'10'},
{name:'上海',code:'Shanghai',population:'11'},
{name:'北京',code:'Beijing',population:'12'}]

我希望在選擇完城市之后铭腕,獲的選中城市的population屬性的值,要怎么辦育拨?
至少在成文的這個(gè)時(shí)間里谨履,el-select 還沒有方便的辦法。

introducing vue mixin

minxin 官方文檔的描述是這樣的:

混入 (mixin) 提供了一種非常靈活的方式熬丧,來分發(fā) Vue 組件中的可復(fù)用功能笋粟。一個(gè)混入對(duì)象可以包含任意組件選項(xiàng)。當(dāng)組件使用混入對(duì)象時(shí)析蝴,所有混入對(duì)象的選項(xiàng)將被“混合”進(jìn)入該組件本身的選項(xiàng)害捕。

使用Vuez自帶的mixin在擴(kuò)展組件的時(shí)候十分好用,它避免了前文中的缺陷闷畸,可以恰當(dāng)?shù)貙?shí)現(xiàn)我們所要的功能

我們要做的是尝盼,建立一個(gè)自定義組件,然后把想要擴(kuò)展的組件"mixin"進(jìn)來佑菩。

* 說點(diǎn)題外話盾沫,如果你的ElementUi是全局引入的,那么你也許不能直接通過 import 來引入一個(gè)組件對(duì)象

import Vue from 'vue';

var elSelect = Vue.component('ElSelect'); // 引入要擴(kuò)展的對(duì)象

export default {
  name: 'ElSelectEx',
  mixins: [elSelect],
  watch: {
    selected: function (val, oldVal) {
      let oldSelected = this.selectEx.selectedIndexes;
      let selectedIndex = this.getSelectedIndex(val);
      this.selectEx.selectedIndexes = selectedIndex;
      if (oldSelected !== undefined && oldSelected !== null) {
        // 剛初始化沒有值殿漠,就不發(fā)布更新了
        this.$emit('selectedIndexChanged', selectedIndex, oldSelected);
      }
    },
  },
  data() {
    return {
      selectEx: {
        selectedIndexes: null,
      }
    }
  },
  methods: {
    getSelectedIndex(selected) {
      if (this.multiple) {
        let result = [];
        selected.forEach(item => {
          result.push(this.options.indexOf(item))
        });
        return result;
      } else {
        return this.options.indexOf(selected);
      }
    }
  }
}

使用時(shí)赴精,跟原來的 el-select 沒什么兩樣,但是現(xiàn)在多了一個(gè)事件 selectedIndexChanged绞幌,當(dāng)選中項(xiàng)變化時(shí)蕾哟,可以在事件參數(shù)中獲得選中項(xiàng)的下標(biāo)

<template>
  <div>
    <el-select-ex v-model="selected" @selectedIndexChanged="selectIndexChange">
      <el-option v-for="item in options" :value="item.code" :label="item.name"></el-option>
    </el-select-ex>
  </div>
</template>

...
data(){
  return{
    options:[{name:'廣州',code:'Guangzhou',population:'10'},
            {name:'上海',code:'Shanghai',population:'11'},
            {name:'北京',code:'Beijing',population:'12'}]
    }
}
methods:{
  selectIndexChange(val,oldVal){
    console.info(this.options[val].population);
  }
}



后續(xù)

1 這種擴(kuò)展方式也有一個(gè)缺陷,就是不能自如地修改布局莲蜘,如果硬要改的話谭确,要不重新寫render要不復(fù)制一份<template>,還是有點(diǎn)蛋疼
2 使用 extends可以達(dá)到相同的效果


后續(xù)2
vue 還提供了 $attrs 獲取綁定的屬性
可以通過 v-bind="$attrs"傳入內(nèi)部組件
以及 $listeners 獲取綁定的事件
可以通過 v-on="$listeners" 傳入內(nèi)部組件

讓創(chuàng)造基于其他組件庫(kù)的組件更加便利

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末票渠,一起剝皮案震驚了整個(gè)濱河市逐哈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌问顷,老刑警劉巖昂秃,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薯鼠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡械蹋,警方通過查閱死者的電腦和手機(jī)出皇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哗戈,“玉大人郊艘,你說我怎么就攤上這事∥ㄒВ” “怎么了纱注?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)胆胰。 經(jīng)常有香客問我狞贱,道長(zhǎng),這世上最難降的妖魔是什么蜀涨? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任瞎嬉,我火速辦了婚禮,結(jié)果婚禮上厚柳,老公的妹妹穿的比我還像新娘氧枣。我一直安慰自己,他們只是感情好别垮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布便监。 她就那樣靜靜地躺著,像睡著了一般碳想。 火紅的嫁衣襯著肌膚如雪烧董。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天胧奔,我揣著相機(jī)與錄音逊移,去河邊找鬼。 笑死葡盗,一個(gè)胖子當(dāng)著我的面吹牛螟左,可吹牛的內(nèi)容都是我干的啡浊。 我是一名探鬼主播觅够,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼巷嚣!你這毒婦竟也來了喘先?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤廷粒,失蹤者是張志新(化名)和其女友劉穎窘拯,沒想到半個(gè)月后红且,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涤姊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年暇番,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片思喊。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壁酬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恨课,到底是詐尸還是另有隱情舆乔,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布剂公,位于F島的核電站希俩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纲辽。R本人自食惡果不足惜颜武,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拖吼。 院中可真熱鬧盒刚,春花似錦、人聲如沸绿贞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽籍铁。三九已至涡上,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拒名,已是汗流浹背吩愧。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留增显,地道東北人雁佳。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像同云,于是被迫代替她去往敵國(guó)和親糖权。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Vue 實(shí)例 屬性和方法 每個(gè) Vue 實(shí)例都會(huì)代理其 data 對(duì)象里所有的屬性:var data = { a:...
    云之外閱讀 2,207評(píng)論 0 6
  • 本文為2016年11月9日炸站,『前端之巔』微信群在線分享活動(dòng)總結(jié)整理而成星澳,轉(zhuǎn)載請(qǐng)?jiān)谖恼麻_頭處注明來自『前端之巔』公眾...
    尾尾閱讀 10,599評(píng)論 3 32
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容旱易。關(guān)于...
    云之外閱讀 5,050評(píng)論 0 29
  • 從接觸angularjs1.x開始禁偎,使用并開發(fā)過很多組件和指令腿堤,它能極大的擴(kuò)展web的業(yè)務(wù)處理能力,而且代碼很簡(jiǎn)潔...
    老鼠AI大米_Java全棧閱讀 3,127評(píng)論 0 4
  • 以下內(nèi)容是我在學(xué)習(xí)和研究Vue時(shí)如暖,對(duì)Vue的特性笆檀、重點(diǎn)和注意事項(xiàng)的提取、精練和總結(jié)盒至,可以做為Vue特性的字典误债; 1...
    科研者閱讀 14,077評(píng)論 3 24