Vue 插槽slot和作用域插槽slot-scope

什么插槽

官網(wǎng)說明:

2.6.0中,我們?yōu)榫呙宀酆妥饔糜虿宀垡肓艘粋€新的統(tǒng)一的語法 (即 v-slot 指令)缘圈。它取代了 slotslot-scope 這兩個目前已被廢棄但未被移除且仍在文檔中的特性砰苍。新語法的由來可查閱這份 RFC悬蔽。

  • 簡單的概念:插槽,也就是slot舱痘,是組件的一塊HTML模板徘钥,這塊模板顯示不顯示衔蹲、以及怎樣顯示由父組件來決定。slot最核心的是顯示不顯示怎樣顯示呈础。

  • 非插槽模板html模板:
    指的是 div舆驶、span、ul而钞、table這些沙廉,非插槽模板的顯示與隱藏以及怎樣顯示由插件自身控制;

  • 插槽模板slot
    它是一個空殼子臼节,因為它顯示與隱藏以及最后用什么樣的html模板顯示由父組件控制撬陵。但是插槽顯示的位置確由子組件自身決定,slot寫在組件template的哪塊网缝,父組件傳過來的模板將來就顯示在哪塊巨税。

單個插槽|默認插槽 | 匿名插槽

  • 概念:
    單個插槽是vue的官方叫法,是默認插槽粉臊,也是匿名插槽草添。因為它不用設(shè)置name屬性。
    單個插槽维费, 一個組件中只能有一個該類插槽。具名插槽就可以有很多個促王,只要名字(name屬性)不同就可以了犀盟。

  • 樣例:
    如果父模板傳遞了值過去,則插槽占位處顯示父組件傳遞過去的值蝇狼,否則默認為子組件插槽的內(nèi)容阅畴,一般情況為空。

父模板

<div class="parent">
     <h3>這里是父組件</h3>
    <alert-box>有bug發(fā)生</alert-box>
    <alert-box>有一個警告</alert-box>
    <alert-box></alert-box>
</div>

子組件
  Vue.component('alert-box', {
      template: `
        <div> <strong>ERROR:</strong>
        <slot>子組件插槽默認內(nèi)容</slot>
    </div>
    `
    });
展示結(jié)果:
ERROR: 有bug發(fā)生
ERROR: 有一個警告
ERROR: 子組件插槽默認內(nèi)容


<template>
    <div class="parent">
        <h3>這里是父組件</h3>
        <child>
            <h4>這里是子組件中插槽占位處要展示的內(nèi)容</h4>
            <div class="tmpl">
              <span>菜單1</span>
              <span>菜單2</span> 
            </div>
        </child>
    </div>
</template>


子組件
<template>
    <div class="child">
        <h3>這里是子組件</h3>
        <slot></slot>
    </div>
</template>

具名插槽

  • 概念:
    插槽加了name屬性迅耘,具名插槽可以在一個組件中出現(xiàn)N次贱枣。出現(xiàn)在不同的位置〔ǎ總之纽哥,存在多個具名插槽的情況下,只需要找準該slot="name"下的slot即可栖秕,將對應(yīng)的父組件內(nèi)容傳遞到子組件slot占位處春塌。父組件通過html模板上的slot屬性關(guān)聯(lián)具名插槽。沒有slot屬性的html模板默認關(guān)聯(lián)匿名插槽。
  • 樣例:
父組件
<base-layout>
      <p slot='header'>標題信息</p>
      <p>主要內(nèi)容1</p>
      <p>主要內(nèi)容2</p>
      <p slot='footer'>底部信息</p>
</base-layout>

子組件:
  Vue.component('base-layout', {
      template: `
      <div>
          有name的插槽可以在該組件中存在多次
          <header><slot name='header'></slot></header>
          <main> <slot></slot></main>
          <footer><slot name='footer'></slot></footer>
      </div>
      `
    });

展示結(jié)果:
標題信息
主要內(nèi)容1
主要內(nèi)容2
底部信息

作用域插槽 | 帶數(shù)據(jù)的插槽

作用域插槽:在slot上面綁定數(shù)據(jù)只壳。自 2.6.0 起有所更新俏拱。已廢棄的使用 slot-scope特性的語法。官網(wǎng)介紹新版
slot-scope 聲明了被接收的prop對象會作為 slotProps變量存在于 <template>作用域中吼句。你可以像命名JavaScript函數(shù)參數(shù)一樣隨意命名 slotProps

 <fruit-list :list='list'>
      <template slot-scope='slotProps'>
        <strong v-if='slotProps.info.id==3' class="current">
          {{slotProps.info.name}}
        </strong>
      </template>
</fruit-list>
 Vue.component('fruit-list', {
      props: ['list'],
      template: `
     <div>
      <li :key='item.id' v-for='item in list'>
          <slot :info='item'>{{item.name}}</slot>
      </li>
     </div>
      `
});
var vm = new Vue({
      el: '#app',
      data: {
        list: [{
            id: '1',
            name: 'apple'
          }, {
            id: '2',
            name: 'orange'
          }, {
            id: '3',
            name: 'banana'
          }

        ]
      }
    });
結(jié)果:
apple
orange
banana
image.png

2.6.0+官網(wǎng)寫法

將包含所有插槽prop的對象命名為 slotProps名字任意取锅必。

<current-user>
  <template v-slot:default="slotProps">
    {{ slotProps.user.firstName }}
  </template>
</current-user>

<span>
  <slot v-bind:user="user">
    {{ user.lastName }}
  </slot>
</span>

注意默認插槽的縮寫語法不能和具名插槽混用,因為它會導(dǎo)致作用域不明確:

<!-- 無效惕艳,會導(dǎo)致警告 -->
<current-user v-slot="slotProps">
  {{ slotProps.user.firstName }}
  <template v-slot:other="otherSlotProps">
    slotProps is NOT available here
  </template>
</current-user>
  • 只要出現(xiàn)多個插槽搞隐,請始終為所有的插槽使用完整的基于 <template> 的語法:
<current-user>
  <template v-slot:default="slotProps">
    {{ slotProps.user.firstName }}
  </template>

  <template v-slot:other="otherSlotProps">
    ...
  </template>
</current-user

解構(gòu)插槽Prop

  • 作用域插槽的內(nèi)部工作原理是將你的插槽內(nèi)容包括在一個傳入單個參數(shù)的函數(shù)里,這意味著 v-slot 的值實際上可以是任何能夠作為函數(shù)定義中的參數(shù)的 JavaScript 表達式尔艇。
function (slotProps) {
  // 插槽內(nèi)容
}
<current-user v-slot="{ user }">
  {{ user.firstName }}
</current-user>
重命名
<current-user v-slot="{ user: person }">
  {{ person.firstName }}
</current-user>
具名插槽

v-onv-bind一樣尔许,v-slot也有縮寫,即把參數(shù)之前的所有內(nèi)容(v-slot:)替換為字符#终娃。例如v-slot:header可以被重寫為 #header

<base-layout>
  <template #header>
    <h1>Here might be a page title</h1>
  </template>

  <p>A paragraph for the main content.</p>
  <p>And another one.</p>

  <template #footer>
    <p>Here's some contact info</p>
  </template>
</base-layout>
  • 然而味廊,和其它指令一樣,該縮寫只在其有參數(shù)的時候才可用棠耕。這意味著以下語法是無效的:
<!-- 這樣會觸發(fā)一個警告 -->
<current-user #="{ user }">
  {{ user.firstName }}
</current-user>
  • 如果你希望使用縮寫的話余佛,你必須始終以明確插槽名取而代之:
<current-user #default="{ user }">
  {{ user.firstName }}
</current-user>

參考鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窍荧,隨后出現(xiàn)的幾起案子辉巡,更是在濱河造成了極大的恐慌,老刑警劉巖蕊退,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郊楣,死亡現(xiàn)場離奇詭異,居然都是意外死亡瓤荔,警方通過查閱死者的電腦和手機净蚤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來输硝,“玉大人今瀑,你說我怎么就攤上這事〉惆眩” “怎么了橘荠?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長郎逃。 經(jīng)常有香客問我哥童,道長,這世上最難降的妖魔是什么褒翰? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任如蚜,我火速辦了婚禮压恒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘错邦。我一直安慰自己探赫,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布撬呢。 她就那樣靜靜地躺著伦吠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪魂拦。 梳的紋絲不亂的頭發(fā)上毛仪,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音芯勘,去河邊找鬼箱靴。 笑死,一個胖子當著我的面吹牛荷愕,可吹牛的內(nèi)容都是我干的衡怀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼安疗,長吁一口氣:“原來是場噩夢啊……” “哼抛杨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荐类,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤怖现,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后玉罐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屈嗤,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年吊输,在試婚紗的時候發(fā)現(xiàn)自己被綠了饶号。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡璧亚,死狀恐怖讨韭,靈堂內(nèi)的尸體忽然破棺而出脂信,到底是詐尸還是另有隱情癣蟋,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布狰闪,位于F島的核電站疯搅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏埋泵。R本人自食惡果不足惜幔欧,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一罪治、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧礁蔗,春花似錦觉义、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至磺浙,卻和暖如春洪囤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撕氧。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工瘤缩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伦泥。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓剥啤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奄喂。 傳聞我的和親對象是個殘疾皇子铐殃,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 【2019-3-4更新】Vue 2.6+修改了部分語法,對插槽的使用有了較多的更新跨新。在本文中筆者在相應(yīng)位置給出了更...
    果汁涼茶丶閱讀 10,225評論 2 36
  • 什么是組件富腊? 組件 (Component) 是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素域帐,封裝...
    youins閱讀 9,450評論 0 13
  • 最近忙著寫一些組件赘被,關(guān)于插槽這一塊自己還是用著 slot 和 slot-scope,然后看了一下文檔的更新肖揣,于是又...
    費萊姆閱讀 926評論 0 7
  • 深入理解vue中的slot與slot-scope 寫在前面 vue中關(guān)于插槽的文檔說明很短民假,語言又寫的很凝練,再加...
    SentMes閱讀 42,487評論 14 55
  • 消息推送對產(chǎn)品的作用歸結(jié)到底可能就是增加與用戶的關(guān)聯(lián)龙优,進而刺激引導(dǎo)用戶對產(chǎn)品的使用羊异。簡單的說一說個人對于如何平衡消...
    皮皮醬ye閱讀 287評論 0 0