關于擴展Element組件庫的一些思考

ElementUI是所有Vue組件庫中比較優(yōu)秀的一個杨赤,至今已經(jīng)在github收獲了44.3k個star茧痕,公司幾乎所有的Vue項目都是使用ElementUI作為基礎組件庫,其豐富的組件足以應付大部分交互場景恼除,但是碰到特殊的需求組件庫內(nèi)的組件沒法滿足應用場景我們該怎么辦呢踪旷?這個時候就需要我們動手擴展當前的組件庫來滿足我們的應用場景。

擴展組件庫可能遇到的問題

試想這樣一個場景豁辉,現(xiàn)在項目中要用到日期范圍組件令野,要求開始日期和結束日期可以分別選擇,并且能夠?qū)δ承┤掌谶M行禁用徽级,組件庫里面并沒有這樣的組件气破,你會怎樣實現(xiàn)這樣的需求?

  • 實現(xiàn)這樣一個表單控件餐抢,如何進行表單的驗證现使?
    你需要從element-ui/src/mixins/emitter 引入Emitter這個事件分發(fā)的mixin,當值變化的時候調(diào)用this.dispatch("ElFormItem", "el.form.change", value)來觸發(fā)表單的校驗
  • 組件原有的屬性我該如何在新的組件上繼承使用旷痕?
    這個涉及到組件的屬性值穿透問題碳锈,Vue給我們提供了$attrs,在實際使用過程中欺抗,有些屬性我們并不想從父級作用域傳遞下來售碳,這時候你可以聲明一個計算屬性,對$attrs進行處理绞呈,刪除或者增加你想要的屬性
  • 組件原有的事件偵聽器我該如何在新的組件上繼承使用贸人?
    Vue給我們提供了$listeners,在用法上和屬性基本一致
  • 想讓我們封裝的組件支持v-model命令該怎么做呢佃声?
    可以設置model: { prop: 'value', event: 'change' },當你調(diào)用this.$emit('change',value)的時候艺智,value的值就會被改變,你可以watch這個value屬性秉溉,當值發(fā)生變化的時候力惯,對當前組件的data進行一些操作來滿足一些需求
  • 開發(fā)過程中需要表單組件的一些屬性該怎么辦?
    如果你看過Form組件的源碼召嘶,你會發(fā)現(xiàn)它使用了Vue的provide,inject屬性父晶,對于多層級嵌套的組件,這兩個屬性是很有用的弄跌,可以完成跨多層級的值傳遞甲喝,在我們自己的組件上,下面這段代碼展示了inject有哪些用處
  • 有些時候我們開發(fā)的組件有層級關系铛只,跨組件通信怎么搞定埠胖?
    如果我們自定義的組件相互之間有層級嵌套關系糠溜,可能以slot的形式嵌套,那么除了給組件設置name屬性之外直撤,還需要設置componentName非竿,這個屬性是為了使用broadcast 和 dispatch方法來通信用的
export default {
    inject: {
      elForm: {
        default: ''
      },
      elFormItem: {
        default: ''
      }
    },

    computed: {
      _elFormItemSize() {
        return (this.elFormItem || {}).elFormItemSize;
      },
      validateState() {
        return this.elFormItem ? this.elFormItem.validateState : '';
      },
      needStatusIcon() {
        return this.elForm ? this.elForm.statusIcon : false;
      },
      inputSize() {
        return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
      },
      inputDisabled() {
        return this.disabled || (this.elForm || {}).disabled;
      },
   },

我們可以從父級組件拿到表單的狀態(tài),比如大小谋竖,是否禁用

  • 如何暴露我們的組件以Vue.use的形式來使用
MyComponent.install = function(Vue,options){
     Vue.component(MyComponent,MyComponent.name)
}
export default MyComponent

我們可以這樣使用

Vue.use(MyComponent,options)

結語

擴展組件開發(fā)红柱,需要特別熟悉組件的用法,有些需要深入源碼了解原理蓖乘,根據(jù)原理制定開發(fā)方案锤悄,在探索的過程中,我們會遇到很多問題嘉抒,這時可以去好好看看源碼零聚,或者去github issue列表尋找答案

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市些侍,隨后出現(xiàn)的幾起案子隶症,更是在濱河造成了極大的恐慌,老刑警劉巖娩梨,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沿腰,死亡現(xiàn)場離奇詭異,居然都是意外死亡狈定,警方通過查閱死者的電腦和手機颂龙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纽什,“玉大人措嵌,你說我怎么就攤上這事÷郑” “怎么了企巢?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長让蕾。 經(jīng)常有香客問我浪规,道長,這世上最難降的妖魔是什么探孝? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任笋婿,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己兼砖,他們只是感情好颈娜,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伏伐,像睡著了一般桩警。 火紅的嫁衣襯著肌膚如雪炒瘸。 梳的紋絲不亂的頭發(fā)上捞慌,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天耀鸦,我揣著相機與錄音,去河邊找鬼啸澡。 笑死揭糕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的锻霎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼揪漩,長吁一口氣:“原來是場噩夢啊……” “哼旋恼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奄容,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冰更,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昂勒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜀细,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年戈盈,在試婚紗的時候發(fā)現(xiàn)自己被綠了奠衔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡塘娶,死狀恐怖归斤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刁岸,我是刑警寧澤脏里,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站虹曙,受9級特大地震影響迫横,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酝碳,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一矾踱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧击敌,春花似錦介返、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刃宵。三九已至,卻和暖如春徘公,著一層夾襖步出監(jiān)牢的瞬間牲证,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工关面, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坦袍,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓等太,卻偏偏與公主長得像捂齐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缩抡,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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