Vue 插槽

66 阅读1分钟

一、匿名插槽

1.1 定义插槽内容

A.vue: 插入的内容将以h1标题格式显示

<template>
    我是插槽a
    <h1>
        <slot></slot>
    </h1>
</template>

1.2 使用插槽

<template>
 
    <A>
        <template v-slot>
            <div>我是插入的内容</div>
        </template>
    </A>
   
  </template>
   
  <script setup lang='ts'>
    import  A  from "./components/A.vue";
  </script>

  <style>

  </style>

1.3 页面效果

image.png

二、具名插槽

2.1 定义具名插槽

<template>
    我是插槽a
    <h2>
        <slot name="name"></slot>
    </h2>
</template>

2.2 使用插槽

<template>
 
    <A>
        <template v-slot:name>
            <div>我是具名插槽的内容</div>
        </template>
    </A>
   
  </template>
   
  <script setup lang='ts'>
    import  A  from "./components/A.vue";
  </script>

  <style>

  </style>

2.3 页面效果

image.png

2.4 简写

image.png

三、作用域插槽

3.1 从插槽内向外传值

3.1.1 定义插槽

<template>
    我是插槽a
    <h2>
        <div v-for="item in data">
            <slot name="name" :data="item"></slot>
        </div>
    </h2>
</template>

<script setup lang="ts">
import { reactive } from "vue";

type names = {
    name:string,
    age:number
}

const data = reactive<names[]>([{
    name:'zhangsan',
    age:10
},{
    name:'lisi',
    age:11
},{
    name:'wangwu',
    age:12
}]) 
</script>

3.1.2 接受插槽内容

<template>
 
    <A>
        <template v-slot:name ="{data}">
            {{ data }}
        </template>
    </A>
   
</template>

<script setup lang='ts'>
import  A  from "./components/A.vue";

</script>

3.1.3 页面效果

image.png

3.1.4 插槽内传递多个值

3.1.4.1 插槽定义

<template>
    我是插槽a
    <h2>
        <div v-for="(item,index) in data">
            <slot name="name" :index="index" :data="item"></slot>
        </div>
    </h2>
</template>

<script setup lang="ts">
import { reactive } from "vue";

type names = {
    name:string,
    age:number
}

const data = reactive<names[]>([{
    name:'zhangsan',
    age:10
},{
    name:'lisi',
    age:11
},{
    name:'wangwu',
    age:12
}]) 
</script>

3.1.4.2 接受插槽内容

<template>
 
    <A>
        <template v-slot:name ="{data,index}" >
            {{ index}}.{{ data.age }} -- {{ data.name }}
        </template>
    </A>
   
</template>

<script setup lang='ts'>
import  A  from "./components/A.vue";

</script>

3.1.4.3 页面效果

image.png

四、动态插槽

4.1 定义插槽

根据传入的不同插槽名,加载不同的字体大小

<template>
    我是插槽a
    <h2>
        <slot name="slot1"></slot>
    </h2>


    <h1>
        <slot name="slot2"></slot>
    </h1>
</template>

<script setup lang="ts">

</script>

4.2 接受插槽内容

4.2.1 使用1号插槽

<template>
    我是插槽a
    <h2>
        <slot name="slot1"></slot>
    </h2>


    <h1>
        <slot name="slot2"></slot>
    </h1>
</template>

<script setup lang="ts">

</script>

image.png

4.2.2 使用2号插槽

<template>
 
    <A>
        <template #[name]>
            <div>{{ name }}}</div>
        </template>
    </A>
   
  </template>

<script setup lang='ts'>
import {ref} from 'vue'
import  A  from "./components/A.vue";

let name = ref("slot2")
</script>

image.png

4.3 页面效果

20231122_224921.gif