标签中的ref属性

之前说过了 ref() 函数,现在说的标签中的 ref 属性 和 ref() 函数也存在一定关联。

2、

标签中的 ref 属性分为两种情况:

  • 用在普通DOM标签上,获取的是DOM节点。

  • 用在组件标签上,获取的是组件实例对象

Vue2 中标签上的 ref 属性

在Vue2 中, 当在 普通 DOM 元素上使用 ref 时,可以直接通过 this.$refs 拿到这个 DOM元素以及 DOM 元素中的某些值(value、innerHTML 等),例如:

<template><input type="text" ref="input"> <br><br><button @click="showDOM">获取DOM节点</button><button @click="showValue">获取DOM节点内容</button>
</template><script>
export default {name: "App",methods: {showDOM() {console.log(this.$refs.input);},showValue() {console.log(this.$refs.input.value);}}
}
</script>

Vue2 中的组件上的 ref 属性

ref 属性也可以用在组件上,获取的是组件的实例对象

<template><Child ref='Child'/><button @click="showDOM">获取组件实例</button> <br>
</template><script>
import Child from './components/Child.vue';
export default {name: "App",methods: {showDOM() {console.log(this.$refs.Child);},},components: { Child }
}
</script>

Vue3 中【 标签 】上的 ref 属性 +【 setup() 函数

 在模板中的使用方式和 Vue2 一致,直接当做标签属性使用即可

<template><h2 ref="title">父组件内容</h2> <br><button @click="showDOM">获取DOM节点</button> <br>
</template>

但是,在 setup() 函数中的使用方式存在差异。

首先 需要通过 ref() 函数来创建一个空的 ref 对象。

然后通过变量接收,且该变量名称需要与 DOM 标签上的 ref 属性值相同。

<script>
import {ref} from 'vue'
export default {name: "App",setup(props, context) {// 通过 ref() 函数创建一个空的 ref 对象,// 且通过与DOM元素上ref属性值一致的 title 作为变量接收 let title = ref()function showDOM() {console.log(title.value);}return {title,showDOM,}},
}
</script>

展示效果:拿到了完整的DOM节点

Vue3 中【 组件标签 】上的 ref 属性 + 【 setup() 函数

在父组件中引入子组件,然后在子组件标签上添加 ref 属性。在 setup() 函数中同样通过 与 ref 属性值相同的变量名接收空的 ref 对象

<template><Child ref="child"/><button @click="showCompoment">获取组件实例</button>
</template><script>
import Child from './components/Child.vue';
import {ref} from 'vue'
export default {name: "App",setup() {let child = ref()function showCompoment() {console.log(child.value);}return {child,showCompoment}},components: { Child }
}
</script>

然后在子组件中 通过 ref() 定义几个响应式数据,但是没有使用,也没有返回。按照Vue2 的情况,此时在父组件中是可以访问到子组件中的数据的,但是通过打印,我们发现什么都没拿到。

<template><div>这是子组件</div>
</template><script>
import { ref } from 'vue'
export default {name: 'ChildComponent',setup() {let name = ref('al')let age = ref(29)return {}}
}
</script>

展示效果

此时我们将数据通过 return 返回。

setup() {let name = ref('al')let age = ref(29)return {name,age}
}

此时会发现,在父组件中能拿到返回出去的值了。

这说明了两点

  • ref 获取的是组件实例:通过 ref 属性获取的是子组件的实例对象

  • 访问公开的数据:只能访问子组件通过 setup 返回的、被公开的响应式数据或方法。子组件中的私有状态或未返回的数据是无法直接访问的。

于此同时,还有一种方式可以对外暴露数据,那就是 setup() 函数中接收的第二个参数 context。该参数是一个对象,对象中有一个属性为 expose。该属性是一个方法,接收一个对象,对象内部则是向外暴露的指定数据或方法。

setup(props, context) {let name = ref("al");let age = ref(29);function text() { }// 通过 context.expose 向外暴露指定的属性或方法context.expose({ text });// 返回值为空return { name, age };
},

 父组件中接收到了 子组件中暴露的指定数据和方法。但是对于 return 返回出去的方法或数据并没有接收到

Vue3 中【 组件标签 】上的 ref 属性 + 【 <script setup> 】

在 setup() 函数中,我们可以通过 return 来返回数据暴露给父组件,也可以通过 expose() 向外暴露指定的属性和方法。那么在 <script setup> 中没有 context.expose(),也不能通过 return 返回,此时又该怎么办呢?

Vue3 提供了一个新的 宏方法 -- defineExpose() ,可以在 <script setup> 】模式中向外暴露指定的数据或方法。

子组件:定义三个数据和方法,但是并没有显式的 return 返回

<template><div>这是子组件</div>
</template><script setup lang="ts">
import { ref } from "vue";let name = ref("al");
let age = ref(29);
function text() { }</script>

父组件中获取子组件中的数据

<template><Child ref="child"/><button @click="showCompoment">获取组件实例</button>
</template><script>
import Child from './components/Child.vue';
import {ref} from 'vue'
export default {name: "App",setup() {let child = ref()function showCompoment() {console.log(child.value,'child');}return {child,showCompoment}},components: { Child }
}
</script>

展示效果:获取为空,数据或方法都没有获取到

通过 defineExpose() 向外暴露指定的数据或方法

<script setup lang="ts">
import { ref ,defineExpose} from "vue";let name = ref("al");
let age = ref(29);
function text() { }defineExpose({ name, age, text });</script>

展示效果:父组件获取到了子组件指定暴露的数据和方法

总结

1、在标签中添加 ref 属性的同时,需要在 脚本中 通过 ref() 函数定义一个容器来放置 给ref属性打上标签的DOM或组件实例,且接收的变量需要 与 标签中的ref 属性值相同。

2、标签中的 ref 属性允许在一个特定的 DOM 元素或子组件实例被挂载后,获得对它的直接引用。可能存在的情况是,在挂载之前,ref() 函数已经执行,此时获取的引用则是undefined,在挂载之后,Vue 底层会自动找到对应的 ref() 与 经过ref 标记的DOM或组件,并赋值给 Value属性。

3、在Vue2 中,通过 this.$refs.xx 的方式,是可以直接获取组件实例对象上的任意方法或属性的,但是 Vue3 中禁止了这一情况。取而代之的是通过指定暴露的方式像父组件暴露数据或方法,这是因为 按照Vue3 的指定暴露方法,可以降低耦合度,增强组件封装性。

4、Vue3 中 存在两种情况,一种是 setup() 函数,一种是<script setup>,在这两种情况中对外暴露指定数据或方法的逻辑代码不一致。

  • setup() 函数:setup函数接收两个对象参数(props,context),context对象中存在 expose 方法,该方法接收一个空值或一个对象。若为空,则表示不对外暴露任意数据方法,若为对象,则表示只对外暴露对象内部属性或方法。
  • <script setup>:通过 新的 API defineExpose() 来指定对外暴露的数据或方法。 

5、父组件只能访问子组件通过 setup 返回的、被公开的响应式数据或方法。子组件中的私有状态或未返回的数据是无法直接访问的。( 如果没有指定暴露数据,则 setup()函数中 return 出去的数据 父组件都能接受到。如果指定了暴露数据,父组件则只能接收到指定暴露的数据,return中的其他方法不能接收 )

6、<script setup> 中的代码会在编译时,生成一个 setup() 函数,将<script setup> 中的脚本经过编译后塞到 setup() 函数中。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

掌握AIGC的魔法:编写高质量提示词的艺术与科学

嘿&#xff0c;技术达人们&#xff0c;&#x1f680; 今天我们来聊聊AIGC界的超级明星——提示词&#xff08;Prompt&#xff09;。在AI生成内容的奇妙世界里&#xff0c;提示词就是那个点石成金的魔法棒。想要AI小伙伴听你的指挥&#xff0c;创造出令人惊叹的内容吗&#xff1…

9.2~9.3-模型量化学习内容

量化简介 量化是将模型浮点数变为定点数运行的过程。通过一个原始float数值range(scale、min、max)&#xff0c;将类似实属域的float数值映射到一个网格比较稀疏的int网络上&#xff0c;中间肯定会产生数值的偏移。 基本概念 &#xff1a;模型量化可以减少模型尺寸&#xff0…

驾驶模拟左拐右拐

目录 根据4个点确定投影变换关系&#xff1a; 驾驶模拟左拐右拐 平移 四个点选 通过3个点定义放射变换&#xff1a;结果不对 根据4个点确定投影变换关系&#xff1a; import cv2 import numpy as npdef apply_perspective_transform(image, src_points, dst_points):# 将选…

spring--小白面试版01

bean 1.Spring框架中的bean是单例的吗? Service Scope("singleton") public class UserServicelmpl implements UserService { } 在Scope中 singleton: bean在每个Spring IOC容器中只有一个实例 prototype:一个bean的定义可以有多个实例 2. Spring框架中的单例bea…

jdk11安装步骤(含安装包)

安装包 通过百度网盘分享的文件&#xff1a;jdk-11.0.15.1_windows-x64_bin.exe 链接&#xff1a;https://pan.baidu.com/s/1IYRnvtPvfgloS8rawtRDvg 提取码&#xff1a;sv1w 一、安装过程 双击安装程序 二、配置环境 右键“此电脑”&#xff0c;点击“属性”&#xff0c;点…

学生管理系统升级(登录注册 + 关联学生管理系统)

新增需求 这是在昨天的基础初代版本上面新增一个登录注册忘记密码的功能 需求分析 注册 登录 忘记密码 user类代码呈现 package StudentSystem;public class User {private String username;private String password;private String personID;private String phoneNumber;pu…

828华为云征文|华为云Flexus X实例docker部署srs6并调优,协议使用webrtc与rtmp

828华为云征文&#xff5c;华为云Flexus X实例docker部署srs6并调优&#xff0c;协议使用webrtc与rtmp 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务…

KTH5701 系列低功耗、高精度 3D 霍尔传感器

KTH5701 是一款数字输出的 3D 霍尔芯片&#xff0c;内部 分别集成了 X 轴、 Y 轴和 Z 轴三个独立的霍尔传感器。 信号链采用高精度运放通过 16 bit ADC 将模拟信号 转换成数字输出。外部主机可以采用 SPI 或 I2C 两种 模式读出测量数据。此外&#xff0c;在芯片…

2024第三届大学生算法大赛 真题训练一 解题报告 | 珂学家

前言 题解 这是第三届大学生算法大赛(第二届为清华社杯)的赛前练习赛一. 这是上界比赛的体验报告: 2023第二届“清华社杯”大学生算法大赛 解题报告(流水账版) | 珂学家&#xff0c;个人还是非常推荐这个比赛。 难度分布&#xff1a;4 easy/4 mid-hard/2 hard 赛前练习赛一…

Node.js发票查验接口示例、识别查验接口参数返回

财务、审计等经常与发票打交道的人员常常会遇到虚假发票、错票、重复报销等一系列问题。对于会计审计、代理记账、电子商务等发票查验量多的企业来说&#xff0c;成千上万张发票如果仅依赖于人工来进行核验&#xff0c;速度慢效率低&#xff0c;准确率也没保障&#xff0c;因此…

Tomato靶机通关攻略

步骤一&#xff1a;进行端口扫描&#xff0c;找寻靶机地址 步骤二&#xff1a;访问靶机地址 步骤三&#xff1a;利用dirb进行扫描 得出&#xff1a;/antibot_image/进行访问 步骤四&#xff1a;进入antibots->info.php->右击进入页面源代码->发现存在文件包含漏洞 步…

如何让wave波形信号不显示全路径

Modesim仿真如何让wave信号不显示全路径 问题说明 在使用modesim仿真时&#xff0c;需要利用modesim的wave界面显示调试信号的波形&#xff0c;默认情况下wave栏的左边是显示抓捕信号的全路径的&#xff0c;如下图所示: 这种情况下&#xff0c;区分信号比较麻烦&#xff0c;如…

vulhub xxe靶机渗透测试

1.先用kali的nmap扫描端口 2. 找到靶机地址后用工具扫描目录 3.我们先进入robots.txt中 4.访问xxe文件 5.在登陆时抓包 这里可以看到在我们用户名的位置是有回显的&#xff0c;我们可以在这里做文章 6.因为在 linux 系统中/etc/passwd 文件包含有用户账号信息所以我们可以写一…

开源轻量级进程监控工具monit的使用以及monit进程监控工具常用的监控配置案例示例大全

一、开源轻量级进程监控工具monit的应用 今天在服务器杀进程时&#xff0c;发现有一个进程一直在重启&#xff0c;寻找服务器各种定时任务未发现有定时程序&#xff0c;也没有发现supervisord的进程管理服务&#xff0c;后来才发现服务器上启用了monit这个工具&#xff0c;moni…

上证50ETF期权交易策略有哪些?期权交易时要注意什么?

今天带你了解上证50ETF期权交易策略有哪些&#xff1f;期权交易时要注意什么&#xff1f;上证50ETF期权是一种以华夏50etf基金为标的物的金融衍生品&#xff0c;它允许投资者通过买卖期权合约来对冲风险或进行投机。 期权趋势型策略 趋势型的策略就是我们通常说的追涨杀跌&am…

Anaconda最新安装教程

1 概述 1 介绍 Anaconda是一个专注于数据分析的Python发行版本&#xff0c;它为科学计算和数据科学领域提供了强大的支持。Anaconda是一个开源的Python发行版&#xff0c;包含了conda、Python以及超过190个科学包及其依赖项。这些包涵盖了数据分析、机器学习、深度学习等多个…

自己动手写CPU_step5_移动指令

移动操作指令 define EXE_MOVN 6b001011 //不等于0转移 if rt ! 0 then rs -> rd define EXE_MOVZ 6b001010 //等于0转移 if rt 0 then rs -> rd define EXE_MFHI 6b010000 // hi -> rd define EXE_MFLO 6b010010 // lo…

828华为云征文|华为云Flexus X实例docker部署harbor镜像仓库

828华为云征文&#xff5c;华为云Flexus X实例docker部署harbor镜像仓库 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&#xff0c;一定不要错…

使用豆包 MarsCode 编程助手,兑换 4090 显卡!

关于豆包 MarsCode 编程助手 豆包 MarsCode 编程助手是一个智能化的编程工具&#xff0c;通过与 AI 的对话&#xff0c;用户可以轻松获取编程建议、解决问题并提高编程效率。无论您是编程新手还是经验丰富的开发者&#xff0c;MarsCode 都能为您提供极具价值的帮助。 点击直达…

查询电脑上已经连接的wifi密码

首先在电脑屏幕的右下角找到自己的wifi图标&#xff0c;右键wifi的图标&#xff0c;点击打开“网络和Internet设置” 进入设置后左侧先点击WLAN&#xff0c;然后在右侧找到并点击网络和共享中心 在网络和共享中心中点击连接后面&#xff0c;WLAN的名称 在WLAN状态中点击无线…