vue中slot插槽的使用

1.看看官網(wǎng)怎么說(shuō)?

在 2.6.0 中箕戳,我們?yōu)榫呙宀酆妥饔糜虿宀垡肓艘粋€(gè)新的統(tǒng)一的語(yǔ)法 (即 v-slot 指令)狮暑。它取代了 slot 和
slot-scope 這兩個(gè)目前已被廢棄但未被移除且仍在文檔中的 attribute。
Vue 實(shí)現(xiàn)了一套內(nèi)容分發(fā)的 API救恨,這套 API 的設(shè)計(jì)靈感源自 Web Components 規(guī)范草案,將 <slot> 元素作為承載分發(fā)內(nèi)容的出口图毕。

2.分為哪幾種凸椿?

2.1默認(rèn)插槽

木有name的就是默認(rèn)插槽鸟废,捕獲所有未被匹配的內(nèi)容。

   <slot>這是默認(rèn)的slot</slot>

定義一個(gè)子組件

Vue.component("test1", {
  template: `<div>
    Hello,蘇蘇!
    <slot>這是默認(rèn)的slot</slot>
   </div>`,
});

父組件中

<test1></test1>

此時(shí)的結(jié)果是:

Hello,蘇蘇!這是默認(rèn)的slot

<test1>這是蘇蘇來(lái)了</test1>

此時(shí)的結(jié)果是:

Hello,蘇蘇!這是蘇蘇來(lái)了

當(dāng)插槽有默認(rèn)值的時(shí)候吐葱,重新定義的內(nèi)容將會(huì)覆蓋默認(rèn)內(nèi)容,反之顯示默認(rèn)內(nèi)容倦沧。

2.2具名插槽

有時(shí)我們需要多個(gè)插槽唇撬,<slot> 元素有一個(gè)特殊的 attribute:name。這個(gè) attribute 可以用來(lái)定義額外的插槽展融,一個(gè)不帶 name 的 <slot> 出口會(huì)帶有隱含的名字“default”窖认。
在向具名插槽提供內(nèi)容的時(shí)候,我們可以在一個(gè) <template> 元素上使用 v-slot 指令告希,并以 v-slot 的參數(shù)的形式提供其名稱扑浸,(原語(yǔ)法為slot="定義的名稱")

定義一個(gè)子組件

Vue.component("test1", {
  template: `<div>
    Hello,蘇蘇!
    <slot name="name" ></slot>
    <slot name="age"></slot>
    <slot >這是默認(rèn)的slot</slot>
   </div>`,
});

父組件

<test1 style="margin: 20px"
      >eg:具名插槽的使用 <template slot="name">蘇蘇小蘇蘇111</template
      ><template slot="age">18歲</template></test1>

輸入內(nèi)容:

Hello,蘇蘇!蘇蘇小蘇蘇11118歲eg:具名插槽的使用

2.3作用域插槽

有時(shí)讓插槽內(nèi)容能夠訪問(wèn)子組件中才有的數(shù)據(jù)是很有用的,綁定在 <slot> 元素上的 attribute 被稱為插槽 prop⊙嗯迹現(xiàn)在在父級(jí)作用域中喝噪,我們可以使用帶值的 v-slot 來(lái)定義我們提供的插槽 prop 的名字。

定義一個(gè)子組件

Vue.component("test1", {
  template: `<div>
    Hello,蘇蘇!
    <slot name="name" play="玩游戲"></slot>
    <slot name="age"></slot>
    <slot play="玩耍">這是默認(rèn)的slot</slot>
    <slot say="說(shuō)哈">這是默認(rèn)的slot</slot>
   </div>`,
});

父組件:

    <test1 style="margin: 20px"
      >eg:作用域插槽使用
      <template slot="name" slot-scope="play">Suunto{{ play }}</template></test1
    >

輸出:

Hello,蘇蘇! Suunto{ "play": "玩游戲" } eg:作用域插槽使用 eg:作用域插槽使用
父組件:

  <test1 style="margin: 20px"
      >eg:作用域插槽使用
      <template slot="name" slot-scope="{play}">Suunto{{ play }}</template></test1
    >

輸出:

Hello,蘇蘇! Suunto玩游戲 eg:作用域插槽使用 eg:作用域插槽使用

3.v-slot的使用

在 2.6.0 中指么,我們?yōu)榫呙宀酆妥饔糜虿宀垡肓艘粋€(gè)新的統(tǒng)一的語(yǔ)法 (即 v-slot 指令)酝惧。它取代了 slot 和 slot-scope

注意 v-slot 只能添加在 template 上 (或者獨(dú)占默認(rèn)插槽的縮寫(xiě)語(yǔ)法),這一點(diǎn)和已經(jīng)廢棄的 slot attribute 不同伯诬。

 <test1 style="margin: 20px">
    <template v-slot:name>這是v-slot使用的具名插槽</template></test1
  >
<test1 style="margin: 20px">
     <template v-slot:default="{ play }"
       >這是v-slot使用的作用域插槽 {{ play }}</template
     ></test1
   >
 <test1 style="margin: 20px" v-slot:default="{ play }">
    獨(dú)占默認(rèn)插槽的縮寫(xiě)語(yǔ)法:當(dāng)被提供的內(nèi)容只有默認(rèn)插槽時(shí)晚唇,組件的標(biāo)簽才可以被當(dāng)作插槽的模板來(lái)使用---{{ play}}
 </test1>

注意默認(rèn)插槽的縮寫(xiě)語(yǔ)法不能和具名插槽混用,因?yàn)樗鼤?huì)導(dǎo)致作用域不明確盗似,只要出現(xiàn)多個(gè)插槽哩陕,請(qǐng)始終為所有的插槽使用完整的基于template 的語(yǔ)法

4. 解構(gòu)插槽 Prop

定義一個(gè)子組件

Vue.component("test2", {
  props: ["lists"],
  template: `
            <div>
                <ul>
                    <li v-for="item in lists">
                        <slot :item="item"></slot>
                    </li>
                </ul>
            </div>
        `,
});

父組件

<test2 :lists="list" style="margin: 20px">
    <template v-slot="{ item }"> 解構(gòu): {{ item }} </template>
  </test2>

輸出:

解構(gòu): { "name": "蘇蘇1" }
解構(gòu): { "name": "蘇蘇2" }
解構(gòu): { "name": "蘇蘇3" }
解構(gòu): { "name": "蘇蘇4" }

父組件:重命名

 <test2 :lists="list" style="margin: 20px">
    <template v-slot="{ item: user }"> 重命名: {{ user.name }} </template>
  </test2>

輸出:

重命名: 蘇蘇1
重命名: 蘇蘇2
重命名: 蘇蘇3
重命名: 蘇蘇4

父組件:定義后備內(nèi)容,用于插槽 prop 是 undefined 的情形

<test2 :lists="list" style="margin: 20px">
 <template v-slot="{ item = { name: '2332' } }">
     定義后備內(nèi)容,用于插槽 prop 是 undefined 的情形: {{ item.name }}
   </template>
 </test2>

5.動(dòng)態(tài)插槽名

動(dòng)態(tài)指令參數(shù)也可以用在 v-slot 上悍及,來(lái)定義動(dòng)態(tài)的插槽名

 <test1 style="margin: 20px">
     <template v-slot:[dynamicSlotName]> 動(dòng)態(tài)插槽名--sss </template>
 </test1>
 ...
 dynamicSlotName: "name",

輸出:

Hello,蘇蘇! 動(dòng)態(tài)插槽名--sss 這是默認(rèn)的slot 這是默認(rèn)的slot

6.具名插槽的縮寫(xiě)

具名插槽的縮寫(xiě),跟 v-on 和 v-bind 一樣闽瓢,v-slot 也有縮寫(xiě),即把參數(shù)之前的所有內(nèi)容 (v-slot:) 替換為字符 #心赶。例如 v-slot:header 可以被重寫(xiě)為 #header,然而扣讼,和其它指令一樣,該縮寫(xiě)只在其有參數(shù)的時(shí)候才可用园担,你希望使用縮寫(xiě)的話届谈,你必須始終以明確插槽名取而代之,以#default=開(kāi)始

7.完整代碼

<template>
  <div class="contentBox">
    <List>
      <ListItem>
        <ListItemMeta
          :avatar="src"
          title="什么是插槽"
          description="插槽就是Vue實(shí)現(xiàn)的一套內(nèi)容分發(fā)的API弯汰,將<slot></slot>元素作為承載分發(fā)內(nèi)容的出口,沒(méi)有插槽的情況下在組件標(biāo)簽內(nèi)些一些內(nèi)容是不起任何作用"
        />
      </ListItem>
      <ListItem>
        <ListItemMeta
          :avatar="src"
          title="什么是默認(rèn)插槽"
          description=" 木有name的就是默認(rèn)插槽艰山,捕獲所有未被匹配的內(nèi)容"
        />
      </ListItem>
      <ListItem>
        <ListItemMeta
          :avatar="src"
          title="什么是具名插槽"
          description="具名插槽,就是給這個(gè)插槽起個(gè)名字咏闪,如起名一個(gè)為name曙搬,一個(gè)為age,一個(gè)不命名"
        />
      </ListItem>
      <ListItem>
        <ListItemMeta
          :avatar="src"
          title="什么是作用域插槽"
          description="組件上的屬性鸽嫂,可以在組件元素內(nèi)使用纵装,如為slot定義一個(gè)play屬性,使用組件時(shí)候添加屬性slot-scope"
        />
      </ListItem>
      <ListItem>
        <ListItemMeta
          :avatar="src"
          title="什么是解構(gòu)插槽 Prop"
          description="作用域插槽的內(nèi)部工作原理是將你的插槽內(nèi)容包裹在一個(gè)擁有單個(gè)參數(shù)的函數(shù)里据某,可以使用 ES2015 解構(gòu)來(lái)傳入具體的插槽 prop"
        />
      </ListItem>
    </List>
    <test1 style="margin: 20px"></test1>
    <test1 style="margin: 20px">eg:插槽的使用</test1>
    <test1 style="margin: 20px"
      >eg:具名插槽的使用 <template slot="name">蘇蘇小蘇蘇111</template
      ><template slot="age">18歲</template></test1
    >
    <test1 style="margin: 20px"
      >eg:作用域插槽使用
      <template slot="name" slot-scope="play">Suunto{{ play }}</template></test1
    >
    <test1 style="margin: 20px"
      >eg:作用域插槽使用
      <template slot="name" slot-scope="{ play }"
        >Suunto{{ play }}</template
      ></test1
    >
    <div style="margin: 20px; font-weight: bold; font-size: 25px">
      作用域插槽使用
    </div>
    <test2 :lists="list" style="margin: 20px">
      <template slot-scope="item">
        {{ item }}
      </template>
    </test2>
    <test2 :lists="list" style="margin: 20px">
      <template slot-scope="{ item }">
        {{ item.name }}
      </template>
    </test2>
    <test2 :lists="list" style="margin: 20px">
      <template slot-scope="{ item }">
        <div v-if="item.name == '蘇蘇1'">數(shù)據(jù)1</div>
        <div v-else>其他數(shù)據(jù)</div>
      </template>
    </test2>
    <div style="margin: 20px; font-weight: bold; font-size: 25px">
      v-slot的使用
    </div>
    <div style="margin: 20px; font-weight: bold; font-size: 20px">
      注意 v-slot 只能添加在 template 上
      (或者獨(dú)占默認(rèn)插槽的縮寫(xiě)語(yǔ)法)橡娄,這一點(diǎn)和已經(jīng)廢棄的 slot attribute 不同。
    </div>
    <test1 style="margin: 20px">
      <template v-slot:name>這是v-slot使用的具名插槽</template></test1
    >
    <test1 style="margin: 20px">
      <template v-slot:default="{ play }"
        >這是v-slot使用的作用域插槽 {{ play }}</template
      ></test1
    >
    <test1 style="margin: 20px" v-slot:default="{ play }">
      獨(dú)占默認(rèn)插槽的縮寫(xiě)語(yǔ)法:當(dāng)被提供的內(nèi)容只有默認(rèn)插槽時(shí)癣籽,組件的標(biāo)簽才可以被當(dāng)作插槽的模板來(lái)使用------{{
        play
      }}
    </test1>
    <test1 style="margin: 20px" v-slot="{ play }">
      獨(dú)占默認(rèn)插槽的縮寫(xiě)語(yǔ)法:不帶參數(shù)的 v-slot 被假定對(duì)應(yīng)默認(rèn)插槽 -------{{
        play
      }}
    </test1>
    <div style="margin: 20px; font-weight: bold; font-size: 20px">
      注意默認(rèn)插槽的縮寫(xiě)語(yǔ)法不能和具名插槽混用挽唉,因?yàn)樗鼤?huì)導(dǎo)致作用域不明確,只要出現(xiàn)多個(gè)插槽筷狼,請(qǐng)始終為所有的插槽使用完整的基于
      template 的語(yǔ)法
    </div>
    <div style="margin: 20px; font-weight: bold; font-size: 20px">
      解構(gòu)插槽 Prop
    </div>
    <test2 :lists="list" style="margin: 20px">
      <template v-slot="{ item }"> 解構(gòu): {{ item }} </template>
    </test2>
    <test2 :lists="list" style="margin: 20px">
      <template v-slot="{ item: user }"> 重命名: {{ user.name }} </template>
    </test2>
    <test2 :lists="list" style="margin: 20px">
      <template v-slot="{ item = { name: '2332' } }">
        定義后備內(nèi)容瓶籽,用于插槽 prop 是 undefined 的情形: {{ item.name }}
      </template>
    </test2>
    <div style="margin: 20px; font-weight: bold; font-size: 20px">
      動(dòng)態(tài)插槽名
    </div>
    <test1 style="margin: 20px">
      <template v-slot:[dynamicSlotName]> 動(dòng)態(tài)插槽名--sss </template>
    </test1>
    <div style="margin: 20px; font-weight: bold; font-size: 20px">
      具名插槽的縮寫(xiě),跟 v-on 和 v-bind 一樣,v-slot
      也有縮寫(xiě)埂材,即把參數(shù)之前的所有內(nèi)容 (v-slot:) 替換為字符 #塑顺。例如
      v-slot:header 可以被重寫(xiě)為
      #header,然而,和其它指令一樣俏险,該縮寫(xiě)只在其有參數(shù)的時(shí)候才可用严拒,你希望使用縮寫(xiě)的話,你必須始終以明確插槽名取而代之竖独,以#default=開(kāi)始
    </div>
  </div>
</template>

<script>
// 在 2.6.0 中糙俗,我們?yōu)榫呙宀酆妥饔糜虿宀垡肓艘粋€(gè)新的統(tǒng)一的語(yǔ)法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 這兩個(gè)目前已被廢棄但未被移除且仍在文檔中的 attribute
import Vue from "vue";
Vue.component("test1", {
  template: `<div>
    Hello,蘇蘇!
    <slot name="name" play="玩游戲"></slot>
    ---這是米----
    <slot name="age"></slot>
    <slot play="玩耍">這是默認(rèn)的slot</slot>
    <slot say="說(shuō)哈">這是默認(rèn)的slot</slot>
   </div>`,
});

// 綁定在 <slot> 元素上的 attribute 被稱為插槽 prop
Vue.component("test2", {
  props: ["lists"],
  template: `
            <div>
                <ul>
                    <li v-for="item in lists">
                        <slot :item="item"></slot>
                    </li>
                </ul>
            </div>
        `,
});
export default {
  data() {
    return {
      dynamicSlotName: "name",
      src: require("@/assets/img/susu.jpg"),
      list: [
        {
          name: "蘇蘇1",
        },
        {
          name: "蘇蘇2",
        },
        {
          name: "蘇蘇3",
        },
        {
          name: "蘇蘇4",
        },
      ],
    };
  },
};
</script>

<style>
</style>

8.完整代碼预鬓,關(guān)注公眾號(hào) 蘇蘇的bug,更多vue相關(guān),盡在蘇蘇的碼云如果對(duì)你有幫助格二,歡迎你的star+訂閱劈彪!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市顶猜,隨后出現(xiàn)的幾起案子沧奴,更是在濱河造成了極大的恐慌,老刑警劉巖长窄,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滔吠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挠日,警方通過(guò)查閱死者的電腦和手機(jī)疮绷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嚣潜,“玉大人冬骚,你說(shuō)我怎么就攤上這事《悖” “怎么了只冻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)计技。 經(jīng)常有香客問(wèn)我喜德,道長(zhǎng),這世上最難降的妖魔是什么垮媒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任舍悯,我火速辦了婚禮,結(jié)果婚禮上涣澡,老公的妹妹穿的比我還像新娘贱呐。我一直安慰自己,他們只是感情好入桂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布奄薇。 她就那樣靜靜地躺著,像睡著了一般抗愁。 火紅的嫁衣襯著肌膚如雪馁蒂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天蜘腌,我揣著相機(jī)與錄音沫屡,去河邊找鬼。 笑死撮珠,一個(gè)胖子當(dāng)著我的面吹牛沮脖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼勺届,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驶俊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起免姿,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饼酿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后胚膊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體故俐,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年紊婉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了药版。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肩榕,死狀恐怖刚陡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情株汉,我是刑警寧澤筐乳,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站乔妈,受9級(jí)特大地震影響蝙云,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜路召,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一勃刨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧股淡,春花似錦身隐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至埠帕,卻和暖如春垢揩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敛瓷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工叁巨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呐籽。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓锋勺,卻偏偏與公主長(zhǎng)得像蚀瘸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宙刘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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