【vue2第十二章】ref和$refs获取dom元素 和 vue异步更新与$nextTick使用

ref和$refs获取dom元素

为什么会有 ref 和 $refs?

因为在vue页面中使用dom查找元素,不管你是不是在子组件里面查找,查找的都是整个页面的元素,如果你想查找单独组件里面的元素是不容易实现的,除非把每个组件的class写成独一无二,但是在日常开发中,一个vue页面不知道会有多少组件,所以出现了relrefs.

ref 和 $refs 作用
在这里插入图片描述

ref 和 $refs 使用

通过在要获取的元素上面店家rel属性 rel="名称"
然后在要获取此元素的js代码上通过 this.$rels.名称 就可以获取。

如此获取的就是当前组件内部的标签了,

<template><div><!-- 为input框添加rel属性 --><input  type="text" :value="msg" ref="inp"@input="fun($event.target.value)"><button @click="showInput">显示</button></div>
</template>
<script>
export default {props:{msg:String},mounted(){},methods:{fun(e){this.$emit('update:msg',e)},showInput(){//通过this.$rels.inp获得标签console.log(this.$refs.inp)console.log(this.$refs.inp.value)}}
}
</script>

也是成功的获取到了并且打印出来:
在这里插入图片描述

vue异步更新和$nextTick使用

什么是vue的异步更新?
Vue的异步更新是指在Vue的响应式系统中,更新组件的方式是异步的。这意味着当数据发生变化时,Vue并不立即更新组件的DOM,而是等到同一事件循环中的所有数据变化完成后,再统一进行一次更新操作。

vue的异步更新好处
Vue之所以采用异步更新的机制,是为了优化性能和避免不必要的重复渲染。当数据发生变化时,Vue会将变化加入到一个队列中,然后通过异步的方式批量处理这些变化。这样可以避免频繁的DOM操作,提高性能。

异步更新还带来一个重要的好处,即在同一个事件循环中,多处对同一数据进行修改时,只会触发一次更新操作。这样可以减少重复的计算和渲染,提升性能。

总结来说,Vue的异步更新可以提高性能和优化渲染,使得组件更新更加高效和灵活。

案列:
我需要点击编辑按钮 然后显示input框 并且聚焦到input框上。
在这里插入图片描述
我的代码是这样的:

<template><div><!-- 为input框添加rel属性,使用v-if来显示隐藏input框 --><input  type="text" :value="msg" v-if="isShow" ref="inp"><!-- 添加方法 --><button  @click="showInput">编辑</button></div>
</template><script>
export default {data(){return{isShow:false}},props:{msg:String},mounted(){},methods:{showInput(){//显示input框this.isShow = true//通过this.$rels.inp获得标签console.log(this.$refs.inp)console.log(this.$refs.inp.value)//为input框聚焦this.$refs.inp.focus()}}
}
</script>

然后我点击编辑按钮出现了下面的错误,说我的this.$refs.inp是 undefined。
在这里插入图片描述
为什么 “显示之后“ 立刻获取焦点没有成功呢?
就是vue采用的是异步更新的机制,当 //显示input框 this.isShow = true时并没有马上去更新页面的dom,而是等待这个方法执行完成再去进行更新页面,所以导致获取的this.$refs.inp是 undefined。所以问题就是在我在它没有更新dom的时候就去获取dom,所以是undefined.

如何解决?(使用$nextTick

<template><div><input  type="text" :value="msg" v-if="isShow" ref="inp"><button  @click="showInput">编辑</button></div>
</template><script>
export default {data(){return{isShow:false}},props:{msg:String},mounted(){},methods:{showInput(){this.isShow = true//通过this.$rels.inp获得标签//将需要使用未更新的dom元素使用this.$nextTick()封装为箭头函数包裹起来this.$nextTick(()=>{this.$refs.inp.focus()console.log(this.$refs.inp)console.log(this.$refs.inp.value)})}}
}
</script>

最后成功聚焦,并且控制台输出了当前获取标签:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爱校对:让法律、医疗、教育行业的文本更加无懈可击

在今天这个信息爆炸的世界里&#xff0c;文本准确性成了法律、医疗和教育这些严谨行业中一个不能忽视的要点。一个小错误可能造成严重的后果&#xff0c;甚至影响人们的生命和事业。这正是为什么更多的专业人士开始选择使用“爱校对”来确保他们的文档、研究和通讯无懈可击。 法…

【数据结构练习】栈的面试题集锦

目录 前言&#xff1a; 1.进栈过程中可以出栈的选择题 2.将递归转化为循环 3.逆波兰表达式求值 4.有效的括号 5. 栈的压入、弹出序列 6. 最小栈 前言&#xff1a; 数据结构想要学的好&#xff0c;刷题少不了&#xff0c;我们不仅要多刷题&#xff0c;还要刷好题&#x…

PMP备考过程和心得

23年还剩11月的考试&#xff0c;教材是第七版教材&#xff0c;也有可能增加连线题和填空题&#xff0c;要做好题型变化的准备。现在可以将英文报名先报了。 第七版教材 第七版再度升级&#xff0c;不否认前几版的基于过程的方法&#xff0c;强调项目不只是产生输出&#xff0…

设计模式-9--迭代器模式(Iterator Pattern)

一、什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于提供一种统一的方式来访问一个聚合对象中的各个元素&#xff0c;而不需要暴露该聚合对象的内部结构。迭代器模式将遍历集合的责任从集合对象中分离出来&#xf…

开源PHP 代挂机源码,可对接QQ、网易云、哔哩哔哩、QQ空间、等级加速等等

本程序运行环境PHP5.6 95dg/config.php修改系统数据库 进入数据库绑定 你搭建的域名即可 部署完成 进入数据库 找到data 输入绑定授权域名即可进行授权打开此网站 网站是无对接接口 需要您自行找对接接口即可 本源码有点乱 有实力的铁铁 可以修改一下哦&#xff01;

ping: www.baidu.com: Name or service not known 写了DNS还是不行

环境描述&#xff1a;ESXI平台上&#xff0c;一台Centos7虚拟主机。 问题描述&#xff1a;平台上的其他的虚拟机可以正常ping通&#xff0c;就这台ping IP地址可以通&#xff0c;ping域名解析失败。 排查过程&#xff1a; 1、检查网卡配置文件和/etc/resolv.conf配置文件是否…

一文了解评估 K8s 原生存储产品需要关注的关键能力

近些年&#xff0c;越来越多的企业使用 Kubernetes&#xff08;K8s&#xff09;支持生产环境关键业务。这些业务往往对存储性能和稳定性具有更高的要求&#xff0c;传统存储方案难以充分满足&#xff0c;因此不少用户开始关注更契合 K8s 环境的 K8s 原生存储方案。 不过&#…

Spring-Cloud-Openfeign如何传递用户信息?

用户信息传递 微服务系统中&#xff0c;前端会携带登录生成的token访问后端接口&#xff0c;请求会首先到达网关&#xff0c;网关一般会做token解析&#xff0c;然后把解析出来的用户ID放到http的请求头中继续传递给后端的微服务&#xff0c;微服务中会有拦截器来做用户信息的…

干货| ICML2023:作为自适应自进化规划器的扩散模型

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 作者介绍 梁志烜 香港大学计算机系直博一年级学生&#xff0c;导师为罗平教授&#xff0c;研究兴趣是生成式机器学习&#xff0c;Embodied AI和Data-centric learning。 报告题目 作为自适应自进化规划器的扩散…

F#奇妙游(28):ADT中简单值的F#实现

简单值的ADT 在领域建模中&#xff0c;我们尝尝会遇到一些简单的值&#xff0c;比如人的名字、人的编号、物品的代码。如果过早进行程序设计&#xff0c;这些值很容易就会变成程序设计语言中的基本量&#xff0c;string、int这些&#xff0c;就比如人的标号和物品的编号&#…

没有软件怎么管理固定资产

在当今数字化的世界中&#xff0c;我们已经习惯了使用各种软件来管理我们的日常生活和工作。然而&#xff0c;当我们面临一个看似简单的问题——如何管理固定资产时&#xff0c;我们可能会感到困惑。那么&#xff0c;如果没有软件&#xff0c;我们该如何进行资产管理呢&#xf…

通过idea实现springboot集成mybatys

概述 使用springboot 集成 mybatys后&#xff0c;通过http请求接口&#xff0c;使得通过http请求可以直接直接操作数据库&#xff1b; 完成后端功能框架&#xff1b;前端是准备上小程序&#xff0c;调用https的请求接口用。简单实现后端框架&#xff1b; 详细 springboot 集…