vue-slot

目的

  • Vue文檔中解釋: 這是Vue實(shí)現(xiàn)了一套內(nèi)容分發(fā)的API,<slot> 元素作為承載分發(fā)內(nèi)容的出口
  • 我理解是: 插槽機(jī)制完成了由父組件制定子組件內(nèi)容的又一種方式(也可以通過傳遞props來制定),而slot用來指定父組件傳遞的內(nèi)容應(yīng)該放在何處
  • 兩個機(jī)制相比:
    props通過傳遞參數(shù),子組件內(nèi)部需要提前定義好內(nèi)容生成的邏輯,接到對應(yīng)參數(shù)后,由子組件內(nèi)部來根據(jù)參數(shù)生成內(nèi)容;
    而slot直接傳遞需要展示的內(nèi)容, 子組件只負(fù)責(zé)管理內(nèi)容的具體展示位置;
  • 應(yīng)用場景: 根據(jù)之前的對比,可以看出,兩者都是由父組件指定子組件內(nèi)容的方式,區(qū)別是:
    使用slot時:子組件并不需要知道具體內(nèi)容是什么
    使用props時: 具體的內(nèi)容是由子組件提前定義好的
    因此,slot適用于靈活且沒有限制的自定義內(nèi)容,如element-ui中的自定義表格內(nèi)容

使用

基本用法

使用slot時首先捋清父子組件與傳遞內(nèi)容的關(guān)系 :

  1. 父組件中指定傳遞的內(nèi)容 放在子組件標(biāo)簽之間
  2. 子組件使用<slot></slot>來指定接受的內(nèi)容放在何處
  • 簡單的demo :


編譯作用域

  • Vue文檔: 父級模板里的所有內(nèi)容都是在父級作用域中編譯的;子模板里的所有內(nèi)容都是在子作用域中編譯的
  • 即是說: 寫在父組件(app)中的變量或方法引用都只能引用父組件(app)中存在的數(shù)據(jù),即使該變量會以插槽的方式出現(xiàn)在子組件(test-comp)的內(nèi)部
<div id="app">
  <test-comp>
    <p >{{this_data}}</p>
    <p>{{sub_data}}</p>    // 該數(shù)據(jù)為子組件數(shù)據(jù),訪問不到,控制臺會報錯
  </test-comp>
</div>

<template id="test">
  <div>
    <slot></slot>
    <p>p in sub</p>
  </div>
</template>
Vue.component('test-comp',{
  template: '#test',
  data () {
    return {
      sub_data: 'data store in sub_com'
    }
  }
})

new Vue({
  el: "#app",
  data: {
    this_data: 'data store in root'
  }
})

上面這個例子會出現(xiàn)報錯,原因是sub_data是寫在父組件模板上的數(shù)據(jù)引用,因此不可能訪問到子組件中定義的數(shù)據(jù)sub_data

插槽后備內(nèi)容

  • 不贅述,可類比video標(biāo)簽的替換內(nèi)容
<video>video is not aviailable in your browser ... </video>

指定對應(yīng)的具名插槽

  • 當(dāng)出現(xiàn)多個需要分發(fā)的內(nèi)容時,可以為插槽命名,并在子組件中根據(jù)不同的名稱進(jìn)行分開管理
  • 使用<template v-slot:xxx />來指定我是<slot name="xxx">插槽的內(nèi)容

插槽 Prop

  • 上面的引用方式無法訪問到子組件中的數(shù)據(jù),這對于一些需要父子組件數(shù)據(jù)交互來定義模板的情況來說會很不適用,Vue通過為插槽提供Prop的方式解決了這個問題
  • 雖然該特性被稱為 prop,但是相對于我們通常使用的用來給子組件傳參的 prop 還是很有區(qū)別的 :
    • prop 提供了一個父組件傳參給子組件的方式,
    • 插槽prop則可以讓父組件中的插槽訪問子組件的數(shù)據(jù)(可以理解為子組件向父組件傳參,但只傳遞到了slot內(nèi)部)
<div id="app">                     // 父組件
  <sub-comp>
    <template v-slot:default="DataFromSub">    // 將傳遞的參數(shù)接收并重命名
      {{DataFromSub.data}}  //  展示子組件傳遞的數(shù)據(jù)
      <br>
      {{DataFromSub.user}}
    </template>
  </sub-comp>
</div>

<template id="sub">               // 子組件
  <section id="sub_comp">
    <p>this is sub_component</p>
    <slot :data="subData" :user="user"></slot> // 向slot中的內(nèi)容傳遞參數(shù)
  </section>
</template>
Vue.component('sub-comp', {               // 子組件
  template:'#sub', 
  data() {
    return {
      subData: 'sub_data',
      user: 'admin'
    }
  }
})
var vm = new Vue({                        // 父組件
  el : "#app"
})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在 2.6.0 中,我們?yōu)榫呙宀酆妥饔糜虿宀垡肓艘粋€新的統(tǒng)一的語法 (即 v-slot 指令)。它取代了 sl...
    kiterumer閱讀 3,131評論 0 5
  • 傳遞靜態(tài)或動態(tài)Prop 傳入靜態(tài)的值: 這時候值是一個字符串你也可以通過v-bind動態(tài)賦值: 這時候值是一個js...
    A鄭家慶閱讀 449評論 0 0
  • 什么是組件? 組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝...
    youins閱讀 9,709評論 0 13
  • Vue 實(shí)現(xiàn)了一套內(nèi)容分發(fā)的 API,將 元素作為承載分發(fā)內(nèi)容的出口,即可以將在組件內(nèi)填寫的內(nèi)容渲染在子組件的...
    b91b9cf10fff閱讀 268評論 0 0
  • 此文基于官方文檔,里面部分例子有改動,加上了一些自己的理解 什么是組件? 組件(Component)是 Vue.j...
    陸志均閱讀 3,955評論 5 14

友情鏈接更多精彩內(nèi)容