vue插槽slot的理解和使用方法
前言
Vue的slot插槽,可以從字面意思來(lái)了解用途,占用占坑的意思,既然是占坑肯定是先占坑后面有其他具體的內(nèi)容來(lái)替換代替。根據(jù)slot的應(yīng)用場(chǎng)景可以分為匿名slot和具名slot。
一、個(gè)人理解及插槽的使用場(chǎng)景
剛開(kāi)始看教程我的疑惑是為什么要用插槽,它的使用場(chǎng)景是什么,很多解釋都是“父組件向子組件傳遞dom時(shí)會(huì)用到插槽”,這并不能很好的解決我的疑惑。既然你用了子組件,你為什么要給她傳一些dom,直接去定義復(fù)用的子組件不就好了。后來(lái)想想覺(jué)得一個(gè)復(fù)用的組件在不同的地方只有些許變化,如果去重寫子組件是很不明智的一件事,當(dāng)然也可以將不同之處都寫在子組件里,然后通過(guò)父組件傳來(lái)的標(biāo)識(shí)進(jìn)行選擇顯示。其實(shí)質(zhì)是對(duì)子組件的擴(kuò)展,通過(guò)slot插槽向組件內(nèi)部指定位置傳遞內(nèi)容,即將<slot></slot>元素作為承載分發(fā)內(nèi)容的出口;
二、用于理解的例子
目前還沒(méi)接觸到使用插槽解決實(shí)際問(wèn)題很好的例子,只能這樣去為了理解插槽而用,可能并沒(méi)有很好的利用到插槽的好處。
在父組件定義想要傳入子組件作為插槽的內(nèi)容,App.vue
<template>
<div id="app">
<div>
<input type="text" v-model="info">
<button @click="handleClick">添加</button>
</div>
<todolist v-for="item in list" :key="item" :message="msg">
<template v-slot:item="itemProps" >
<!-- tips1:<span>即為插槽內(nèi)容
tips2:item是插槽的名字,為具名插槽,可對(duì)應(yīng)插入到子組件中具體的插槽位置
tips3:itemProps可以獲取到子組件(即插槽 prop)傳出來(lái)的狀態(tài)(值),
插槽 prop 的對(duì)象命名為 itemProps,可任意命名,itemProps變量存在于 <template> 作用域中
-->
<span :style="{fontSize: '20px', color: itemProps.checked ? 'red': 'blue'}">{{item}}</span>
</template>
</todolist>
</div>
</template>
<script>
import todolist from './components/todolist.vue';
export default {
name: 'App',
components: {
todolist
},
data(){
return {
msg: '4-2-05',
info: '',
list: [],
}
},
methods: {
handleClick() {
// 獲取到input輸入的東西,然后加入到數(shù)組中
this.list.push(this.info);
this.info = ''
}
},
}
</script>
<style>
</style>
在子組件利用<slot></slot>元素作為承載分發(fā)內(nèi)容的出口,父組件的插槽內(nèi)容將在其中顯示,todolist.vue
<template>
<div>
{{message}}
<li class="item">
<input type="checkbox" v-model="checked">
<slot name="item" v-bind="{checked}" ></slot>
<!--插槽內(nèi)容能夠訪問(wèn)子組件中才有的數(shù)據(jù)是很有用的,又因?yàn)楦讣?jí)模板里的所有內(nèi)容都是在父級(jí)作用域中編譯的;子模板里的所有內(nèi)容都是在子作用域中編譯的
所以得想辦法獲取到子組件的數(shù)據(jù)。-->
<!--給子組件綁定一個(gè)動(dòng)態(tài)參數(shù),checked作為一個(gè) <slot> 元素的特性綁定上去,綁定在 <slot> 元素上的特性被稱為插槽 prop-->
</li>
</div>
</template>
<script>
export default {
props: ['item','message'],
// 因?yàn)楦附M件在插槽內(nèi)容里使用item, 即此句代碼<span>{{item}}</span>
// 相當(dāng)于需要傳遞給子組件的內(nèi)容,也就是通常的父子組件通信,所以在子組件需要通過(guò)props來(lái)獲取
data() {
return {
checked: false,
}
},
created() {
console.log(this.message);
}
}
</script>
<style scoped>
.item {
color: red;
}
li{
list-style: none;
}
</style>
三、具體知識(shí)點(diǎn)
1、具名插槽
上面的例子只使用了一個(gè)slot插槽,但有時(shí)我們?cè)谝粋€(gè)組件里可能會(huì)多處使用插槽,我們希望在不同的插槽處插入不同的內(nèi)容,此時(shí)便需要進(jìn)行區(qū)分,<slot> 元素有一個(gè)特殊的特性:name。這個(gè)特性可以用來(lái)定義插槽的名字,在向具名插槽提供內(nèi)容的時(shí)候,我們可以在一個(gè) <template> 元素上使用
v-slot 指令,并以 v-slot 的參數(shù)的形式寫出插槽的名稱,使其一一對(duì)應(yīng)。
<slot name="header"></slot> <slot name="content"></slot> <slot ></slot> //一個(gè)不帶 name 的 <slot> 出口會(huì)帶有隱含的名字“default”。
2、作用域插槽
為了使父組件的插槽內(nèi)容可以使用子組件的數(shù)據(jù),可以在 <slot> 元素上綁定想要傳遞的數(shù)據(jù),此特性被稱為插槽 prop。同時(shí)在父級(jí)作用域中,給 v-slot 帶一個(gè)值來(lái)定義我們提供的插槽 prop 的名字,便可獲取到。但此內(nèi)容只在 <template>作用域內(nèi)可用。
四、自 2.6.0 起有所更新的語(yǔ)法變化
1、帶有slot特性的具名插槽
2、帶有slot-scope特性的作用域插槽
五、突發(fā)奇想的調(diào)換
因?yàn)榭吹揭粋€(gè)別人寫的關(guān)于slot的帖子,他應(yīng)該是寫錯(cuò)了插槽在子父組件的內(nèi)容,這也就相當(dāng)于從子組件傳一個(gè)插槽內(nèi)容給父組件。仔細(xì)想想這思路有問(wèn)題,既然都引用了子組件,父組件便可以訪問(wèn)到子組件的所有內(nèi)容,現(xiàn)在卻非要通過(guò)插槽來(lái)傳遞,多此一舉。
然后我就試了一下將插槽內(nèi)容卸載子組件里,果然出現(xiàn)了報(bào)錯(cuò),如下:
- <template v-slot> can only appear at the root level inside the receiving the component(slot的只能出現(xiàn)在接受組件的根級(jí)別)
也就是只能在父組件使用。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Vue PC端實(shí)現(xiàn)掃碼登錄功能示例代碼
目前大多數(shù)PC端應(yīng)用都有配套的移動(dòng)端APP,如微信,淘寶等,通過(guò)使用手機(jī)APP上的掃一掃功能去掃頁(yè)面二維碼圖片進(jìn)行登錄,使得用戶登錄操作更方便,安全,快捷,這篇文章主要介紹了Vue PC端如何實(shí)現(xiàn)掃碼登錄功能,需要的朋友可以參考下2023-01-01
vue+mockjs模擬數(shù)據(jù)實(shí)現(xiàn)前后端分離開(kāi)發(fā)的實(shí)例代碼
本篇文章主要介紹了vue+mockjs模擬數(shù)據(jù)實(shí)現(xiàn)前后端分離開(kāi)發(fā)的實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
VUE3常見(jiàn)面試題總結(jié)大全(看這一篇就夠了)
Vue.js是一個(gè)流行的前端JavaScript框架,用于構(gòu)建用戶界面和單頁(yè)應(yīng)用,這篇文章主要給大家介紹了關(guān)于VUE3常見(jiàn)面試題總結(jié)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
詳解vue中在循環(huán)中使用@mouseenter 和 @mouseleave事件閃爍問(wèn)題解決方法
這篇文章主要介紹了詳解vue中在循環(huán)中使用@mouseenter 和 @mouseleave事件閃爍問(wèn)題解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
vue-element-admin開(kāi)發(fā)教程(v4.0.0之后)
由于vue-element-admin的架構(gòu)再4.0.0版本后做了重構(gòu),整體結(jié)構(gòu)上和之前的還是很相似的,但是也有些變化,本文就介紹vue-element-admin開(kāi)發(fā)教程(v4.0.0之后),感興趣的可以了解一下2022-04-04
如何在vue3中使用滑塊檢驗(yàn)vue-puzzle-verification
這篇文章主要介紹了在vue3中使用滑塊檢驗(yàn)vue-puzzle-verification的相關(guān)資料,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11
vue實(shí)現(xiàn)登陸登出的實(shí)現(xiàn)示例
本篇文章主要介紹了vue實(shí)現(xiàn)登陸登出的實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09

