首页 > 其他分享 >Vue 3 插槽详解

Vue 3 插槽详解

时间:2024-11-15 17:16:42浏览次数:3  
标签:Vue 作用域 插槽 默认 详解 内容 组件

Vue 3 插槽详解

Vue 3 中的插槽是一种强大的组件内容分发方式,通过它我们可以灵活地在父组件中定义模板内容,再通过插槽传递到子组件并动态渲染。Vue 3 插槽提供了三个主要类型:默认插槽具名插槽作用域插槽。此外,Vue 3 对插槽系统进行了优化,使其更灵活高效。本文将详细介绍 Vue 3 中插槽的概念、用法以及应用场景。

一、默认插槽

1.1 什么是默认插槽

默认插槽(Default Slot)用于在子组件中设置一个默认插槽内容,当父组件没有提供内容时会使用这个默认内容。默认插槽非常适合在组件内部提供基本的布局和结构。

1.2 使用方式

在子组件中可以使用 <slot> 标签来定义插槽位置。当父组件不传递内容时,会渲染默认内容。

示例:

  1. 创建子组件 MyComponent.vue

    <template>
      <div>
        <h2>这里是子组件内容</h2>
        <slot>这是默认内容</slot>
      </div>
    </template>
    
  2. 使用子组件

    <template>
      <MyComponent>
        <p>父组件传递的内容</p>
      </MyComponent>
    </template>
    
  • 当父组件传递内容时,插槽会显示父组件传递的内容,而不会显示默认内容。
  • 如果父组件没有传递内容,插槽则显示默认内容 "这是默认内容"

1.3 默认插槽应用场景

  • 基本结构的布局:子组件中提供默认布局,父组件根据需求选择覆盖部分或全部内容。
  • 内容占位符:设置内容占位符,确保即使父组件没有传递内容时,组件仍能正常渲染。

二、具名插槽

2.1 什么是具名插槽

具名插槽(Named Slot)用于定义多个插槽,每个插槽都有唯一的名称,父组件可以通过指定 v-slot:name 来选择性地填充内容。具名插槽在需要多个插槽、并希望每个插槽能单独控制内容的情况下非常有用。

2.2 使用方式

在子组件中可以为 <slot> 标签添加 name 属性,从而定义具名插槽。在父组件中,通过 v-slot:name 语法填充对应插槽的内容。

示例:

  1. 创建子组件 MyComponent.vue

    <template>
      <div>
        <header>
          <slot name="header">默认头部内容</slot>
        </header>
        <main>
          <slot>默认主体内容</slot>
        </main>
        <footer>
          <slot name="footer">默认底部内容</slot>
        </footer>
      </div>
    </template>
    
  2. 使用子组件

    <template>
      <MyComponent>
        <template v-slot:header>
          <h1>自定义头部内容</h1>
        </template>
        <p>自定义主体内容</p>
        <template v-slot:footer>
          <p>自定义底部内容</p>
        </template>
      </MyComponent>
    </template>
    

2.3 具名插槽应用场景

  • 结构化内容展示:在复杂组件中,具名插槽帮助将内容分区域展示,如头部、主体、底部等。
  • 增强组件灵活性:具名插槽允许父组件选择性地覆盖子组件的默认内容,提供更灵活的内容填充方式。

三、作用域插槽

3.1 什么是作用域插槽

作用域插槽(Scoped Slot)允许父组件访问子组件传递的数据。作用域插槽使得子组件中的数据可以通过插槽作用域传递到父组件,从而实现动态内容渲染。

3.2 使用方式

子组件在 <slot> 标签中通过 v-bind 向插槽提供数据,父组件使用 v-slot 来获取数据。

示例:

  1. 创建子组件 MyComponent.vue

    <template>
      <div>
        <slot :user="user"></slot>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          user: { name: '张三', age: 25 }
        }
      }
    }
    </script>
    
  2. 使用子组件并接收插槽作用域

    <template>
      <MyComponent v-slot:default="{ user }">
        <p>用户名称:{{ user.name }}</p>
        <p>用户年龄:{{ user.age }}</p>
      </MyComponent>
    </template>
    

3.3 作用域插槽应用场景

  • 灵活的数据传递:允许父组件使用子组件提供的数据,避免使用复杂的数据传递方式。
  • 高复用性:作用域插槽让父组件可以基于子组件数据进行自定义渲染。

四、插槽的默认内容、解构和简写

4.1 插槽的默认内容

当父组件没有提供插槽内容时,Vue 会渲染子组件中 <slot> 标签定义的默认内容。

4.2 解构与简写

在 Vue 3 中,v-slot 可以使用解构形式获取作用域数据,并允许简写语法:

<MyComponent v-slot="{ user }">
  <!-- 简写,等同于 v-slot:default="{ user }" -->
  <p>{{ user.name }}</p>
</MyComponent>

五、Vue 3 中的动态插槽

Vue 3 中插槽的内容和类型都是动态的,可以基于条件控制插槽内容是否渲染。

<MyComponent v-slot:[dynamicSlotName]>
  <p>动态插槽内容</p>
</MyComponent>

其中 dynamicSlotName 是一个变量,可以动态控制插槽的渲染。


六、插槽的优化与注意事项

6.1 避免不必要的插槽内容渲染

在需要动态渲染插槽内容时,可以通过 v-if 或其他条件渲染手段避免不必要的内容渲染,提高组件的性能。

6.2 提高组件的可维护性

插槽在灵活性上非常强大,合理地使用具名插槽和作用域插槽可以提高组件的可读性和可维护性,但也要避免过度使用以免增加复杂度。


总结

Vue 3 中的插槽为组件提供了灵活的内容分发方式,具备默认插槽、具名插槽和作用域插槽三大类型,每种插槽在不同的场景下各有应用。插槽不仅能够简化组件的内容分发,还能在父组件和子组件之间实现数据传递,使组件更具通用性和扩展性。在实际开发中,根据需求合理选择插槽类型并避免不必要的渲染,可以进一步提升代码的清晰度和可维护性。

标签:Vue,作用域,插槽,默认,详解,内容,组件
From: https://blog.csdn.net/2301_79858914/article/details/143788229

相关文章

  • 记录--微前端qiankun接入vue2&vue3项目
    ......
  • Vuex与Redux比较
    由于Vuex和Redux都是从Flux中衍生出来,同时Vuex对Redux部分思想也有一些借鉴,所以Vuex和Redux有很多相同点。很多资料也有介绍两者的对比,但大部分讲解的比较抽象,较难理解。笔者整理两者异同点,同时配有标准案例进行说明。注意本文不是科普vuex和redux相关概念,相关知识内容可以在官方......
  • 室内导航怎么实现?技术方案详解
    在日常生活中,我们常常需要在大型购物中心、复杂医院或繁忙机场中寻找目的地。然而,与室外环境不同,室内空间的GPS信号受限,使得传统导航方式难以发挥作用。那么,在GPS信号受限的室内环境中,如何实现精准、高效的导航服务呢?本文将深入探讨室内导航的实现原理、关键技术、应用案例及未......
  • shell脚本案例三十 (带详解) (上)
    Shell案例(30)案例一:备份文件1.问题:(1).用户输入为空(2).用户输入错误(3).怎么备份文件2.分析:(1).用户输入为空返回输入(2).用户输入错误退出脚本(3)使用rsync命令同步文件3.流程图:4.实现:1) #!/bin/bash2) while:3) do4) read-p"请输入你要备份的文件所在......
  • Nuxt.js 应用中的 schema:written 事件钩子详解
    title:Nuxt.js应用中的schema:written事件钩子详解date:2024/11/15updated:2024/11/15author:cmdragonexcerpt:schema:written钩子是Vite提供的一种生命周期钩子,在模式写入完成后调用。通过这个钩子,开发者可以在配置被正式应用之后执行一些后续操作,比如记录日志、......
  • Electron框架使用vue开发跨平台桌面工具应用-项目打包
    一、背景上一篇博客已经成功搭建了vue+electron+webpack的项目主框架,进而用layui写了一个demo页面,访问mysql数据,但是居然会加载不到preload.js.npmrunelectron:serve和npmrunelectron:build都不行。二、研究思路1.我已经在预加载那边增加了语句那么我判断,是先编译然......
  • Linux常用命令之dd命令详解
    dd命令详解dd命令是Unix和Linux系统中一个非常强大的工具,用于转换和复制文件。它可以用来备份和恢复磁盘或分区、创建和修改文件系统、以及进行各种数据操作。dd命令的灵活性和强大功能使其在系统管理、数据恢复和安全领域中广泛使用。基本语法dd[选项]if=输入......
  • vue 实现电子签名 vue-signature-pad
    vue-signature-padpc电子签名实例下载依赖//Vue2项目:安装vue-signature-pad的2.0.5版本。[email protected]//Vue3项目:安装最新版本的vue-signature-pad。npminstall--savevue-signature-pad全局引入vue3实例//main.jsim......
  • SpringBoot+Vue3实现数据可视化大屏
    前端工程的地址:UserManagerFront:数据可视化前端(gitee.com)效果展示,可以展现出来了,样式可能还有一些丑。后端代码后端主要是拿到数据并对数据进行处理,按照前端需要的格式进行返回即可。importcom.njitzx.entity.Student;importcom.njitzx.entity.vo.*;import......
  • HTTP协议详解:发展、请求方法与安全
    前言第一次写文章比较生疏,思路也很局限,除了课件之外添加内容有限,但也以此督促学习,争取日更。学习视频来自B站up主“泷羽sec”有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec......