vue中插槽是如何使用的,简单明了,速懂~

161 阅读2分钟

vue2 中插槽的详细使用(包含新旧版本)

因为想更详细的去了解插槽的使用,于是就去网上查找了各种资料看来看去还是存在着疑惑,在写具名插槽的时候为啥有些地方写v- slot、或者slot或者#代替呢,等等一系列问题。于是研究了一下,终于是搞明了。插槽(slot)是一种用于在父组件中向子组件传递内容的方式。插槽允许我们在子组件的特定位置插入父组件中的内容,以实现更灵活的组件复用,这是一种很好的封装组件方式。

插槽在父组件引用的写法在2.6.0本版之后发生了变化,因此会产生2种不同的写法

插槽一共分为3种方式:

1.匿名插槽

2.具名插槽

3.作用域插槽

一、匿名插槽

在父组件中引用子组件的时候,子组件中写的内容,会全部一起传到这个子组件页面<slot></slot> 所在的位置。父组件中可以多次引用这个子组件,则引用几次就会渲染几次。

示例:

子组件中写法

<template> 
  <div>
    <h1>这是子组件:测试匿名插槽</h1>
   	<slot></slot>
  </div>
</template>

父组件中(写法不变)

<template> 
    <son> 
      匿名插槽内容
    </son>   
</template>
<script>
import son from "./son.vue"
export default {
    components:{son},
}

结果展示: 在这里插入图片描述

二、具名插槽

当子组件中需要使用多个的时候,为了区别把当前内容放到什么位置,就需要使用具名插槽。意思就是给插槽指定名称,然后 一 一对应。

示例

子组件中写法:

<template>
    <div>
    	//name属性表示该插槽所定义的名字
        <slot name="name1"></slot>       
        <slot name="name2"></slot>
    </div>
</template>

父组件中写法:(2.6.0版本之后)

<template> 
  <div class="son">
    <h1>这是具名插槽</h1>
    //写法一
    //name1和name2是对应子组件slot中定义的name值
    <son v-slot:name1> 
      具名插槽内容1
    </son>   
    //写法二(简写)
    <son #name2> 
      具名插槽内容2
    </son>  
  </div>
</template>
<script>
import son from "./son.vue"
export default {
    components:{son},
}
</script>

父组件中写法:(2.6.0版本之前)

<template> 
  <div class="son">
    <h1>这是具名插槽</h1>
    //name1是对应子组件slot中定义的name值
    <son slot="name1"> 
      具名插槽内容
    </son>    
  </div>
</template>
<script>
import son from "./son.vue"
export default {
    components:{son},
}
</script>

结果展示: 在这里插入图片描述

三、作用域插槽

主要是为了在父组件中访问子组件中的数据而提出来的一种方案。需要在子组件中定义时传递数据,然后提供给父组件引用时使用。

示例

子组件写法

<template>
   <div>
   	 //name表示该插槽的名字,data表示传递的数据,可以取任何名
     <slot name="zyyName" :data="data1"></slot>
     <slot name="zyyName2" :data="data2"></slot>
   </div>
</template>
<script>
export default {
    data(){
        return {
            data1:{name:'年龄',age:'18'},
            data2:{name:'年龄',age:'19'}
        }
    }
}

父组件写法(2.6.0版本之后)

<template> 
  <div class="son">
    <h1>这是作用域插槽</h1>
    //写法一
    //zyyName对应子组件slot名字,{data}是结构的写法,data是对应子组件传递的数据。
    <son v-slot:zyyName="{ data }"> 
      作用域内容 {{data.name}}:{{data.age}}
    </son> 
    //写法二(简写)  
    <son #zyyName2="{ data }"> 
      作用域内容2 {{data.name}}:{{data.age}}
    </son>   
  </div>
</template>

<script>
import son from "./son.vue"
export default {
    components:{son},
}
</script>

父组件中写法(2.6.0版本之前,在vue3中这种写法已不支持)

<template> 
  <div class="son">
    <h1>这是作用域插槽</h1>
     //zyyName对应子组件slot名字,{data}是结构的写法,slot-scope中的data是对应子组件传递的数据。
    <son slot="zyyName" slot-scope="{data}"> 
      作用域内容 {{data.name}}:{{data.age}}
    </son> 
  </div>
</template>

<script>
import son from "./son.vue"
export default {
    components:{son},
}
</script>

结果展示: 在这里插入图片描述

注意:在使用作用域插槽时,当子组件需要传递多个数据时,也可以不使用结构的写法,写法如下。

示例

子组件中写法

<template>
  <div>
  	 //name表示该插槽的名字,data表示传递的数据,可以取任何名
    <slot name="zyyName" :data1="data1"  :data2=”data2“></slot>
  </div>
</template>
<script>
export default {
   data(){
       return {
           data1:{name:'年龄',age:'18'},
           data2:{name:'年龄',age:'19'}
       }
   }
}

父组件(2.6.0版本之后)

<template> 
  <div class="son">
    <h1>这是作用域插槽</h1> 
    <son #zyyName2="allData"> 
      <p>作用域内容1 {{allData.data1.name}}:{{allData.data1.age}}</p>
      <p>作用域内容2 {{allData.data2.name}}:{{allData.data2.age}}</p>
    </son>   
  </div>
</template>

<script>
import son from "./son.vue"
export default {
    components:{son},
}
</script>

结果展示: 在这里插入图片描述

四、版本对比前后插槽写法

在这里插入图片描述