Vue 插槽使用

Vue 插槽使用

因为在2.6.0中,具名插槽作用域插槽 引入了一个新的统一的语法 (即v-slot 指令)。它取代了 slotslot-scope,并且现在网上都说的是一些老版本的内容,官方文档不太容易理解,所以就整理了一篇有关于插槽(slot)使用的文章

Slot 通俗的理解就是“占坑”,在组件模板中占好了位置,当使用该组件标签时候,组件标签里面的内容就会自动填坑(替换组件模板中slot位置)
并且可以作为承载分发内容的出口

内容插槽

定义两个组件 home.vuetest.vue
然后在home.vue组件中引用test.vue组件

插槽内可以包含普通文本

//home.vue
<test>
     Hello Word
test>
//test.vue
<a href="#">
	 <slot>slot>
a>

当组件渲染的时候,会被替换为Hello Word

插槽内也可以包含任何模板代码,包括HTML

在你的index.html引入Font Awesome图标的样式就直接可以用那里面的图标了

//home.vue
<test>
    
    <span class="fa fa-user">span>
    Hello Word
test>

插槽内添加其他组件

//home.vue
<test>
    
    <font-awesome-icon>font-awesome-icon>
    Hello Word
test>

如果中没有包含一个元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃。

在插槽中使用数据

插槽跟模板其他地方一样都可以访问相同的实例属性(也就是相同的"作用域"),而不能访问的作用域

//home.vue
<test>
	//插槽可以获取到home组件里的内容
	Hello {
     {
     enhavo}}
</test>

data(){
     
	return{
     
		enhavo:'word'
	}
}
//home.vue
//这里是获取不到name的,因为这个值是传给<test><test name='you'>
    Hello {
    {name}}
test>

规则:
父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

后备内容(默认内容)插槽

有时候我们需要给插槽设置一个具体的默认内容,当别的组件没有给你内容的时候,那么默认的内容就会被渲染

//test.vue
//在slot插槽里设置默认内容 Submit
<button>
  <slot>Submitslot>
button>

在home.vue里直接使用test.vue如下:

//home.vue
<test>test>

那么最后设置的默认内容 Submit 将会被渲染

<button>
   Submit
button>

假如我们提供内容呢?

//home.vue
<test>按钮test>

那么这个提供的内容将会替代默认的内容被渲染出来

<button>
   按钮
button>

具名插槽

有时候我们一个组件里需要多个插槽

那么怎么办呢? 对于这样的情况,元素有一个特殊的特性:name ,这个特性可以用来定义额外的插槽

<div>
  <header>
    
  header>
  
  <main>
    
  main>
  
  <footer>
    
  footer>
div>

这时候,我们就可以使用name属性

<div>
  <header>
    <slot name="header">slot>
  header>
  
  <main>
    <slot>slot>
  main>
  
  <footer>
    <slot name="footer">slot>
  footer>
div>

如果一个不带name属性的话,那么它的name默认为default
在向具名插槽提供内容的时候,我们可以在