湖南seo網(wǎng)站多少錢推廣優(yōu)化師
可以先閱讀組件基礎(chǔ)-簡(jiǎn)單了解通過插槽分發(fā)內(nèi)容。
一、插槽定義
插槽將子組件標(biāo)簽間的內(nèi)容分發(fā)到子組件模板的<slot>
標(biāo)簽位置。
如果沒有<slot>
標(biāo)簽,那么該內(nèi)容將被丟棄。
二、編譯作用域
內(nèi)容在哪個(gè)作用域編譯,就可以訪問哪個(gè)作用域的數(shù)據(jù)。
1.父級(jí)模板的作用域
在父組件的模板中定義的變量,可以在整個(gè)父組件的模板中訪問,包括子組件中的插槽內(nèi)容。
例如,我們?cè)诟附M件中定義一個(gè)變量url
,在子組件插槽內(nèi)容中訪問:
<template><div><navigation-link url="./index">This URL is {{url}}</navigation-link></div>
</template>
2.子級(jí)模板的作用域
在子組件中定義的數(shù)據(jù)和變量,只能在子組件中訪問,而不能在父組件中訪問。
三、后備內(nèi)容
插槽的后備內(nèi)容即沒有提供內(nèi)容時(shí)的默認(rèn)內(nèi)容。
定義方式很簡(jiǎn)單:
<slot>Slot的默認(rèn)內(nèi)容</slot>
四、具名插槽
顧名思義:具有名字的插槽。
你可以為插槽指定名稱name
,以便將內(nèi)容分發(fā)到特定的插槽中。
接著,通過在template
元素上使用v-slot:插槽名參數(shù)
指令使用具名插槽:
完整示例:
<!DOCTYPE html>
<html><head><title>Vue 2 具名插槽 Demo</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head><body><div id="app"><my-layout><p>主要內(nèi)容的一個(gè)段落。</p><p>另一個(gè)主要段落。</p><template v-slot:header><h1>這里可能是一個(gè)頁(yè)面標(biāo)題</h1></template><template v-slot:footer><p>這里是一些聯(lián)系信息</p></template></my-layout></div><script>Vue.component('my-layout',{template:`<div><header><slot name="header"></slot></header><main><!--默認(rèn)插槽,隱含name為`default`--><slot></slot></main><footer><slot name="footer"></slot></footer></div>`})var vm = new Vue({el: '#app',});</script>
</body></html>
雖然我們故意將默認(rèn)插槽的內(nèi)容放在了名為header
的代碼前面,但是結(jié)果依然按照插槽原本的順序排列。
動(dòng)態(tài)插槽名
我們可以使用動(dòng)態(tài)參數(shù)綁定插槽名。
<template v-slot:[dynamicSlotName]></template>
具名插槽的縮寫
v-slot
指令也有縮寫,即使用#
替代v-slot:
,這樣做我們就必須明確給出其插槽名稱。
五、作用域插槽
作用域插槽這個(gè)概念是指讓插槽內(nèi)容能夠訪問子組件中才有的數(shù)據(jù)。
我們只需給<slot>
綁定prop,然后使用v-slot的值訪問該prop
。v-slot的值實(shí)際上是所有綁定的prop的集合。
上例子:
<!DOCTYPE html>
<html><head><title>Vue 2 作用域插槽 Demo</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head><body><div id="app"><my-component><template v-slot="slotProps"><p>{{slotProps.text}}</p></template></my-component></div><script>Vue.component('my-component', {template: `<div><slot text="hello"></slot></div>`})var vm = new Vue({el: '#app',});</script>
</body></html>
注意,上面例子中我們v-slot
指令沒有帶參數(shù),實(shí)際上它默認(rèn)帶了個(gè)default
參數(shù),如果存在別的具名插槽,那么我就必須為v-slot
指令帶上參數(shù)。
通過作用域插槽的機(jī)制,我們可以實(shí)現(xiàn)父組件控制插槽內(nèi)容來控制子組件渲染不同的結(jié)果。
額外的不相關(guān)話題:使用
v-bind
指令時(shí),什么時(shí)候加:
?私以為:這取決于v-bind綁定的屬性的值,其值為靜態(tài)字符串,不加
:
,其值若為變量或?qū)ο笞置媪?#xff0c;則加:
。
解構(gòu)插槽prop
事實(shí)上,插槽內(nèi)容會(huì)被封裝在一個(gè)函數(shù)內(nèi),v-slot
的值就是其參數(shù)。
作為函數(shù)參數(shù),我們可以使用JavaScript的解構(gòu)語(yǔ)法,這會(huì)使得代碼更簡(jiǎn)潔。
1.普通解構(gòu)
<template v-slot="{text}"><p>{{text}}</p>
</template>
2.重命名prop
<template v-slot="{text:msg}"><p>{{msg}}</p>
</template>
3.指定后備內(nèi)容
<template v-slot="{text={msg:'Hello'}}"><p>{{text.msg}}</p>
</template>