vue3第二十二节(defineOptions用途)

defineOptions()
3.3 版本以上才可以使用

引言:

在使用组件时候
默认情况下,父组件传递的,但没有被子组件解析为 props 的 attributes 绑定会被**“透传”**。这意味着当我们有 一个单根节点(多根节点的是无法透传的) 的子组件时,这些绑定会被作为一个常规的 HTML attribute 应用在子组件的根节点元素上。
当你编写的组件想要在一个目标元素或其他组件外面包一层时,可能并不期望这样的行为。我们可以通过设置 inheritAttrs 为 false 来禁用这个默认行为。这些 attributes 可以通过 $attrs 这个实例属性来访问,并且可以通过 v-bind 来显式绑定在一个非根节点的元素上
$attrs中 包含非 props 和 emits 的所有属性,包括clas style v-on等

可以通过

defineOptions({
  inheritAttrs: false // 设置不让透传
})

用法

vue3.3版本之前,如果我们写的组件 需要声明 name 属性方便调试时,则我们声明的单文件组件的名称就是文件的名称
如果我们想要更改这个名称需要单独写一个script标签
或者我们在写递归组件时候,需要使用组件的name属性进行递归调用时候;
如下:

<template>
<script>
  export default {
    name: 'myOptionCom'
  }
</script>

<script setup>
  // setup 语法糖中没有 name 属性
</script>
</template>

而在 vue3.3 之后,我们可以这样使用,不需要再额外写选项式api 语法

<template>
<script setup>
  defineOptions({
    name: 'MyComponent',
    inheritAttrs: false
  })
</script>
</template>

完整示例:
父组件

<template>
<div class="my-options">
  This is defineOptions demo.
  <OptionsChild :num="num" :age="age" :changeNum="changeNum"></OptionsChild>
</div>
</template>
<script setup>
import OptionsChild from './components/optionsChild.vue'
import { ref } from 'vue'
const num = ref(5)
const age = ref(18)
</script>
子组件
<template>
<div class="options-child">
  子组件
  props-num--{{ num}}
  <hr></hr>
  // 注意:递归组件一定要有 结束递归 条件,不然会进入死循环,导致内存溢出
  <div v-if="num > 2">
    <myOpCom :num="num"></myOpCom>
  </div>
</div>
</template>
<script setup>
  import { ref } from 'vue'
  const props = defineProps({
    num: {
      type: String,
      default: ''
    }
  })
  defineOptions({
    name: 'myOptionCom', // 使用name 递归,而不是之前的文件名 进行递归调用
    inheritAttrs: true // 默认继承透传 父组件中没有 被 props 声明的属性;当设置为false 时 age属性不会显示在子组件的 attributes 中
  })
  const num = ref(props.num - 1)
  console.log('==点击了=l', num)
</script>

注意:
props 有所不同,透传 attributes 在 JavaScript 中保留了它们原始的大小写,所以像 foo-bar 这样的一个 attribute 需要通过 $attrs['foo-bar'] 来访问。
@click 这样的一个 v-on 事件监听器将在此对象下被暴露为一个函数 $attrs.onClick

虽然 attrs 的属性总是最新的,但是他是非响应式的,无法通过 watch 去监听其变化,若想要是响应式的,建议使用props | emits 进行处理
为什么不是想要式的呢??

比如:

<template>
<div class="my-options" >
  This is defineOptions demo.
  <OptionsChild :num="num" :age="age" :changeNum="changeNum"></OptionsChild>
</div>
</template>
<script setup>
import OptionsChild from './components/optionsChild.vue'
import { ref } from 'vue'
const num = ref(5)
const age = ref(18)
const changeNum = () => {
  console.log('changeNum===')
}
</script>

子组件中:可以使用 useAttrs() 来获取透传的属性方法

<template>
<div class="options-child">
  子组件
  props-num--{{ num}}
  <hr></hr>
</div>
</template>
<script setup>
  import { ref, useAttrs } from 'vue'
  const props = defineProps({
    num: {
      type: String,
      default: ''
    }
  })
  defineOptions({
    name: 'myOptionCom', // 使用name 递归,而不是之前的文件名 进行递归调用
    inheritAttrs: true // 默认继承透传 父组件中没有 被 props 声明的属性;当设置为false 时 age属性不会显示在子组件的 attributes 中
  })
  console.log('==点击了=l', num, attrs)
  const attrs = useAttrs()
  attrs.changeNum() // 直接调用 可以通过 useAttrs() 直接调用透传属性、方法
  console.log("---", attrs.age) // 18
</script>

关于:Attributes 详情可以查看 组件之间通讯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字工厂管理系统的应用场景主要有哪些

随着信息技术的飞速发展&#xff0c;数字工厂管理系统逐渐成为了工业制造领域的一大亮点。这一系统集成了物联网、大数据、云计算、人工智能等先进技术&#xff0c;实现了对工厂生产流程的智能化、高效化管理。那么&#xff0c;数字工厂管理系统究竟在哪些应用场景中发挥着重要…

Unity 3D定点数物理引擎实战系列:BEPU物理引擎碰撞计算与碰撞规则的架构与设计

前面我们讲解了如何监听物理引擎的碰撞事件, 在物理引擎内核中如何架构与设计碰撞规则,使得物理Entity与周围的物理环境产生碰撞时&#xff0c;如何灵活的控制物理碰撞&#xff0c;本节給大家详细的讲解BEPUphysicsint 物理引擎内部是如何管理与控制碰撞规则的。本文主要讲解3个…

项目二:学会使用python爬虫请求库(小白入门级)

上一章已经了解python爬虫的基本知识&#xff0c;这一次让我们一起来学会如何使用python请求库爬取目标网站的信息。当然这次爬虫之旅相信我能给你带来不一样的体验。 目录 一、安装requests 库 简介 安装 步骤 1.requests的基本使用3步骤 2.查看所使用编码 3.设置编码…

Qt菜单栏

文章目录 创建菜单栏创建菜单并在菜单栏中添加创建子菜单并添加到菜单创建菜单项并在菜单中添加分割线实现简易的记事本 Qt 窗口是通过 QMainWindow类 来实现的 创建菜单栏 Qt 中的菜单栏是通过 QMenuBar 这个类来实现的&#xff0c;一个窗口最多只有一个菜单栏。 菜单栏包含…

动态库静态库linux

动态库静态库 静态库 静态库必须包含在可执行文件里&#xff0c;整个都要包含 缺点&#xff1a;消耗系统大&#xff0c;每个使用静态库的程序都要复制静态库&#xff08;浪费内存&#xff09; 影响使用场景&#xff1a; 在静态库内存小的时候&#xff0c;可以用来提升速度 制…

学习MQ异步

1.MQ异步调用的优势 事件驱动模式&#xff1a; 优势&#xff1a; 总结&#xff1a; 2.初识MQ 核心概念以及结构&#xff1a; 常见的消息模型&#xff1a; 基本消息队列模型&#xff1a; 生产者代码&#xff1a; Testpublic void testSendMessage() throws IOException, Timeo…

亿级电商实时数据分析平台构建实战

基于FlinkClickHouse构建亿级电商实时数据分析平台&#xff08;PC、移动、小程序&#xff09; 引用网络文章开启本课程的开篇&#xff1a; 在大数据分析领域中&#xff0c;传统的大数据分析需要不同框架和技术组合才能达到最终的效果&#xff0c;在人力成本&#xff0c;技术能…

比较转录组学方法推断基因共表达网络及其在玉米和水稻叶片转录组中的应用 TO-GCN时序分析-文献精读-8

Comparative transcriptomics method to infer gene coexpression networks and its applications to maize and rice leaf transcriptomes 比较转录组学方法推断基因共表达网络及其在玉米和水稻叶片转录组中的应用 TO-GCN时序分析&#xff0c;媲美加权基因共表达网络分析-WG…

2024.4.16

多进程并发服务器 #include<myhead.h> #define SER_IP "192.168.125.54" #define SER_PORT 8888 void handler(int signo) {if(signoSIGCHLD){while(waitpid(-1,NULL,WNOHANG)>0);} } int main(int argc, char *argv[]) {//将SIGCHLD信号与处理函数绑定if(…

数据孤岛是业务效率的无声杀手

数据孤岛是组织的一个常见问题&#xff0c;因为它们可能对数据可访问性、数据完整性和数据管理造成障碍。当组织内的不同部门或团队拥有用于存储数据的数据库或系统&#xff0c;并且没有用于所有数据的中央存储库时&#xff0c;就会出现数据孤岛。这可能会导致难以全面了解数据…

minio 报错The specified key does not exist.

minio 报错The specified key does not exist. 解决方法 检查是否把全路径包含进去了&#xff0c;桶的名称是bucketName只填写桶的名称就行了&#xff0c;objectName是文件的名称&#xff0c;只要填写文件名称就行了&#xff0c;不要填写全路径&#xff01;&#xff01;&#…

36. UE5 RPG在激活技能时使用蒙太奇动画

在上一篇文章里面&#xff0c;我们实现了一个简单的火球术&#xff0c;创建了火球术的火球&#xff0c;以及能发射它的技能。很简陋&#xff0c;在技能触发的时候&#xff0c;直接在武器的位置生成火球发射出去。在一篇文章里&#xff0c;我们要实现使用技能时&#xff0c;角色…

实验室信息系统源码 saas模式java+.Net Core版开发的云LIS系统全套源码可二次开发有演示

实验室信息系统源码 saas模式java.Net Core版开发的云LIS系统全套源码可二次开发有演示 一、技术框架 技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等 开发语言&#xff1a;C# 6.0、JavaScript 前端框架&#xff1a;JQuery、EasyUI、Bootstrap 后端框架&am…

梯度下降法法实现线性回归模型

一、线性回归模型 线性回归模型是一种预测性的建模技术&#xff0c;它研究的是因变量&#xff08;目标&#xff09;和自变量&#xff08;特征&#xff09;之间的关系。这种关系假设是线性的&#xff0c;意味着因变量可以通过一个或多个自变量的线性组合来预测。数学上&#xf…

视觉slam14讲-大纲-持续更新

视觉slam入门太难 数学理论编程知识计算机视觉知识 缺一不可&#xff0c;大家一起加油

暗区突围PC国际服怎么参与测试 怎么获取测试资格

暗区突围PC国际服怎么参与测试 怎么获取测试资格 《暗区突围》这款游戏是由腾讯魔方工作室开发的一款刺激的大逃杀射击类游戏&#xff0c;在游戏中玩家将扮演一名特种兵&#xff0c;需要在充满敌人的暗区中展开战斗&#xff0c;完成各种任务。游戏中玩家可以选择不同的武器和装…

43、二叉树-验证二叉搜索树

思路&#xff1a; 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 所以对于当前节点来说&#xff1a;我的左节点要小于我&#xff0c;我的右节点要大于我&a…

MDC及EFK安装与使用

MDC 1.简介 MDC 介绍​ MDC&#xff08;Mapped Diagnostic Context&#xff0c;映射调试上下文&#xff09;是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map&#xff0c;可以往其中添加键值对。MDC 中包含的内容可以…

聊聊路径规划算法(四)——滚动在线RRT算法和BUG算法

基本RRT算法更偏向于遍历所有自由空间直到获取可行路由性&#xff0c;这使得它不能够进行未知或动态环境条件中的机器人实时运动计划。利用滚动计划的思路可以将RRT算法加以完善&#xff0c;使之更具有实时规划能力。 滚动规划 机器人在不确定的或动态周围环境中行走时&#x…

C++-结构体-指针-地址-指针的指针-地址的地址

经验证&#xff0c;仿真结果与预期一致。 #include <QDebug> struct test_years {int year;};//定义结构体 int main() {//定义三个结构体&#xff0c;s01,s02,s03test_years s01,s02,s03;s01.year 1000;//给s01结构体中year赋值s02.year 2000;//给s02结构体中year赋值…
最新文章