vue2 vs vue3 插槽

前言:插槽的使用其實是很簡單茫因,你只需要明白兩點:

1.插槽是使用在子組件中的。

2.插槽是為了將父組件中的子組件模板數(shù)據(jù)正常顯示

vue2.0的插槽

話不多說直接上案例:

<div id="app">
    <div class="father">
        <h3>這里是父組件</h3>
        <child>
           <span>我是插槽插入的內容</span>
        </child>
    </div>
</div>
<template id="child">
    <div class="child">
        <h3>這里是子組件</h3>
        <slot></slot>
    </div>
</template>
<script>
    var vm = new Vue({
        el: '#app',
        data: {},
        components: {
            child: {
                template: '#child'
            }
        }

    });

</script>

上面的代碼所展示的效果就是你會發(fā)現(xiàn)在 <h3>這里是子組件</h3> 會多一行 <span>我是插槽插入的內容</span>
如果你在子組件里面不寫 <slot></slot> 的話你會發(fā)現(xiàn)你無論在父組件里面寫多少標簽都不會被渲染到子標簽中。

<font color=red>這就是傳說中的插槽了口猜,怎么樣是不是很簡單伴网?</font>

上面的案例是匿名插槽,下面我們來看一下 “具名插槽”
<div id="app">
    <div class="father">
        <h3>這里是父組件</h3>
        <child>
            <span slot="demo1">菜單1</span>
            <span>菜單2</span>
            <span slot="demo3">菜單3</span>
        </child>
    </div>
</div>
<template id="child">
    <div class="child">
        <h3>這里是子組件</h3>
        <slot></slot>
        <slot name="demo3"><slot>
    </div>
</template>
<script>
    var vm = new Vue({
        el: '#app',
        data: {},
        components: {
            child: {
                template: '#child'
            }
        }
    });
</script>

具名插槽其實就是在父組件中添加一個 slot='自定義名字' 的屬性烫幕,
然后在子組件中的<slot><slot> 里面添加 <name='自定義名字' 即可
如果父組件中有一部分沒有添加 slot 屬性俺抽,則此處就是默認的插槽,在子組件中的<slot></slot> 直接就是使用的父組件的默認插槽部分

作用域插槽

父組件模板的所有東西都會在父級作用域內編譯较曼;子組件模板的所有東西都會在子級作用域內編譯磷斧。
不過,我們可以在父組件中使用slot-scope 特性從子組件獲取數(shù)據(jù)
前提是需要在子組件中使用:data=data 先傳遞data 的數(shù)據(jù)

<div id="app">
    <div class="father">
        <h3>這里是父組件</h3>
        <child>
            <div slot-scope="user">
                {{user.data}}
            </div>
        </child>
    </div>
</div>
<script>
    Vue.component('child', {
        template:'' +
            '<div class="child">\n' +
            '    <h3>這里是子組件</h3>\n' +
            '    <slot  :data="data"></slot>\n' +
            '  </div>',
        data: function () {
            return {
                data: ['zhangsan', 'lisi', 'wanwu', 'zhaoliu', 'tianqi', 'xiaoba']
            }
        }
    });
    var vm = new Vue({
        el: '#app',
    });
</script>

頁面顯示的結果如下:

這里是父組件

這里是子組件

['zhangsan', 'lisi', 'wanwu', 'zhaoliu', 'tianqi', 'xiaoba']

vue3.0中插槽的使用

匿名插槽用法不變

下面我們來看一下具名插槽的寫法

// 子組件
<div class="hello">
    我是一個封裝的組件
     <slot name="num"></slot>
  </div>
  
  
// 父組件
<HelloWorld v-model="masg" v-slot:num>
    <div>我是插槽插入的</div>
</HelloWorld>

// 父組件的另外一個寫法
<HelloWorld v-model="masg">
    <template v-slot:num>
         <div>我是插槽插入的</div>
    </template>
</HelloWorld>

Vue3(其實從2.6開始)中引入了一個新的指令 v-slot诗芜,用來表示具名插槽和默認插槽瞳抓。
在 v2.5 之后屏蔽了 slot-scope,
v-slot引入使其插槽更接近指令化。

下面我們來看一下作用域插槽的用法
// 子組件
<div class="hello">
    我是一個封裝的組件
     <slot :num="num"></slot>
</div>

<script>
import { ref } from 'vue';
export default {
  name: 'HelloWorld',
  props: {
    // msg: String,
    modelValue: String
  },
 setup(prop,context){
   const num = ref(10);
   return { num }
 }
}
</script>

// 父組件
<HelloWorld>
  <template v-slot="{num}">
     <div>{{num}}</div>
  </template>
</HelloWorld>

// 也可以改成下面的寫法
<HelloWorld v-slot="{num}">
   <div>{{num}}</div>
</HelloWorld>


和 v-bind和v-on相似伏恐,縮寫只有在存在參數(shù)時才生效孩哑,這就意味著v-slot沒有參數(shù)時不能使用#=,對于默認插槽,可以使用#default來代替v-slot


// 上面我們寫過具名插槽可以這么寫

<HelloWorld v-model="masg">
    <template #num>
         <div>我是插槽插入的</div>
    </template>
</HelloWorld>

// 或者如上面的作用域插槽也可以改成下面的寫法

<HelloWorld>
  <template #default="{num}">
     <div>{{num}}</div>
  </template>
</HelloWorld>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末翠桦,一起剝皮案震驚了整個濱河市横蜒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌销凑,老刑警劉巖丛晌,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斗幼,居然都是意外死亡澎蛛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門蜕窿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谋逻,“玉大人,你說我怎么就攤上這事桐经』僬祝” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵阴挣,是天一觀的道長气堕。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么茎芭? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任揖膜,我火速辦了婚禮,結果婚禮上梅桩,老公的妹妹穿的比我還像新娘次氨。我一直安慰自己,他們只是感情好摘投,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布煮寡。 她就那樣靜靜地躺著,像睡著了一般犀呼。 火紅的嫁衣襯著肌膚如雪幸撕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天外臂,我揣著相機與錄音坐儿,去河邊找鬼。 笑死宋光,一個胖子當著我的面吹牛貌矿,可吹牛的內容都是我干的。 我是一名探鬼主播罪佳,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逛漫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赘艳?” 一聲冷哼從身側響起酌毡,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蕾管,沒想到半個月后枷踏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡掰曾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年旭蠕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旷坦。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡掏熬,死狀恐怖,靈堂內的尸體忽然破棺而出塞蹭,到底是詐尸還是另有隱情孽江,我是刑警寧澤讶坯,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布番电,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏漱办。R本人自食惡果不足惜这刷,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娩井。 院中可真熱鬧,春花似錦洞辣、人聲如沸咐刨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽定鸟。三九已至,卻和暖如春著瓶,著一層夾襖步出監(jiān)牢的瞬間联予,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工材原, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沸久,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓余蟹,卻偏偏與公主長得像卷胯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子威酒,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容