在vue中,插槽是一個用的比較多的API,在官方的文檔中,在 2.6.0 中,我們為具名插槽和作用域插槽引入了一個新的統一的語法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 這兩個目前已被廢棄但未被移除且仍在文檔中的 attribute,
vue插槽的作用:在vue中實現的一套分發內容的API,將slot元素作為承載內容分發出口。用人話說就是:想要在一個組件標簽中添加新的內容,必須在該組件內聲明一個slot元素,否則,添加的新內容則不會被渲染。
通常我們會在vue中將各種通用的功能單獨拿出來進行封裝,以便於后面復用,但是有時候需要復用的組件不是完美契合,這個時候就需要用到插槽,slot可以讓用戶拓展組件,更好的實現組件的復用。
組件插槽分為三種:
1:默認插槽
使用方法:
子組件:
<div>
<p>這里是子組件</p>
<slot></slot>
</div>
父組件:
<div>
<!--引用子組件-->
<myslot>
<p>這里是父組件</p>//當想在父組件中渲染這一行數據時,必須要在引用的子組件中定義一個slot標簽
</myslot>
</div>
最后顯示內容: 這里是子組件 這里是父組件
父組件想在引入的組件中顯示 <p>這里是父組件</p>,就必須先在子組件中用slot定義一個插槽,用來接收父組件傳遞的代碼,再才能正常的在頁面中渲染
2:具名插槽
顧名思義,具名插槽是在slot標簽上有一個屬性:name,可以將指定的代碼放入指定的插槽中
具體定義如下:
<!--子組件-->
<template>
<div>
<hander>
<!--這里放入name=“hander”的代碼段-->
<slot name="hander"></slot>
</hander>
<footer>
<!--這里放入name=“footer”的代碼段-->
<slot name="footer"></slot>
</footer>
</div>
</template>
<!--父組件-->
<div>
<p>大家好,這里是父組件</p>
<template v-slot:hander>
<span>這里是放入hander中的代碼段</span>
</template>
<template v-slot:footer>
<span>這是放在footer中的代碼段</span>
</template>
</div>
注意:v-slot指令只能寫在template中
v-slot可以簡寫為#
3:作用域插槽
作用域插槽主要用於解決的問題是:當父組件向子組件插槽傳遞模板內容時存在訪問子組件數據的問題
可以看例子:
<!--子組件-->
<template> <div> <slot>{{user.name}}<slot> </div> </template> <script> export default{ data(){ return{ user:{ name:"jay", age:18 } } } } </script>
當父組件引用子組件時,想將子組件中的user.name替換為user.age時,不可以直接在父組件中更改子組件中的user.name,因為在官方文檔中,父級模板所有內容都是在父級作用域中編譯的,子級模板所有內容都是在子作用域中編譯的。
為了解決子組件的user不能在父組件中使用的問題,我們可以將user用屬性綁定的方式傳給父組件,父組件用一個自定義名稱進行接收
子組件可以這么寫:
<!--子組件-->
<template>
<div>
<slot :user="user">{{user.name}}<slot>
</div>
</template>
<script>
export default{
data(){
return{
user:{
name:"jay",
age:18
}
}
}
}
</script>
因此,父組件可以這么寫:
<template>
<myslot>
<template v-slot="slotProps">
{{slotProps.user.age}}
</template>
</myslot>
</template>
<script>
import myslot from '@/component/myslot.vue'
export default{
data(){
return{}
},
components:{
myslot
}
}
</script>
在子組件中,將自己的數據用屬性綁定的方式傳輸給父組件,父組件在template中用v-slot="自定義名",進行接收,再通過自定義名.進行數據訪問。
