1.開篇:Vue.js 的精髓——組件

開篇:Vue.js 的精髓——組件

寫在前面

Vue.js把还,無疑是當(dāng)下最火熱的前端框架 Almost校焦,而 Vue.js 最精髓的,正是它的組件與組件化艘包。寫一個 Vue 工程的猛,也就是在寫一個個的組件。

業(yè)務(wù)場景是千變?nèi)f化的想虎,而不變的是 Vue.js 組件開發(fā)的核心思想和使用技巧卦尊,掌握了 Vue.js 組件的各種開發(fā)模式,再復(fù)雜的業(yè)務(wù)場景也可以輕松化解舌厨。本小冊則著重介紹筆者在 3 年的 Vue.js 開發(fā)及兩年的 iView 開源中積累和沉淀的對 Vue.js 組件的見解和經(jīng)驗猫牡。

本小冊不會介紹 Vue.js 的基礎(chǔ)用法,因為市面上已經(jīng)沉淀了大量的相關(guān)技術(shù)資料邓线,而且 Vue.js 的文檔已經(jīng)足夠詳細(xì)。如果您尚未接觸 Vue.js 或正打算開始了解煌恢,推薦您先閱讀筆者出版的《Vue.js 實戰(zhàn)》(清華大學(xué)出版社)一書骇陈,它適合剛接觸 Vue.js 的開發(fā)者。因此你雌,本小冊適合已經(jīng)了解或使用過 Vue.js 的開發(fā)者。

這一節(jié)婿崭,我們先籠統(tǒng)地聊聊 Vue.js 組件和組件化以及本小冊各章節(jié)的梳理肴颊。

組件的分類

一般來說氓栈,Vue.js 組件主要分成三類:

  1. vue-router 產(chǎn)生的每個頁面,它本質(zhì)上也是一個組件(.vue)婿着,主要承載當(dāng)前頁面的 HTML 結(jié)構(gòu)授瘦,會包含數(shù)據(jù)獲取、數(shù)據(jù)整理形纺、數(shù)據(jù)可視化等常規(guī)業(yè)務(wù)。整個文件相對較大徒欣,但一般不會有 props 選項和 自定義事件逐样,因為它作為路由的渲染,不會被復(fù)用打肝,因此也不會對外提供接口。

    在項目開發(fā)中闯睹,我們寫的大部分代碼都是這類的組件(頁面),協(xié)同開發(fā)時始花,每人維護自己的頁面,很少有交集酷宵。這類組件相對是最好寫的躬窜,因為主要是還原設(shè)計稿浇垦,完成需求荣挨,不需要太多模塊和架構(gòu)設(shè)計上的考慮。

  2. 不包含業(yè)務(wù)此虑,獨立口锭、具體功能的基礎(chǔ)組件,比如日期選擇器鹃操、模態(tài)框等。這類組件作為項目的基礎(chǔ)控件荆隘,會被大量使用,因此組件的 API 進(jìn)行過高強度的抽象莫其,可以通過不同配置實現(xiàn)不同的功能。比如筆者開源的 iView乱陡,就是包含了 50 多個這樣基礎(chǔ)組件的 UI 組件庫。

    每個公司都有自己的組件使用規(guī)范或組件庫憨颠,但要開發(fā)和維護一套像 iView 這樣的組件庫胳徽,投入的人力和精力還是很重的爽彤,所以出于成本考慮,很多項目都會使用已有的開源組件庫适篙。

    獨立組件的開發(fā)難度要高于第一類組件,因為它的側(cè)重點是 API 的設(shè)計聂儒、兼容性硫痰、性能、以及復(fù)雜的功能效斑。這類組件對 JavaScript 的編程能力有一定要求,也會包含非常多的技巧奇昙,比如在不依賴 Vuex 和 Bus(因為獨立組件敌完,無法依賴其它庫)的情況下,各組件間的通信蠢挡,還會涉及很多腦殼疼的邏輯凳忙,比如日期選擇器要考慮不同時區(qū)、國家的日歷習(xí)慣勤家,支持多種日期格式柳恐。

    本小冊也會重點介紹此類組件的各種開發(fā)模式和技巧热幔,對應(yīng)不同的模式讼庇,會帶有具體的組件實戰(zhàn)。

  3. 業(yè)務(wù)組件蠕啄。它不像第二類獨立組件只包含某個功能,而是在業(yè)務(wù)中被多個頁面復(fù)用的和媳,它與獨立組件的區(qū)別是哈街,業(yè)務(wù)組件只在當(dāng)前項目中會用到,不具有通用性骚秦,而且會包含一些業(yè)務(wù),比如數(shù)據(jù)請求帝牡;而獨立組件不含業(yè)務(wù)蒙揣,在任何項目中都可以使用,功能單一懒震,比如一個具有數(shù)據(jù)校驗功能的輸入框。

    業(yè)務(wù)組件更像是介于第一類和第二類之間瓷炮,在開發(fā)上也與獨立組件類似递宅,但寄托于項目,你可以使用項目中的技術(shù)棧办龄,比如 Vuex、axios安接、echarts 等英融,所以它的開發(fā)難度相對獨立組件要容易點歇式,但也有必要考慮組件的可維護性和復(fù)用性胡野。

小冊的內(nèi)容

因為本小冊是圍繞 Vue.js 組件展開的,所以第二節(jié)會講解 Vue.js 組件的三個 API:prop给涕、event够庙、slot,當(dāng)然耘眨,如果你已經(jīng)開發(fā)過一些獨立組件,完全可以跳過這節(jié)內(nèi)容胆屿。

3 - 7 小節(jié)會介紹組件間通信的一些方法和黑科技偶宫,一部分是 Vue.js 內(nèi)置的,一部分是自行實現(xiàn)的纯趋,在實際開發(fā)中,會非常實用纯命。同時也利用這些方法完成了兩個具體的實戰(zhàn)案例:

  1. 具有數(shù)據(jù)校驗功能的表單組件 —— Form痹栖;
  2. 組合多選框組件 —— CheckboxGroup & Checkbox。

本小冊都會以這種核心科技 + 對應(yīng)實戰(zhàn)的形式展開揪阿。

8 - 10 小節(jié)介紹 Vue 的構(gòu)造器 extend 和手動掛載組件 $mount 的用法及案例。Vue.js 除了我們正常 new Vue() 外碍粥,還可以手動掛載的黑毅,這 3 節(jié)將介紹手動掛載一個 Vue 組件的使用場景钦讳。其中涉及到兩個案例:

  1. 動態(tài)渲染 .vue 文件的組件 —— Display枕面;
  2. 全局通知組件 —— $Alert缚去。

Display 組件用于將 .vue 文件渲染出來,線上的案例是 iView Run枕荞,它不需要你重新編譯項目搞动,就可以渲染一個標(biāo)準(zhǔn)的 Vue.js 組件。

$Alert 是全局的通知組件鹦肿,它的調(diào)用方法不同于常規(guī)組件。常規(guī)組件使用方法形如:

<template>
    <Alert content="通知內(nèi)容" :duration="3"></Alert>
</template>
<script>
    import Alert from '../components/alert.vue';
    
    export default {
        components: { Alert }
    }
</script>

$Alert 的調(diào)用更接近 JS 語法:

export default {
    methods: {
        showMessage () {
            this.$Alert({
                content: '通知內(nèi)容',
                duration: 3
            });
        }
    }
}

雖然與常規(guī) Vue 組件調(diào)用方式不同瞭吃,但底層仍然由 Vue 組件構(gòu)成和維護涣旨。

11 - 12 小節(jié)介紹 Render 函數(shù)與 Functional Render,并完成一個能夠渲染自定義列的 Table 組件和蚪。Render 函數(shù)也是 Vue.js 組件重要的一部分穆律,只不過在大多數(shù)業(yè)務(wù)中不常使用。本小節(jié)會介紹它的使用場景峦耘。

13 小節(jié)介紹作用域 slot(slot-scope),并基于這種方法同樣實現(xiàn) Table 組件泣崩。slot 用的很多洛口,但 slot-scope 在業(yè)務(wù)中并不常用,但在一些特定場景下第焰,比如組件內(nèi)部有循環(huán)體時,會非常實用杀赢。

14 - 15 小節(jié)介紹遞歸組件,并完成樹形控件 —— Tree滤淳。

16 - 19 小節(jié)是綜合拓展砌左,會著重講解 Vue.js 容易忽略卻很重要的 API,以及對 Vue.js 面試題的詳細(xì)分析汇歹。除此之外,還會總結(jié)筆者在兩年的 iView 開源經(jīng)歷中的經(jīng)驗煤蹭,除了技術(shù)細(xì)節(jié)外取视,還包括開源項目的持續(xù)性發(fā)展、推廣等作谭。

結(jié)語

三年前,我開始接觸 Vue.js 框架贝或,當(dāng)時就被它的輕量锐秦、組件化和友好的 API 所吸引。與此同時酱床,我也開源了 iView 項目扇谣。三年的磨(cǎi )礪(kēng)昧捷,沉淀了不少關(guān)于 Vue.js 組件的經(jīng)驗罐寨。

本小冊的內(nèi)容也許不會讓你的技術(shù)一夜間突飛猛進(jìn)鸯绿,但絕對使你醍醐灌頂簸淀。

那么毒返,請準(zhǔn)備好一臺電腦和一杯咖啡,一起來探索 Vue.js 的精髓吧饿悬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狡恬,一起剝皮案震驚了整個濱河市蝎宇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姥芥,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庸追,死亡現(xiàn)場離奇詭異台囱,居然都是意外死亡,警方通過查閱死者的電腦和手機咱娶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門强品,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琼了,你說我怎么就攤上這事困曙。” “怎么了慷丽?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵要糊,是天一觀的道長。 經(jīng)常有香客問我,道長勺拣,這世上最難降的妖魔是什么鱼填? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任苹丸,我火速辦了婚禮愤惰,結(jié)果婚禮上赘理,老公的妹妹穿的比我還像新娘。我一直安慰自己奠旺,他們只是感情好施流,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布嫂沉。 她就那樣靜靜地躺著稽寒,像睡著了一般杏糙。 火紅的嫁衣襯著肌膚如雪蚓土。 梳的紋絲不亂的頭發(fā)上宏侍,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天谅河,我揣著相機與錄音确丢,去河邊找鬼。 笑死鲜侥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崎苗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼肌蜻,長吁一口氣:“原來是場噩夢啊……” “哼必尼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起判莉,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤骂租,失蹤者是張志新(化名)和其女友劉穎斑司,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宿刮,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡僵缺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翠胰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片自脯。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锻狗,靈堂內(nèi)的尸體忽然破棺而出焕参,到底是詐尸還是另有隱情,我是刑警寧澤叠纷,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布讲岁,位于F島的核電站衬以,受9級特大地震影響校摩,放射性物質(zhì)發(fā)生泄漏看峻。R本人自食惡果不足惜衙吩,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一坤塞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摹芙,春花似錦、人聲如沸交胚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熬词。三九已至,卻和暖如春互拾,著一層夾襖步出監(jiān)牢的瞬間嚎幸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工或衡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丸升,地道東北人绍刮。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓萄焦,卻偏偏與公主長得像灵妨,于是被迫代替她去往敵國和親柄瑰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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