vue 3.0组件(下)
创始人
2024-06-03 10:34:22
0

文章目录

  • 前言:
  • 一,`透传`属性和事件
    • 1. 如何“透传属性和事件”
    • 2.如何禁止“透传属性和事件”
    • 3.多根元素的“透传属性和事件”
    • 4. 访问“透传属性和事件”
  • 二,插槽
    • 1. 什么是插槽
    • 2. 具名插槽
    • 3. 作用域插槽
  • 三,单文件组件CSS功能
    • 1. 组件作用域CSS
    • 2.深度选择器
    • 3.CSS中的v-bind()
  • 四,依赖注入
    • 1. provide(提供)
    • 2.inject(注入)
  • 总结

前言:

上一章给大家讲解了组件的注册以及父子组件之间数据的传递,本文继续给大家讲解Vue3组件剩下的东西

一,透传属性和事件

1. 如何“透传属性和事件”

父组件在使用子组件的时候,如何“透传属性和事件”给子组件呢?

  1. 透传属性和事件并没有在子组件中用props和emits声明
  2. 透传属性和事件最常见的如@click和class、id、style
  3. 当子组件只有一个根元素时,透传属性和事件会自动添加到该根元素上;如果根元素已有class或style属性,它会自动合并
// 父组件

// 子组件

渲染结果:

请添加图片描述


2.如何禁止“透传属性和事件”

  • 当子组件只有一个根元素时,透传属性和事件会自动添加到该根元素上,那怎么阻止呢?
    • 在组合式 API 的< script setup>中,你需要一个额外的< script>块来书写inheritAttrs: false选项声明来禁止
// 父组件

// 子组件



3.多根元素的“透传属性和事件”

  • 多根节点的组件并没有自动“透传属性和事件”的行为,由于Vue不确定要将“透传属性和事件”透传到哪里,所以我们需要v-bind="$attrs"来显式绑定,否则将会抛出一个运行时警告
// 父组件

// 子组件


4. 访问“透传属性和事件”

  • 在组合式 API 中的< script setup>中引入useAttrs()来访问一个组件的“透传属性和事件”
// 父组件

// 子组件

注意:
● 虽然这里的attrs对象总是反映为最新的“透传属性和事件”,但它并不是响应式的 (考虑到性能因素),你不能通过侦听器去监听它的变化
● 如果你需要响应性,可以使用prop或者你也可以使用onUpdated()使得在每次更新时结合最新的attrs执行副作用

二,插槽

  • 在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段,为此 vue 提供了组件的插槽

1. 什么是插槽

  • 在封装组件时,可以使用元素把不确定的、希望由用户指定的部分定义为插槽;插槽可以理解为给预留的内容提供占位符
  • 插槽也可以提供默认内容,如果组件的使用者没有为插槽提供任何内容,则插槽内的默认内容会生效

注意:如果在封装组件时没有预留任何插槽,用户提供传递一些模板片段将会被遗弃

请添加图片描述

// 父组件

// 子组件

2. 具名插槽

  • 如果在封装组件时需要预留多个插槽节点,则需要为每个< slot>插槽指定具体的name名称,这种带有具体名称的插槽叫做“具名插槽”
  • 没有指定name名称的插槽,会有隐含的名称叫做 default
  • < template>元素上使用 v-slot:slotName或者#slotName向指定的具名插槽提供内容
// 父组件

// 子组件

3. 作用域插槽

  • 如何在向插槽提供的内容时获得子组件域内的数据呢?
    • 在声明插槽时使用属性值的方式来传递子组件的数据,这种带有数据的插槽称之为作用域插槽
    • < template>元素上使用v-slot:slotName="slotProps"#slotName="slotProps"的方式来访问插槽传递属性值
    • 如果没有使用< template>元素,而是直接在使用子组件中直接给默认插槽提供内容,我们可以在使用该子组件时用v-slot="slotProps"来接收该插槽传递的数据对象

注意:< slot >插槽上的name是一个Vue特别保留的属性,不会在作用域插槽中访问到

// 父组件

// 子组件

三,单文件组件CSS功能

  • 默认情况下,写在.vue组件中的样式会全局生效,很容易造成多个组件之间的样式冲突问题
    导致组件之间样式冲突的根本原因是:
    • 单页面应用程序中,所有组件的DOM结构,都是基于唯一的index.html页面进行呈现的
    • 每个组件中的样式,都会影响整个index.html页面中的DOM元素

1. 组件作用域CSS

  • < style>标签带有scoped属性的后:
    • 它的CSS只会影响当前组件的元素,父组件的样式将不会渗透到子组件中
    • 该组件的所有元素编译后会自带一个特定的属性
    • < style scoped>内的选择器,在编译后会自动添加特定的属性选择器
    • 子组件的根节点会同时被父组件的作用域样式和子组件的作用域样式影响,主要是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式
// 转换前

// 转换后

案例:

// 父组件


// 子组件

2.深度选择器

  • 处于scoped样式中的选择器如果想要做更“深度”的选择,即影响到子组件,可以使用:deep()这个伪类
// 编译前

// 编译后

案例

// 父组件


// 子组件

3.CSS中的v-bind()

  • 单文件组件的< style >标签支持使用v-bindCSS函数将CSS的值链接到动态的组件状态
  • 这个语法同样也适用于< script setup>,且支持JavaScript表达式(需要用引号包裹起来)
  • 实际的值会被编译成哈希化的CSS自定义属性,因此CSS本身仍然是静态的
  • 自定义属性会通过内联样式的方式应用到组件的某个元素上,并且在源值变更的时候响应式地更新

四,依赖注入

  • 如果有一个深层的子组件需要一个较远的祖先组件中的部分数据,如果实现呢?
    • 可使用props沿着组件链逐级传递下去,如图
      请添加图片描述
  • 我们可在祖先组件使用provide提供数据,后代组件使用inject注入数据,如图
    请添加图片描述

1. provide(提供)

在应用层如何提供:

  • 在应用层方面可通过app.provide()为后代提供数据
import { createApp } from 'vue'
const app = createApp({ })
app.provide('message', 'hello!') // message 注入名, 'hello' 值

在组件中如何提供:

- 在组合式 API` < script setup`> 中,可通过`provide()函数`来为后代组件提供数据

2.inject(注入)

  • 在组合式 API 中,使用inject()函数的返回值来注入祖先组件提供的数据
    • 如果提供数据的值是一个ref,注入进来的会是该ref对象,和提供方保持响应式连接
    • 如果注入的数据并没有在祖先组件中提供,则会抛出警告,可在provide()函数的第二个参数设置默认值来解决
    • 他们可以在JS视图模板中直接访问

总结

以上就是vue3.0 组件的全部内容和基本用法,文章的代码为一个一个的案例感兴趣可以敲一敲看一看。希望本篇文章能够帮助到你,不懂得可以评论区或者私信问我,我也会一 一解答。谢谢观看!
我的其他文章:https://blog.csdn.net/m0_60970928?type=blog

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...