slot插槽有几种

vue中的slot插槽有3种:

默认插槽、具名插槽、作用域插槽。

插槽的作用就是父组件在使用子组件的时候,可以对子组件的某些地方内容进行自定义。

 

1. 默认插槽

子组件在代码块的某个地方放置 <slot></slot> ,然后父组件在使用子组件时,直接在子组件下面自定义内容即可。

子组件:

 1 // child.vue
 2 
 3 <template lang="pug">
 4 .child 
 5   span 你好,我是:
 6   slot
 7 </template>
 8 <script>
 9 export default {
10   data() {
11     return {};
12   }
13 };
14 </script>
15 <style lang="scss" scoped></style>

父组件:

<template lang="pug">
.parent
    Child
        div 我是插槽,自定义名称
</template>
<script>
export default {
  data() {
    return {};
  }
};
</script>
<style lang="scss" scoped></style>

效果图:

 

 

2. 具名插槽

具名插槽与默认插槽有一点不一样,那就是需要给【slot】标签一个【name】属性,即子组件定义插槽<slot name="自定义名称"></slot>,父组件使用插槽 <template slot="自定义名称"></template>

子组件:

 1 <template lang="pug">
 2 .child 
 3   span 你好,我是:
 4   slot(name="customName")
 5 </template>
 6 <script>
 7 export default {
 8   data() {
 9     return {};
10   }
11 };
12 </script>
13 <style lang="scss" scoped></style>

父组件:

 1 <template lang="pug">
 2 .parent 
 3    Child   
 4      div(slot="customName") 我是插槽,自定义名称
 5 
 6 </template>
 7 <script>
 8 export default {
 9   data() {
10     return {};
11   }
12 };
13 </script>
14 <style lang="scss" scoped></style>

 

3. 作用域插槽

作用域插槽比上面2种插槽更丰富,因为它不仅仅有占位的功能,还有数据传参的功能。【忌:传参时参数名别用name,与具名插槽的name属性冲突】

我个人觉得作用域插槽更像是默认插槽和具名插槽的扩展属性,就是将上面2种插槽扩展一下支持传参功能,不应该单拿出来算第三种插槽类型。

在slot上传参,就跟普通组件传属性是一样的,<slot :arg1="" :arg2=""></slot>

3.1 默认插槽传参方式

子组件:

 1 <template lang="pug">
 2 .child 
 3   span 你好,我是:
 4   slot(:data1="data1" :data2="data2")
 5 </template>
 6 <script>
 7 export default {
 8   data() {
 9     return {
10         data1:"参数1",
11         data2:"参数2",
12     };
13   }
14 };
15 </script>
16 <style lang="scss" scoped></style>

父组件:

<template lang="pug">
.parent
    Child 
     // 【slot-scope="scope"】这种写法被废弃掉了,最好使用 v-slot="scope"或者 v-slot:default="scope" div(slot
-scope="scope") div {{scope.data1}} div {{scope.data2}} </template> <script> export default { data() { return { }; } }; </script> <style lang="scss" scoped></style>

 

 

3.2 具名插槽传参方式 (ps:https://www.cnblogs.com/grow-up-up/p/15834086.html

具名插槽子组件传参与默认插槽中的子组件传参是一样的,都是 :属性名="属性值",<template v-slot:插槽名称="参数对象"></template>

子组件:

 1 <template lang="pug">
 2 .child 
 3   span 你好,我是:
 4   slot(name="customName" :data1="data1" :data2="data2")
 5 </template>
 6 <script>
 7 export default {
 8   data() {
 9     return {
10         data1:"参数1",
11         data2:"参数2",
12     };
13   }
14 };
15 </script>
16 <style lang="scss" scoped></style>

父组件:

 1 <template lang="pug">
 2 .parent
 3     // 插槽名用变量方式
 4     Child    
 5          template(v-slot:[slotName]="scope") 
 6              div {{scope.data1}}
 7              div {{scope.data2}}
 8     // 插槽名不是变量
 9     Child    
10          template(v-slot:customName="scope") 
11              div {{scope.data1}}
12              div {{scope.data2}}
13 </template>
14 <script>
15 export default {
16   data() {
17     return {
18         slotName:"customName"
19     };
20   }
21 };
22 </script>
23 <style lang="scss" scoped></style>    

 

posted @ 2022-07-30 12:22  蛙仔  阅读(693)  评论(0编辑  收藏  举报