• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
    問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
    當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

    Vue組件的使用及個(gè)人理解與介紹

    來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:01:11
    文檔

    Vue組件的使用及個(gè)人理解與介紹

    Vue組件的使用及個(gè)人理解與介紹:組件的基本使用 注冊(cè)組件 注冊(cè)組件就是利用Vue.component()方法,先傳入一個(gè)自定義組件的名字,然后傳入這個(gè)組件的配置。 Vue.component('mycomponent',{ template: `<div>這是一個(gè)自定義組件</div>`, data () { r
    推薦度:
    導(dǎo)讀Vue組件的使用及個(gè)人理解與介紹:組件的基本使用 注冊(cè)組件 注冊(cè)組件就是利用Vue.component()方法,先傳入一個(gè)自定義組件的名字,然后傳入這個(gè)組件的配置。 Vue.component('mycomponent',{ template: `<div>這是一個(gè)自定義組件</div>`, data () { r

    組件的基本使用

    注冊(cè)組件

    注冊(cè)組件就是利用Vue.component()方法,先傳入一個(gè)自定義組件的名字,然后傳入這個(gè)組件的配置。

     Vue.component('mycomponent',{
     template: `<div>這是一個(gè)自定義組件</div>`,
     data () {
     return {
     message: 'hello world'
     }
     }
     })

    如上方式,就已經(jīng)創(chuàng)建了一個(gè)自定義組件,然后就可以在Vue實(shí)例掛在的DOM元素中使用它。

     <div id="app">
     <mycomponent></mycomponent>
     <my-component></my-component>
    </div>
    <script>
     var app = new Vue({
     el: '#app',
     data: {
     },
     components: {
     'my-component': {
     template: `<div>這是一個(gè)局部的自定義組件,只能在當(dāng)前Vue實(shí)例中使用</div>`,
     }
     }
     })
    </script>
    

    直接使用Vue.component()創(chuàng)建的組件,所有的Vue實(shí)例都可以使用。還可以在某個(gè)Vue實(shí)例中注冊(cè)只有自己能使用的組件。

    var app = new Vue({
     el: '#app',
     data: {
     },
     components: {
     'my-component': {
     template: `<div>這是一個(gè)局部的自定義組件,只能在當(dāng)前Vue實(shí)例中使用</div>`,
     }
     }
     })

    模板的要求

    注意:組件的模板只能有一個(gè)根元素。下面的情況是不允許的。

    template: `<div>這是一個(gè)局部的自定義組件,只能在當(dāng)前Vue實(shí)例中使用</div>
     <button>hello</button>`,

    組件中的data必須是函數(shù)

    可以看出,注冊(cè)組件時(shí)傳入的配置和創(chuàng)建Vue實(shí)例差不多,但也有不同,其中一個(gè)就是data屬性必須是一個(gè)函數(shù)。
    這是因?yàn)槿绻馰ue實(shí)例那樣,傳入一個(gè)對(duì)象,由于JS中對(duì)象類(lèi)型的變量實(shí)際上保存的是對(duì)象的引用,所以當(dāng)存在多個(gè)這樣的組件時(shí),會(huì)共享數(shù)據(jù),導(dǎo)致一個(gè)組件中數(shù)據(jù)的改變會(huì)引起其他組件數(shù)據(jù)的改變。

    而使用一個(gè)返回對(duì)象的函數(shù),每次使用組件都會(huì)創(chuàng)建一個(gè)新的對(duì)象,這樣就不會(huì)出現(xiàn)共享數(shù)據(jù)的問(wèn)題來(lái)了。

    關(guān)于DOM模板的解析

    當(dāng)使用 DOM 作為模版時(shí) (例如,將 el 選項(xiàng)掛載到一個(gè)已存在的元素上), 你會(huì)受到 HTML 的一些限制,因?yàn)?Vue 只有在瀏覽器解析和標(biāo)準(zhǔn)化 HTML 后才能獲取模板內(nèi)容。尤其像這些元素 <ul>,<ol>,<table>,<select> 限制了能被它包裹的元素,而一些像 <option> 這樣的元素只能出現(xiàn)在某些其它元素內(nèi)部。

    在自定義組件中使用這些受限制的元素時(shí)會(huì)導(dǎo)致一些問(wèn)題,例如:

    <table>
     <my-row>...</my-row>
    </table>

    自定義組件 <my-row> 被認(rèn)為是無(wú)效的內(nèi)容,因此在渲染的時(shí)候會(huì)導(dǎo)致錯(cuò)誤。這時(shí)應(yīng)使用特殊的 is 屬性:

    <table>
     <tr is="my-row"></tr>
    </table>

    也就是說(shuō),標(biāo)準(zhǔn)HTML中,一些元素中只能放置特定的子元素,另一些元素只能存在于特定的父元素中。比如table中不能放置div,tr的父元素不能div等。所以,當(dāng)使用自定義標(biāo)簽時(shí),標(biāo)簽名還是那些標(biāo)簽的名字,但是可以在標(biāo)簽的is屬性中填寫(xiě)自定義組件的名字。

    應(yīng)當(dāng)注意,如果您使用來(lái)自以下來(lái)源之一的字符串模板,這些限制將不適用:

    <script type="text/x-template">
    JavaScript 內(nèi)聯(lián)模版字符串
    .vue 組件
    其中,前兩個(gè)模板都不是Vue官方推薦的,所以一般情況下,只有單文件組件.vue可以忽略這種情況。

    組件的屬性和事件

    在html中使用元素,會(huì)有一些屬性,如class,id,還可以綁定事件,自定義組件也是可以的。當(dāng)在一個(gè)組件中,使用了其他自定義組件時(shí),就會(huì)利用子組件的屬性和事件來(lái)和父組件進(jìn)行數(shù)據(jù)交流。
    <img src="https://www.gxlcms.com/assets/images/props-events.png"/>

    如上如所示,父子組件之間的通信就是 props down,events up,父組件通過(guò) 屬性props向下傳遞數(shù)據(jù)給子組件,子組件通過(guò) 事件events 給父組件發(fā)送消息。
    比如,子組件需要某個(gè)數(shù)據(jù),就在內(nèi)部定義一個(gè)prop屬性,然后父組件就像給html元素指定特性值一樣,把自己的data屬性傳遞給子組件的這個(gè)屬性。
    而當(dāng)子組件內(nèi)部發(fā)生了什么事情的時(shí)候,就通過(guò)自定義事件來(lái)把這個(gè)事情涉及到的數(shù)據(jù)暴露出來(lái),供父組件處理。

    <my-component v-bind:foo="baz" v-on:event-a="doThis(arg1,...arg2)"></my-component>

    如上代碼,

    foo是<my-component>組件內(nèi)部定義的一個(gè)prop屬性,baz是父組件的一個(gè)data屬性,
    event-a是子組件定義的一個(gè)事件,doThis是父組件的一個(gè)方法
    過(guò)程就是這樣:

    父組件把baz數(shù)據(jù)通過(guò)prop傳遞給子組件的foo;
    子組件內(nèi)部得到foo的值,就可以進(jìn)行相應(yīng)的操作;
    當(dāng)子組件內(nèi)部發(fā)生了一些變化,希望父組件能知道時(shí),就利用代碼觸發(fā)event-a事件,把一些數(shù)據(jù)發(fā)送出去
    父組件把這個(gè)事件處理器綁定為doThis方法,子組件發(fā)送的數(shù)據(jù),就作為doThis方法的參數(shù)被傳進(jìn)來(lái)
    然后父組件就可以根據(jù)這些數(shù)據(jù),進(jìn)行相應(yīng)的操作

    屬性Props

    Vue組件通過(guò)props屬性來(lái)聲明一個(gè)自己的屬性,然后父組件就可以往里面?zhèn)鬟f數(shù)據(jù)。

    Vue.component('mycomponent',{
     template: '<div>這是一個(gè)自定義組件,父組件傳給我的內(nèi)容是:{{myMessage}}</div>',
     props: ['myMessage'],
     data () {
     return {
     message: 'hello world'
     }
     }
     })

    然后調(diào)用該組件

    <div id="app">
     <mycomponent my-message="hello"></mycomponent>
    </div>

    注意,由于HTML特性是不區(qū)分大小寫(xiě)的,所以傳遞屬性值時(shí),myMessage應(yīng)該轉(zhuǎn)換成 kebab-case (短橫線隔開(kāi)式)my-message="hello"。

    v-bind綁定屬性值
    這里說(shuō)一下v-bind綁定屬性值的一個(gè)特性:一般情況下,使用v-bind給元素特性(attribute)傳遞值時(shí),Vue會(huì)將""中的內(nèi)容當(dāng)做一個(gè)表達(dá)式。
    比如:

    <div attr="message">hello</div>

    上面這樣,div元素的attr特性值就是message。

    而這樣

    <div v-bind:attr="message">hello</div>

    這里的message應(yīng)該是Vue實(shí)例的data的一個(gè)屬性,這樣div元素的attr特性值就是message這個(gè)屬性的值。

    之所以說(shuō)是一般情況,是因?yàn)閏lass和style特性并不是這樣。用v-bind:class和class傳入正常的類(lèi)名,效果是一樣的,因?yàn)閷?duì)于這兩個(gè)特性,Vue采用了合并而不是替換的原則。

    動(dòng)態(tài)綁定特性值

    根據(jù)上面,想要把父組件的屬性綁定到子組件,應(yīng)該使用v-bind,這樣,父組件中數(shù)據(jù)改變時(shí)能反映到子組件。
    注意,根據(jù)父組件傳遞給子組件的屬性類(lèi)型的不同,當(dāng)在子組件中更改這個(gè)屬性時(shí),會(huì)有以下兩種情況:

    當(dāng)父組件傳遞的屬性是引用類(lèi)型時(shí),在子組件中更改相應(yīng)的屬性會(huì)導(dǎo)致父組件相應(yīng)屬性的更改。

     <div id="app2">
     <div>這是父組件的parentArray:{{parentArray}}</div>
     <my-component :child-array="parentArray"></my-component>
     </div>
     <script>
     Vue.component('my-component', {
     template: `
     <div>這是接收了父組件傳遞值的子組件的childArray: {{childArray}} <br>
     <button type="button" @click="changeArray">
     點(diǎn)擊我改變父元素的parentArray</button>
     </div>`,
     props: ['childArray'],
     data () {
     return {
     counter: 1
     }
     },
     methods: {
     changeArray () {
     this.childArray.push(this.counter++)
     }
     }
     })
     new Vue({
     el: '#app2',
     data: {
     parentArray: []
     }
     })
     </script>
    

    當(dāng)父組件傳遞值為基本類(lèi)型時(shí),在子組件中更改這個(gè)屬性會(huì)報(bào)錯(cuò)。正確的做法是,在父組件中綁定屬性值時(shí),加上.sync修飾符。

    <my-component :child-array.sync="parentArray"></my-component>

    然后在子組件中改變相應(yīng)的屬性

     methods: {
     changeArray () {
     this.counter++
     this.$emit('update:childArray', this.counter)
     }
     }

    子組件希望對(duì)傳入的prop進(jìn)行操作

    一般來(lái)說(shuō),是不建議在子組件中對(duì)父組件中傳遞來(lái)的屬性進(jìn)行操作的。如果真的有這種需求,可以這樣:

    父組件傳遞了一個(gè)基本類(lèi)型值,那么可以在子組件中創(chuàng)建一個(gè)新的屬性,并以傳遞進(jìn)來(lái)的值進(jìn)行初始化,之后就可以操作這個(gè)新的屬性了

    props: ['initialCounter'],
    data: function () {
     return { counter: this.initialCounter }
    }

    父組件傳遞了一個(gè)引用類(lèi)型值,為了避免更改父組件中相應(yīng)的數(shù)據(jù),最好是對(duì)引用類(lèi)型進(jìn)行復(fù)制。復(fù)雜的情況,肯定應(yīng)該是深復(fù)制。

    給子組件傳遞正確類(lèi)型的值

    同樣是上面的原因,靜態(tài)的給子組件的特性傳遞值,它都會(huì)把他當(dāng)做一個(gè)字符串。

    <!-- 傳遞了一個(gè)字符串 "1" -->
    <comp some-prop="1"></comp>
    

    子組件中,特性的值是字符串 "1" 而不是 number 1。如果想傳遞正確的數(shù)值,應(yīng)該使用v-bind傳遞,這樣就能把傳遞的值當(dāng)做一個(gè)表達(dá)式來(lái)處理,而不是字符串。

    <!-- 傳遞實(shí)際的 number 1 -->
    <comp v-bind:some-prop="1"></comp>

    Prop驗(yàn)證

    我們可以給組件的props屬性添加驗(yàn)證,當(dāng)傳入的數(shù)據(jù)不符合要求時(shí),Vue會(huì)發(fā)出警告。

    Vue.component('example', {
     props: {
     // 基礎(chǔ)類(lèi)型檢測(cè) (`null` 意思是任何類(lèi)型都可以)
     propA: Number,
     // 多種類(lèi)型
     propB: [String, Number],
     // 必傳且是字符串
     propC: {
     type: String,
     required: true
     },
     // 數(shù)字,有默認(rèn)值
     propD: {
     type: Number,
     default: 100
     },
     // 數(shù)組/對(duì)象的默認(rèn)值應(yīng)當(dāng)由一個(gè)工廠函數(shù)返回
     propE: {
     type: Object,
     default: function () {
     return { message: 'hello' }
     }
     },
     // 自定義驗(yàn)證函數(shù)
     propF: {
     validator: function (value) {
     return value > 10
     }
     }
     }
    })
    

    type 可以是下面原生構(gòu)造器:

    String
    Number
    Boolean
    Function
    Object
    Array
    Symbol
    type 也可以是一個(gè)自定義構(gòu)造器函數(shù),使用 instanceof 檢測(cè)。

     // 自定義Person構(gòu)造器
     function Person(name, age) {
     this.name = name
     this.age = age
     }
     Vue.component('my-component', {
     template: `<div>名字: {{ person-prop.name }}, 年齡: {{ person-prop.age }} </div>`,
     props: {
     person-prop: {
     type: Person // 指定類(lèi)型
     }
     }
     })
     new Vue({
     el: '#app2',
     data: {
     person: 2 // 傳入Number類(lèi)型會(huì)報(bào)錯(cuò)
     }
     })
    

    非Prop類(lèi)型的屬性

    也可以像在html標(biāo)簽中添加data-開(kāi)頭的自定義屬性一樣,給自定義組件添加任意的屬性。而不僅限于data-*形式,這樣做的話(huà),Vue會(huì)把這個(gè)屬性放在自定義組件的根元素上。一個(gè)自定義組件的模板只能有一個(gè)根元素。

    覆蓋非Prop屬性

    如果父組件向子組件的非prop屬性傳遞了值,那么這個(gè)值會(huì)覆蓋子組件模板中的特性。

    <div id="app3">
     <my-component2 att="helloParent"></my-component2>
    </div>
    <script>
     Vue.component('my-component2', {
     template: `<div att="helloChild">子組件原有的特性被覆蓋了</div>`
     })
     new Vue({
     el: '#app3'
     })
    </script>

    上面渲染的結(jié)果是,div的att屬性是helloParent。
    注意:前面已經(jīng)提到過(guò),覆蓋原則對(duì)于class和style不適用,而是采用了合并(merge)的原則。

    <div id="app3">
     <my-component2 att="helloParent" class="class2" style="color: red;"></my-component2>
    </div>
    <script>
     Vue.component('my-component2', {
     template: `<div att="helloChild" class="class1" style="background: yellow;">子組件原有的特性被覆蓋了</div>`
     })
     new Vue({
     el: '#app3'
     })
    </script>

    上面的渲染結(jié)果是,div的類(lèi)名是class1 class2,行內(nèi)樣式是color:red; background:yellow;。

    自定義事件

    通過(guò)prop屬性,父組件可以向子組件傳遞數(shù)據(jù),而子組件的自定義事件就是用來(lái)將內(nèi)部的數(shù)據(jù)報(bào)告給父組件的。

    <div id="app3">
     <my-component2 v-on:myclick="onClick"></my-component2>
    </div>
    <script>
     Vue.component('my-component2', {
     template: `<div>
     <button type="button" @click="childClick">點(diǎn)擊我觸發(fā)自定義事件</button>
     </div>`,
     methods: {
     childClick () {
     this.$emit('myclick', '這是我暴露出去的數(shù)據(jù)', '這是我暴露出去的數(shù)據(jù)2')
     }
     }
     })
     new Vue({
     el: '#app3',
     methods: {
     onClick () {
     console.log(arguments)
     }
     }
     })
    </script>
    

    如上所示,共分為以下步驟:

    子組件在自己的方法中將自定義事件以及需要發(fā)出的數(shù)據(jù)通過(guò)以下代碼發(fā)送出去

    this.$emit('myclick', '這是我暴露出去的數(shù)據(jù)', '這是我暴露出去的數(shù)據(jù)2')

    第一個(gè)參數(shù)是自定義事件的名字
    后面的參數(shù)是依次想要發(fā)送出去的數(shù)據(jù)
    父組件利用v-on為事件綁定處理器

    <my-component2 v-on:myclick="onClick"></my-component2>

    這樣,在Vue實(shí)例的methods方法中就可以調(diào)用傳進(jìn)來(lái)的參數(shù)了

    注意: 在使用v-on綁定事件處理方法時(shí),不應(yīng)該傳進(jìn)任何參數(shù),而是直接寫(xiě)v-on:myclick="onClick",不然,子組件暴露出來(lái)的數(shù)據(jù)就無(wú)法獲取到了

    綁定原生事件

    如果想在某個(gè)組件的根元素上監(jiān)聽(tīng)一個(gè)原生事件。可以使用 .native 修飾 v-on

    <my-component v-on:click.native="doTheThing"></my-component>

    探究v-model

    v-model可以對(duì)表單控件實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,它的原理就是利用了綁定屬性和事件來(lái)實(shí)現(xiàn)的。比如input控件。不使用v-model,可以這樣實(shí)現(xiàn)數(shù)據(jù)的雙向綁定:

    <div id="app4">
     <input type="text" v-bind:value="text" v-on:input="changeValue($event.target.value)">
     {{text}}
     </div>
     <script>
     new Vue({
     el: '#app4',
     data: {
     text: '444'
     },
     methods: {
     changeValue (value) {
     this.text = value
     }
     }
     })
     </script>

    上面的代碼同樣實(shí)現(xiàn)了數(shù)據(jù)的雙向綁定。其本質(zhì)就是:

    把input的value特性綁定到Vue實(shí)例的屬性text上,text改變,input中的內(nèi)容也會(huì)改變
    然后把表單的input事件處理函數(shù)設(shè)置為Vue實(shí)例的一個(gè)方法,這個(gè)方法會(huì)根據(jù)輸入?yún)?shù)改變Vue中text`的值
    相應(yīng)的,在input中輸入內(nèi)容時(shí),觸發(fā)了input事件,把event.target.value傳給這個(gè)方法,最后就實(shí)現(xiàn)了改變綁定的數(shù)據(jù)的效果。
    而v-model就是上面這種方式的語(yǔ)法糖,也就是把上面的寫(xiě)法封裝了一下,方便我們使用。

    使用自定義事件創(chuàng)建自定義的表單輸入組件

    理解了v-model的內(nèi)幕,也就可以把這個(gè)效果用在自定義表單組件上了。
    來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的只能輸入hello的表單輸入組件。

    <div id="app5">
     <my-component3 v-model="hello"></my-component3>
     <div>{{hello}}</div>
    </div>
    <script>
     Vue.component('my-component3', {
     template: `<input ref="input" type="text" :value="value" @input="checkInput($event.target.value)">`,
     props: ['value'],
     methods: {
     checkInput (value) {
     var hello = 'hello'
     if (!hello.includes(value)) {
     this.$emit('input', hello)
     this.$refs.input.value = hello
     } else {
     this.$emit('input', value)
     }
     }
     }
     })
     new Vue({
     el: '#app5',
     data: {
     hello: ''
     }
     })
    </script>
    

    定制組件的v-model

    默認(rèn)情況下,一個(gè)組件的 v-model 會(huì)使用 value 屬性和 input 事件,但是諸如單選框、復(fù)選框之類(lèi)的輸入類(lèi)型可能把 value 屬性用作了別的目的。model 選項(xiàng)可以回避這樣的沖突:

    Vue.component('my-checkbox', {
     model: {
     prop: 'checked', // 將輸入的特性改為checked
     event: 'change' // 觸發(fā)的自定義事件類(lèi)型為change
     },
     props: {
     checked: Boolean,
     // this allows using the `value` prop for a different purpose
     value: String
     }
    })

    這樣設(shè)置的話(huà),

    <my-checkbox v-model="foo" value="some value"></my-checkbox>

    上面的代碼就等同于

    <my-checkbox :checked="foo" @change="val => { foo = val }" value="some value"></my-checkbox>

    實(shí)際使用時(shí),與之前不同的地方是:

    把子組件中接收外部數(shù)據(jù)的prop屬性改為checked
    向父組件發(fā)出事件時(shí),事件類(lèi)型應(yīng)改為change

    Vue.component('my-component3', {
     template: `<input ref="input" type="text" :value="checked" @input="checkInput($event.target.value)">`,
     props: ['checked'], // 屬性名改變
     model: {
     prop: 'checked',
     event: 'change'
     },
     methods: {
     checkInput (value) {
     var hello = 'hello'
     if (!hello.includes(value)) {
     this.$emit('change', hello) // 事件類(lèi)型改變
     this.$refs.input.value = hello
     } else {
     this.$emit('change', value) // 事件類(lèi)型改變
     }
     }
     }
     })
    

    動(dòng)態(tài)組件

    通過(guò)使用保留的 <component> 元素,動(dòng)態(tài)地綁定到它的 is 特性,可以讓多個(gè)組件使用同一個(gè)掛載點(diǎn),并動(dòng)態(tài)切換:

     <div id="app6">
     <select v-model="currentComponent">
     <option value="home">home</option>
     <option value="post">post</option>
     <option value="about">about</option>
     </select>
     <component :is="currentComponent"></component>
     </div>
     <script>
     new Vue({
     el: '#app6',
     data: {
     currentComponent: 'home'
     },
     components: {
     home: {
     template: `<header>這是home組件</header>`
     },
     post: {
     template: `<header>這是post組件</header>`
     },
     about: {
     template: `<header>這是about組件</header>`
     }
     }
     })
    </script>
    

    也可以直接綁定到組件對(duì)象上:

    var Home = {
     template: `<header>這是home組件</header>`
    }
    new Vue({
     el: '#app6',
     data: {
     currentComponent: Home
     }
    })

    保留切換出去的組件,避免重新渲染

    如果把切換出去的組件保留在內(nèi)存中,可以保留它的狀態(tài)或避免重新渲染。為此可以添加一個(gè) keep-alive 指令參數(shù):

    <keep-alive>
     <component :is="currentComponent">
     <!-- 非活動(dòng)組件將被緩存! -->
     </component>
    </keep-alive>

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

    終于到了基本知識(shí)的最后一個(gè)了。官網(wǎng)寫(xiě)的很詳細(xì)。

    單個(gè)slot

    上面用到的很多組件的使用方式是這樣的:

    <component></component>

    也就是說(shuō)組件中是空的,沒(méi)有放置任何文本或元素。但是原生的html元素都是可以進(jìn)行嵌套的,div里面放table
    什么的。自定義組件開(kāi)閉標(biāo)簽之間也可以放置內(nèi)容,不過(guò)需要在定義組件時(shí)使用slot。

    slot相當(dāng)于子組件設(shè)置了一個(gè)地方,如果在調(diào)用它的時(shí)候,往它的開(kāi)閉標(biāo)簽之間放了東西,那么它就把這些東西放到slot中。

    當(dāng)子組件中沒(méi)有slot時(shí),父組件放在子組件標(biāo)簽內(nèi)的東西將被丟棄;
    子組件的slot標(biāo)簽內(nèi)可以放置內(nèi)容,當(dāng)父組件沒(méi)有放置內(nèi)容在子組件標(biāo)簽內(nèi)時(shí),slot中的內(nèi)容會(huì)渲染出來(lái);
    當(dāng)父組件在子組件標(biāo)簽內(nèi)放置了內(nèi)容時(shí),slot中的內(nèi)容被丟棄
    子組件的模板:

    <div>
     <h2>我是子組件的標(biāo)題</h2>
     <slot>
     只有在沒(méi)有要分發(fā)的內(nèi)容時(shí)才會(huì)顯示。
     </slot>
    </div>
    

    父組件模板:

    <div>
     <h1>我是父組件的標(biāo)題</h1>
     <my-component>
     <p>這是一些初始內(nèi)容</p>
     </my-component>
    </div>

    渲染結(jié)果:

    <div>
     <h1>我是父組件的標(biāo)題</h1>
     <div>
     <h2>我是子組件的標(biāo)題</h2>
     <p>這是一些初始內(nèi)容</p>
     </div>
    </div>

    具名slot

    slot可以有很多個(gè)。那么子組件對(duì)于父組件放置的多余的內(nèi)容如何放到各個(gè)slot中呢?方法就是子組件給每個(gè)slot起一個(gè)名字name,父組件放置多余的元素時(shí),給每個(gè)元素的slot屬性分配一個(gè)代表slot的名字。到時(shí)候,多余的內(nèi)容就會(huì)根據(jù)自己的slot屬性去找具有對(duì)應(yīng)名字的slot元素。

    注意:

    子組件可以有一個(gè)匿名的slot,當(dāng)分發(fā)的多余內(nèi)容找不到對(duì)應(yīng)的slot時(shí),就會(huì)進(jìn)入這里面
    如果子組件沒(méi)有匿名的slot,當(dāng)分發(fā)的多余內(nèi)容找不到對(duì)應(yīng)的slot時(shí),就會(huì)被丟棄
    例如,假定我們有一個(gè) app-layout 組件,它的模板為:

    <div class="container">
     <header>
     <slot name="header"></slot>
     </header>
     <main>
     <slot></slot>
     </main>
     <footer>
     <slot name="footer"></slot>
     </footer>
    </div>

    父組件模版:

    <app-layout>
     <h1 slot="header">這里可能是一個(gè)頁(yè)面標(biāo)題</h1>
     <p>主要內(nèi)容的一個(gè)段落。</p>
     <p>另一個(gè)主要段落。</p>
     <p slot="footer">這里有一些聯(lián)系信息</p>
    </app-layout>

    渲染結(jié)果為:

    <div class="container">
     <header>
     <h1>這里可能是一個(gè)頁(yè)面標(biāo)題</h1>
     </header>
     <main>
     <p>主要內(nèi)容的一個(gè)段落。</p>
     <p>另一個(gè)主要段落。</p>
     </main>
     <footer>
     <p>這里有一些聯(lián)系信息</p>
     </footer>
    </div>
    

    作用域插槽

    作用域插槽也是一個(gè)插槽slot,但是他可以把數(shù)據(jù)傳遞給到父組件的特定元素內(nèi),然后有父組件決定如何渲染這些數(shù)據(jù)。

    首先,子組件的slot需要有一些特性(prop)

     Vue.component('my-component4', {
     template: `<div>
     <slot :text="hello" message="world"></slot>
     </div>`,
     data () {
     return {
     hello: [1,'2']
     }
     }
     })

    父組件在調(diào)用子組件時(shí),需要在里面添加一個(gè)template元素,并且這個(gè)template元素具有scope特性

    <div id="app7">
     <my-component4>
     <template scope="props">
     </template>
     </my-component4>
     </div>

    scope特性的值,就代表了所有子組件傳過(guò)來(lái)的數(shù)據(jù)組成的對(duì)象。相當(dāng)于

    props = {
     text: '',
     message: ''
    }

    最后,父組件就可以在template中渲染子組件傳過(guò)來(lái)的數(shù)據(jù)了

     <div id="app7">
     <my-component4>
     <template slot-scope="props">
     <span>{{props.text}}</span>
     <span>{{props.message}}</span>
     </template>
     </my-component4>
     </div>

    最新的Vue支持將作用域插槽的屬性解構(gòu)。所以上述代碼可以簡(jiǎn)寫(xiě)為:

     <div id="app7">
     <my-component4>
     <template slot-scope="{text, message}">
     <span>{{text}}</span>
     <span>{{message}}</span>
     </template>
     </my-component4>
     </div>

    作用域插槽也是插槽,只不過(guò)是多加了些特性,然后父組件多進(jìn)行了些處理。

    以上即是個(gè)人對(duì)Vue中的組件的理解,希望對(duì)大家有所幫助

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Vue組件的使用及個(gè)人理解與介紹

    Vue組件的使用及個(gè)人理解與介紹:組件的基本使用 注冊(cè)組件 注冊(cè)組件就是利用Vue.component()方法,先傳入一個(gè)自定義組件的名字,然后傳入這個(gè)組件的配置。 Vue.component('mycomponent',{ template: `<div>這是一個(gè)自定義組件</div>`, data () { r
    推薦度:
    標(biāo)簽: 使用 VUE 介紹
    • 熱門(mén)焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門(mén)推薦

    專(zhuān)題
    Top
    主站蜘蛛池模板: 69久久精品无码一区二区| 国产亚洲精品岁国产微拍精品| 一夲道无码人妻精品一区二区| 国产精品91在线| 亚洲国产精品综合久久网络| 亚洲国语精品自产拍在线观看| 久久国产热精品波多野结衣AV| 久久久久久亚洲精品不卡| 国产亚洲欧洲精品| 国内精品久久久久影院日本 | 99精品国产一区二区三区| 日韩美女18网站久久精品| 国产精品 综合 第五页| 成人区人妻精品一区二区不卡视频 | 久久精品国产一区| 国产亚洲精品a在线无码| 中文字幕无码精品亚洲资源网久久 | 狠狠精品干练久久久无码中文字幕| 久久亚洲精品成人AV| 青青久久精品国产免费看| 国产精品二区观看| 久久99热国产这有精品| HEYZO无码综合国产精品| 无码国产精品一区二区免费模式 | 精品性影院一区二区三区内射| 中文字幕精品一区二区三区视频| 免费精品国自产拍在线播放| 国产精品亚洲产品一区二区三区| 精品久久久久久亚洲| 国产成人精品日本亚洲直接| 2021久久国自产拍精品| 国产欧美日韩精品a在线观看| 午夜精品一区二区三区免费视频| 亚洲国产精品视频| 在线亚洲精品自拍| 亚洲AV无码之日韩精品| 下载天堂国产AV成人无码精品网站| 久久精品国产亚洲AV不卡| 国内精品视频在线观看| 精品无码人妻久久久久久| 国产在线国偷精品免费看|