Vue 插槽(v-slot)


前言

v2.6.0 版本開始,插槽的 slotslot-scope 命令已經廢棄,采用 v-slot 命令來替代前兩個命令,詳情請見官網:https://cn.vuejs.org/v2/guide/components-slots.html#插槽內容

具名插槽

<child-cpn>
  <div slot="left">這是左</div>
  <div>這是中間</div>
  <div slot="right">這是右</div>
</child-cpn>

對應:

<child-cpn>
  <template v-slot:left>這是左</template>
  <div>這是中間</div>
  <template v-slot:right>這是右</template>
</child-cpn>

注意:v-slot 只能添加在 <template> 上 (只有一種例外情況),這一點和已經廢棄的 slot attribute 不同。

作用域插槽

childCpn 組件定義如下:

// names: ['張三', '李四', '王五']
<template>
	<div class="child">
		<slot :names="names"></slot>
	</div>
</template>

slot-scope 命令的使用:

<child-cpn>
  <div slot-scope="slotProps">
    {{slotProps.names.join(',')}}
  </div>
</child-cpn>

對應(若沒有設置插槽的 name 屬性,則 name 屬性的默認值為 default):

<child-cpn>
  <template v-slot:default="slotProps">
		{{slotProps.names.join(',')}}
  </template>
</child-cpn>

在上述情況下,當被提供的內容只有默認插槽時,組件的標簽才可以被當作插槽的模板來使用。這樣我們就可以把 v-slot 直接用在組件上:

<child-cpn v-slot:default="slotProps">
  {{slotProps.names.join(',')}}
</child-cpn>

這種寫法還可以更簡單。就像假定未指明的內容對應默認插槽一樣,不帶參數的 v-slot 被假定對應默認插槽:

<child-cpn v-slot="slotProps">
  {{slotProps.names.join(',')}}
</child-cpn>

注意默認插槽的縮寫語法不能和具名插槽混用,因為它會導致作用域不明確:

// wrong syntax
<child-cpn v-slot="slotProps">
  {{slotProps.names.join(',')}}
  <template v-slot:other="otherProps">
		// some content here.
  </template>
</child-cpn>

只要出現多個插槽,請始終為所有的插槽使用完整的基於 <template> 的語法:

// correct syntax
<child-cpn>
  <template v-slot:default="slotProps">
		{{slotProps.names.join(',')}}
  </template>
  <template v-slot:other="otherProps">
		// some content here.
  </template>
</child-cpn>

具名插槽的縮寫

v-onv-bind 一樣,v-slot 也有縮寫,即把參數之前的所有內容 (v-slot:) 替換為字符 #。前面具名插槽中的例子:

<child-cpn>
  <template v-slot:left>這是左</template>
  <div>這是中間</div>
  <template v-slot:right>這是右</template>
</child-cpn>

縮寫:

<child-cpn>
  <template #left>這是左</template>
  <div>這是中間</div>
  <template #right>這是右</template>
</child-cpn>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM