首页 > 其他分享 >Vue3插槽

Vue3插槽

时间:2022-08-23 18:23:07浏览次数:68  
标签:10 name 作用域 插槽 Vue3 组件 页面

一、前言

插槽其实就是子组件提供给父组件的占位符。子组件定义好插槽后,父组件可以替换插槽内容。

  • 子组件不提供插槽时,父组件填充失效
  • 父组件无填充时,会使用插槽默认内容

二、语法

定义插槽:

<slot></slot>

使用插槽

<template v-slot></template>
v-slot可简写为#
<template #default></template>

注意:v-slot 只能用在 template 或组件上使用,否则就会报错。

2.1、默认插槽

2.1.1、子组件

    <div>
      <slot>默认插槽 - 子页面默认值</slot>
    </div>

2.1.2、父组件

        <Detail>
            <!-- 默认插槽 -->
            <template #default>#default 默认插槽 - 父页面传值</template>
        </Detail>

2.1.3、运行结果:

#default 默认插槽 - 父页面传值

2.2、具名插槽

存在多个插槽时,使用具名插槽,可以根据名称插槽内容。

2.2.1、子组件

    <!-- 具名插槽 -->
    <div>
      <slot name="main">main 具名插槽 - 子页面默认值</slot>
    </div>

2.2.2、父组件

        <Detail>
            <!-- 具名插槽 -->
            <template #main>#main 具名插槽 - 父页面传值</template>
        </Detail>

2.2.3、运行结果:

#main 具名插槽 - 父页面传值

2.3、作用域插槽

父组件插槽内需要使用子组件数据时,可以使用作用域插槽。

2.3.1、子组件定义

    <!-- 作用域插槽 -->
    <div>
        <div v-for="(item, index) in items" :key="index">
            <slot name="scope" :data="item">作用域插槽 - 子页面默认值</slot>
        </div>
    </div>

2.3.2、子组件数据

interface Student{
    id:number,
    name:string,
    age:number
}

const items = reactive<Student[]>([
    {
        id:1,
        name:"张三",
        age:10
    },
    {
        id:2,
        name:"李四",
        age:10
    },
    {
        id:3,
        name:"王五",
        age:10
    },
    {
        id:4,
        name:"赵六",
        age:10
    },
    {
        id:5,
        name:"贾七",
        age:10
    },
])

2.3.3、父组件使用

        <Detail>
            <!-- 作用域插槽 -->
            <template #scope="{ data }">作用域插槽 - 父页面接收值 {{ data.name }}--{{ data.age }}岁 </template>
        </Detail>

2.3.4、运行结果:

作用域插槽 - 父页面接收值 张三--10岁
作用域插槽 - 父页面接收值 李四--10岁
作用域插槽 - 父页面接收值 王五--10岁
作用域插槽 - 父页面接收值 赵六--10岁
作用域插槽 - 父页面接收值 贾七--10岁

2.4、动态插槽名

通过函数或变量动态改变插槽名来动态替换子组件对应插槽内容。

2.4.1、子组件定义

    <!-- 动态插槽名 -->
    <div>
      <slot name="dynFirst">dynFirst 动态插槽名 - 子页面默认值</slot>
    </div>
    <div>
      <slot name="dynLast">dynLast 动态插槽名 - 子页面默认值</slot>
    </div>

2.4.2、父组件使用

        <Detail>
            <!-- 动态插槽 -->
            <template #[dynFun()]>{{dynFun()}}动态插槽 - 父页面传值</template>
        </Detail>

2.4.3、运行结果

dynFirst动态插槽 - 父页面传值
dynLast 动态插槽名 - 子页面默认值

三、完整代码

3.1、子组件:detail.vue

<template>
  <div>
    <!-- 默认插槽 -->
    <div>
      <slot>默认插槽 - 子页面默认值</slot>
    </div>

    <!-- 具名插槽 -->
    <div>
      <slot name="main">main 具名插槽 - 子页面默认值</slot>
    </div>

    <!-- 作用域插槽 -->
    <div>
        <div v-for="(item, index) in items" :key="index">
            <slot name="scope" :data="item">作用域插槽 - 子页面默认值</slot>
        </div>
    </div>

    <!-- 动态插槽名 -->
    <div>
      <slot name="dynFirst">dynFirst 动态插槽名 - 子页面默认值</slot>
    </div>
    <div>
      <slot name="dynLast">dynLast 动态插槽名 - 子页面默认值</slot>
    </div>
  </div>
</template>

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

interface Student{
    id:number,
    name:string,
    age:number
}

const items = reactive<Student[]>([
    {
        id:1,
        name:"张三",
        age:10
    },
    {
        id:2,
        name:"李四",
        age:10
    },
    {
        id:3,
        name:"王五",
        age:10
    },
    {
        id:4,
        name:"赵六",
        age:10
    },
    {
        id:5,
        name:"贾七",
        age:10
    },
])

</script>
<style lang="scss" scoped></style>

3.2、父组件:main.vue

<template>
    <div>
        <Detail>
            <!-- 默认插槽 -->
            <template #default>#default 默认插槽 - 父页面传值</template>

            <!-- 具名插槽 -->
            <template #main>#main 具名插槽 - 父页面传值</template>

            <!-- 作用域插槽 -->
            <template #scope="{ data }">作用域插槽 - 父页面接收值 {{ data.name }}--{{ data.age }}岁 </template>

            <!-- 动态插槽名 -->
            <template #[dynFun()]>{{dynFun()}}动态插槽 - 父页面传值</template>
        </Detail>
    </div>
</template>

<script setup lang="ts">
import Detail from './detail.vue'

const dynFun = ():string => { 
    return 'dynFirst'
}

</script>

3.3、运行结果:

#default 默认插槽 - 父页面传值

#main 具名插槽 - 父页面传值

作用域插槽 - 父页面接收值 张三--10岁
作用域插槽 - 父页面接收值 李四--10岁
作用域插槽 - 父页面接收值 王五--10岁
作用域插槽 - 父页面接收值 赵六--10岁
作用域插槽 - 父页面接收值 贾七--10岁

dynFirst动态插槽 - 父页面传值
dynLast 动态插槽名 - 子页面默认值

标签:10,name,作用域,插槽,Vue3,组件,页面
From: https://www.cnblogs.com/gaozejie/p/16617344.html

相关文章

  • vue3支付后不允许跳转回预付订单页
    场景:在电商项目中,订单页通常是用来展示给用户看的,当支付完成后,就不允许回退回来,防止二次支付以及商品信息错乱曾使用:router.push(`/member/pay?orderId=${res.data.resul......
  • vue3 单文件组件——父组件访问子组件的实例
    如果一个子组件使用的是选项式API 或没有使用 <scriptsetup>,被引用的组件实例和该子组件的 this 完全一致,这意味着父组件对子组件的每一个属性和方法都有完全的访问......
  • vue3源码学习
    建议先通过官方指南了解3.0都干了啥、解决了什么问题。然后才是阅读其源码(通过利器),进阶了解它是如何实现的。https://juejin.cn/post/6925668019884523534......
  • vue3新内置组件teleport传送门
    使用到的原因:在使用固定定位弹出弹出框的时候,突然遇到位置不正确,而且在有index高级别的情况下依旧位置出错表现如下:出现原因:我的代码出现的tf元素,导致定位祖先元素发......
  • slot插槽
    插槽,也就是槽,是组件的一块HTML模板,这块模板显示不显示,以及怎样显示由父组件来决定。插槽分为:匿名插槽|具名插槽|作用域插槽1、匿名插槽它不用设置名称属性,可以放置在......
  • Vue3中插槽(slot)用法汇总
    Vue中的插槽相信使用过Vue的小伙伴或多或少的都用过,但是你是否了解它全部用法呢?本篇文章就为大家带来Vue3中插槽的全部用法来帮助大家查漏补缺。什么是插槽简单来说就是......
  • uniapp 使用Vue3 setup组合式API 引入 uniapp 的 页面生命周期
    uniapp使用Vue3setup组合式API引入uniapp的页面生命周期<template><viewclass="content"><imageclass="logo"@click="handleFei"src="/static/logo.pn......
  • vue3 学习-初识体验-常见指令v-for和v-model
    继续通过小案例来体验一些常用的指令,以经典的todolist进行展示.首先呢通过v-for指令进行dom循环.v-for通常是在循环dom的编写的同时遍历数据进行填充.<!DOCTYPEht......
  • vue3 学习-初识体验-常见指令v-on和v-if
    继续来体验一波数据驱动结合绑定方法的实践案例.这里以最常见的反转字符串为栗子来体验面向数据编程.v-on用来绑定事件的,然后将方法名写在methods中即可.<!DOCTYPE......
  • Vue3+Vite+Vant报错Uncaught SyntaxError: The requested module '/node_modules/.vit
    原因在开发过程中Vue3的依赖版本有变更,直接使用的npminstall下载新的版本,会导致node_modules下存在旧版本的缓存,从而影响了本地项目的启动编译。解决方案删除项目的......