成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Vue.js-組件詳解

jeffrey_up / 3507人閱讀

摘要:事件總線事件總線首先創(chuàng)建了一個名為的空的實例然后全局定義了組件最后創(chuàng)建了實例。在父組件模板中,子組件標簽上使用指定一個名稱,并在父組件內(nèi)通過來訪問指定名稱的子組件。

學習筆記:組件詳解
組件詳解 組件與復用

Vue組件需要注冊后才可以使用。注冊有全局注冊和局部注冊兩種方式。

全局注冊

Vue.component("my-component", {});

要在父實例中使用這個組件,必須要在實例創(chuàng)建前注冊,之后就可以用的形式來使用組件。

Vue.component("my-component", {
    template: `
這是一個組件
` });

template的DOM結構必須被一個元素包含,缺少

會無法渲染并報錯。

在Vue實例中,使用components選項可以局部注冊組件,注冊后的組件只在該實例作用域下有效。

組件中也可以使用components選項來注冊組件,使組件可以嵌套。

var Child = {
    template: `
局部注冊組件的內(nèi)容
` }; new Vue({ el: "#app", components: { "my-component": Child }, });

Vue組件的模板在某些情況下會受到HTML的限制,比如

內(nèi)規(guī)定只允許是

    <
    、等這些表格元素,所以在內(nèi)直接使用組件時無效的。這種情況下,可以使用特殊的is屬性來掛載組件。

    Vue.component("my-component", { template: `
    這里是組件內(nèi)容
    ` });

    常見的限制元素還有

      、
        、 props: ["message"], template: `
        {{message}}
        `, data: { parentMessage: "" }

        這里用v-model綁定了父級的數(shù)據(jù)parentMessage,當通過輸入框任意輸入時,子組件接收到的props["message"]也會實時響應,并更新組件模板。

        單向數(shù)據(jù)流

        業(yè)務中會經(jīng)常遇到兩種需要改變prop的情況,一種是父組件傳遞初始值進來,子組件將它作為初始值保存起來,在自己的作用域下可以隨意使用和修改。這種情況可以在組件data內(nèi)再聲明一個數(shù)據(jù),引用父組件的prop。

        Vue.component("my-component", { props: ["initCount"], template: `
        {{count}}
        `, data() { return { count:this.initCount } } });

        組件中聲明了數(shù)據(jù)count,它在組件初始化時會獲取來自父組件的initCount,之后就與之無關了,只用維護count,這樣就可以避免直接操作initCount。

        另一種情況就是prop作為需要被轉(zhuǎn)變的原始值傳入,這種情況用計算屬性就可以。

        Vue.component("my-component", { props: ["width"], template: `
        組件內(nèi)容
        `, computed: { style: function () { return { width: this.width + "px" } } } });

        因為用CSS傳遞寬度要帶單位(px),數(shù)值計算一般不帶單位,所以統(tǒng)一在組件內(nèi)使用計算屬性。

        在JavaScript中對象和數(shù)組時引用類型,指向同一個內(nèi)存空間,所以props是對象和數(shù)組時,在子組件內(nèi)改變是會影響父組件。
        數(shù)組驗證

        prop需要驗證時,需要對象寫法。

        一般當組件需要提供給別人使用時,推薦都進行數(shù)據(jù)驗證。比如某個數(shù)據(jù)必須是數(shù)字類型,如果傳入字符串,就會在控制臺彈出警告。

        See the Pen prop by whjin (@whjin) on CodePen.


        在改變組件的data "counter"后,通過$emit()再把它傳遞給父組件,父組件用@increase@reduce$emit()方法的第一個參數(shù)是自定義事件的名稱。

        除了用v-on在組件上監(jiān)聽自定義事件外,也可以監(jiān)聽DOM事件,這時可以用.native修飾符表示監(jiān)聽時一個原生事件,監(jiān)聽的是該組件的根元素。

        
        
        使用v-model

        Vue可以在自定義組件上使用v-model指令。

        
        

        組件$emit()的事件名時特殊的input,在使用組件的父級,并沒有在上使用@input="handler",而是直接用了v-model綁定的一個數(shù)據(jù)total。

        
        

        v-model還可以用來創(chuàng)建自定義的表單輸入組件,進行數(shù)據(jù)雙向綁定。

        See the Pen v-model雙向綁定 by whjin (@whjin) on CodePen.


        $broadcast()是由上級向下級廣播事件,用法完全一致,方向相反。

        這兩種方法一旦發(fā)出事件后,任何組件都可以接收到,就近原則,而且會在第一次接收到后停止冒泡,除非返回true。

        這些方法在Vue 2.x版本中已廢棄。

        在Vue 2.x中,推薦任何一個空的Vue實例作為中央事件總線(bus),也就是一個中介。

        See the Pen Vue-bus事件總線 by whjin (@whjin) on CodePen.


        在父組件模板中,子組件標簽上使用ref指定一個名稱,并在父組件內(nèi)通過this.$refs來訪問指定名稱的子組件。

        $refs只在組件渲染完成后才填充,并且它是非響應式的。它僅僅作為一個直接訪問子組件的應急方案,應當避免在模板或計算屬性中使用$refs

        Vue 2.x將v-elv-ref合并成ref,Vue會自動去判斷是普通標簽還是組件。

        使用slot分發(fā)內(nèi)容

        當需要讓組件組合使用,混合父組件的內(nèi)容與子組件的模板時,就會用到slot,這個過程叫做內(nèi)容分發(fā)。

        組件不知道它的掛載點會有什么內(nèi)容。掛載點的內(nèi)容是由的父組件決定的。

        組件很可能有它自己的模板。

        props傳遞數(shù)據(jù)、events觸發(fā)事件和slot內(nèi)容分發(fā)就構成了Vue組件的3個API來源,再復雜的組件也是由這3部分構成。

        作用域

        父組件中的模板:

        
            {{message}}
        
        

        這里的message就是一個slot,但是它綁定的是父組件的數(shù)據(jù),而不是組件的數(shù)據(jù)。

        父組件模板的內(nèi)容是在父組件作用域內(nèi)編譯,子組件模板的內(nèi)容是在子組件作用域內(nèi)編譯。

        Vue.component("child-component", { template: `
        子組件1
        `, }); var app = new Vue({ el: "#app", data: { showChild: true } });

        這里的狀態(tài)showChild綁定的是父組件的數(shù)據(jù)。

        在子組件上綁定數(shù)據(jù):

        Vue.component("child-component", { template: `
        子組件
        `, data() { return { showChild: true } } }); var app = new Vue({ el: "#app", });

        因此,slot分發(fā)的內(nèi)容,作用域是在父組件上。

        單個slot

        在子組件內(nèi)使用特殊的元素就可以為這個組件開啟一個slot(插槽),在父組件模板里,插入在子組件標簽內(nèi)的所有內(nèi)容將替代子組件的標簽及它的內(nèi)容。

        分發(fā)的內(nèi)容

        更多分發(fā)的內(nèi)容

        Vue.component("child-component", { template: `

        如果沒有父組件插入內(nèi)容,我將作為默認出現(xiàn)。

        `, }); var app = new Vue({ el: "#app", });

        子組件child-component的模板內(nèi)定義了一個元素,并且用一個

        作為默認的內(nèi)容,在父組件沒有使用slot時,會渲染這段默認的文本;如果寫入了slot,就會替換整個

        子組件內(nèi)的備用內(nèi)容,它的作用域是子組件本身。
        具名Slot

        元素指定一個name后可以分發(fā)多個內(nèi)容,具名slot可以與單個slot共存。

        See the Pen Vue-slot by whjin (@whjin) on CodePen.


        通過$slots可以訪問某個具名slot,this.$slots.default包括了所有沒有被包含在具名slot中的節(jié)點。

        組件高級用法 遞歸組件

        給組件設置name選項,組件在它的模板內(nèi)可以遞歸地調(diào)用自己。

        Vue.component("child-component", { name: "child-component", props: { count: { type: Number, default: 1 } }, template: `
        `, });

        組件遞歸使用可以用來開發(fā)一些具有未知層級關機的獨立組件,比如級聯(lián)選擇器和樹形控件等。

        內(nèi)聯(lián)模板

        組件的模板一般都是在template選項內(nèi)定義的,Vue提供了一個內(nèi)聯(lián)模板的功能,在使用組件時,給組件標簽使用inline-template特性,組件就會把它的內(nèi)容當做模板,而不是把它當內(nèi)容分發(fā),這讓模板更靈活。

        See the Pen Vue-inline-template by whjin (@whjin) on CodePen.


        可以直接綁定在組件對象上:

        var Home = { template: `

        Welcome home!

        ` }; var app = new Vue({ el: "#app", data: { currentView: Home } });
        異步組件

        Vue.js允許將組件定義為一個工廠函數(shù),動態(tài)地解析組件。

        Vue.js只在組件需要渲染時觸發(fā)工廠函數(shù),并且把結果緩存起來,用于后面的再次渲染。

        Vue.component("child-component", function (resolve, reject) { window.setTimeout(function () { resolve({ template: `
        我是異步渲染的!
        ` }) }, 1000) }); var app = new Vue({ el: "#app", });

        工廠函數(shù)接收一個resolve回調(diào),在收到從服務器下載的組件定義時調(diào)用。也可以調(diào)用reject(reason)指示加載失敗。

        其他 $nextTick

        異步更新隊列

        Vue在觀察到數(shù)據(jù)變化時并不是直接更新DOM,而是開啟一個隊列,并緩沖在同一個事件循環(huán)中發(fā)生的所有數(shù)據(jù)變化。在緩沖時會去除重復數(shù)據(jù),從而避免不必要的計算和DOM操作。然后,在一下個事件循環(huán)tick中,Vue刷新隊列并執(zhí)行實際(已去重的)工作。

        Vue會根據(jù)當前瀏覽器環(huán)境優(yōu)先使用原生的Promise.thenMutationObserver,如果都不支持,就會采用setTimeout代替。

        $nextTick就是用來確定什么時候DOM更新已經(jīng)完成。

        See the Pen Vue-$nextTick by whjin (@whjin) on CodePen.


        Vue.component("my-component", { template: `#my-component`, }); var app = new Vue({ el: "#app", }); 手動掛載實例

        在一些非常特殊的情況下,需要動態(tài)地創(chuàng)建Vue實例,Vue提供了Vue.extend$mount兩個方法來手動掛載一個實例。

        Vue.extend是基礎Vue構造器,創(chuàng)建一個“子類”,參數(shù)是一個包含組件選項的對象。

        如果Vue實例在實例化時沒有收到el選項,它就處于“未掛載”狀態(tài),沒有關聯(lián)的DOM元素??梢允褂?b>$mount手動地掛載一個未掛載的實例。這個方法返回實例自身,因而可以鏈式調(diào)用其他實例方法。

        See the Pen Vue-$mount by whjin (@whjin) on CodePen.


        閱讀需要支付1元查看