vue.js - 組件數據流

一勿决、組件

組件茫船,可以說是現代前端框架中必不可少的組成部分琅束。使用組件,不僅能極大地提高代碼的復用率和開發(fā)者的開發(fā)效率算谈,對于代碼后期的維護也有著非常重要的意義涩禀。前端開發(fā),由于歷史遺留原因然眼,WebComponent 雖然好用艾船,但其發(fā)展情況卻受到極大地限制,和很多新興的前端技術一樣高每,可望而不可即屿岂。基于這樣的情況鲸匿,聰明的開發(fā)者們嘗試通過框架內部集成相應的功能來完成組件化爷怀,各種現代前端框架基本上都有各自的實現。這里我們來分析一下 vue 的組件晒骇,重點關注數據的流向霉撵。

二磺浙、vue 組件

vue 的組件,創(chuàng)建模板的時候是基于普通的 html 的徒坡,不需要學習 jsx撕氧、handlebars 等的特殊語法,所以相對來說喇完,學習成本比較低伦泥,更容易上手。使用 vue 組件的時候锦溪,一般分為組件注冊和組件調用兩個部分不脯。

(一)組件注冊

Vue.component('pop-box', {
    template:   '<div class="component-box">\
        <div class="component-content">\
        ..........
        </div>\
    </div>',

    props: [...],

    data: function () {
        return ...;
    },

    methods: {
        ...
    },

    mounted () {
        ...
    },

    ...
});

利用 Vue.component 方法我們可以很輕松的創(chuàng)建一個全局可用的組件,當然也可以在實例或組件內部注冊局部組件刻诊,但原理大同小異防楷。Vue.component 的第一個參數是組件的名字,或者說唯一標識符(id)则涯,后續(xù)調用它將通過這個名字進行調用复局;第二個參數是一個對象,通常它包含了模板(template)粟判、組件內維護的數據(data亿昏、computed)、方法(methods)档礁、鉤子函數(created 角钩、 mounted...)等關鍵信息。
值得注意的是:

  • 組件內的 data 必須是一個函數呻澜,它的返回值將作為實際的 “data”递礼;
  • vue1.x 和 vue2.x 的鉤子函數略有不同,如果發(fā)現鉤子函數不生效易迹,記得確認 vue 的版本宰衙。

(二)組件調用

(1)開始標簽 + 結束標簽模式

    <pop-box text="200" v-bind:number="200"></pop-box>

(2)無結束標簽模式

    <pop-box text="200" v-bind:number="200" />

調用 vue 組件有以上兩種模式。兩種模式上睹欲,如果沒有使用 slot 那么實際上并沒有任何區(qū)別供炼,但如果需要使用 slot 的時候,便只能使用同時包含開始標簽和結束標簽的模式窘疮。
值得注意的是袋哼,上面綁定數據的時候,直接采用 property="value" 的形式闸衫,不管 value 是數字還是字符串涛贯,property 最終都是字符串類型。如果想讓其變成數字類型蔚出,請使用 v-bind:property="value" 的形式弟翘,或者簡寫為 :property="value" 虫腋。

三、vue 組件數據流

vue 遵循了典型的單向數據流的原則稀余,即數據總是由父組件傳遞到子組件悦冀,子組件在其內部可以有自己維護的數據,但它無權修改父組件傳遞給它的數據睛琳,當開發(fā)者嘗試這樣做的時候盒蟆,vue 將會報錯。這樣做的好處是师骗,防止多個子組件都嘗試修改父組件狀態(tài)時历等,讓這一行為變得難以追溯。vue 中具體實現方式如下:

component.png

父組件通過綁定 props 的方式辟癌,將數據傳遞給子組件寒屯,但是子組件自己并沒有權利修改這些數據,如果要修改愿待,只能把修改這一個行為通過 event 的方式報告給父組件浩螺,由父組件本身決定該如何處理數據。

(一)簡單實例

<div id="app">
    <my-counter @inc="increase" :counter="counter"></my-counter>
</div>
...
Vue.component('my-counter', {
    template:   '<div class="counter">\
        <div>{{counter}}</div>\
        <button @click="inc">increase</button>\
    </div>',

    props: ['counter'],

    methods: {
        inc: function () {
            this.$emit('inc');
        }
    }
});

var app = new Vue({
    el: '#app',
    data: {
        counter: 0
    },
    methods: {
        increase () {
            this.counter ++;
        }
    }
});

為了顯得更簡單這里只創(chuàng)建了一個 my-counter 組件作為子組件仍侥,我們可以姑且將 vue 的實例認為是一個父組件。點擊這里查看 demo

(二)分析數據流向分析

  • (1)我們在父組件中定義了一個數據叫 counter鸳君;
  • (2)調用組件的時候农渊,通過 :counter="counter" 的方式,將父組件的 counterprop 的方式傳遞到子組件中或颊;
  • (3)子組件讀取到 counter砸紊,并將其展示在模板中;
  • (4)用戶點擊按鈕囱挑,counter 需要增加醉顽;
  • (5)子組件監(jiān)聽到這個事件,但它并不直接修改 counter平挑,而是通過 this.$emit('inc'); 以自定義事件的形式游添,將需要增加的這一個事件報告給父組件;
  • (6)父組件中通熄,由于通過執(zhí)行過 @inc="increase" 唆涝,能夠監(jiān)聽到子組件報告過來的事件,并在自己的 increase 方法中唇辨,實現 counter 的增加廊酣;
  • (7)父組件里的數據更新了,子組件里的數據也將自動更新赏枚,同時也將更新界面內容亡驰,這一過程由框架自動完成晓猛。

(三)總結

上面這一個示例,基本完整展示了 vue 主要的數據流向凡辱,但是這種基于 prop/evnet 的方式僅適用于存在直接的父子關系的組件戒职,兄弟組件或者大量組件的數據流向如果再基于這種方式將會變得非常麻煩,這時可以考慮使用更加強大的狀態(tài)管理模式煞茫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末帕涌,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子续徽,更是在濱河造成了極大的恐慌蚓曼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钦扭,死亡現場離奇詭異纫版,居然都是意外死亡,警方通過查閱死者的電腦和手機客情,發(fā)現死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門其弊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膀斋,你說我怎么就攤上這事梭伐。” “怎么了仰担?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵糊识,是天一觀的道長。 經常有香客問我摔蓝,道長赂苗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任贮尉,我火速辦了婚禮拌滋,結果婚禮上,老公的妹妹穿的比我還像新娘猜谚。我一直安慰自己败砂,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布龄毡。 她就那樣靜靜地躺著吠卷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沦零。 梳的紋絲不亂的頭發(fā)上祭隔,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音,去河邊找鬼疾渴。 笑死千贯,一個胖子當著我的面吹牛,可吹牛的內容都是我干的搞坝。 我是一名探鬼主播搔谴,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桩撮!你這毒婦竟也來了敦第?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤店量,失蹤者是張志新(化名)和其女友劉穎芜果,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體融师,經...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡右钾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了旱爆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舀射。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖怀伦,靈堂內的尸體忽然破棺而出脆烟,到底是詐尸還是另有隱情,我是刑警寧澤房待,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布浩淘,位于F島的核電站,受9級特大地震影響吴攒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜砂蔽,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一洼怔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧左驾,春花似錦镣隶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帆吻,卻和暖如春域那,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猜煮。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工次员, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留败许,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓淑蔚,卻偏偏與公主長得像市殷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刹衫,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容