Vue 解决通过this.$refs来获取DOM或者组件报错问题


Posted in Javascript onJuly 28, 2020

1.关于this.$refs的使用场景

如果ref属性加在普通元素上,那么this.$refs.name则指向该DOM元素

<p ref="p">hello</p>

<!-- this.$refs.p 指向该DOM元素 -->

如果ref属性加在组件上,那么this.$refs.name指向该组件实例

<child-component ref="child"></child-component>

<!-- this.$refs.child 指向该组件 -->

2.为什么有时候通过this.$refs.name来获取会报错?

一个比较常见的场景:在一个弹窗打开的时候立刻通过this.$refs来获取内容就会出现xxx is undefined的错误

因为ref本身是作为渲染结果被创建的,在渲染的时候是不能访问的,因为他们还不存在!

如果此时代码是需要这样来写代码,那么你可以在DOM渲染完毕后再进行获取

this.$nextTick(() => {
 this.$refs.name... //DOM渲染完毕后就能正常获取了
})

补充知识:vue ref用法(this.$refs获取为空)

//6.14更新

但是有个办法,我们可以使用

this.$nextTick(() => {
  // todo
})
 
setTimeout(() => {
  // todo
}, 0)

来得到数据

ref

本身作为渲染结果被创建,在初始渲染的时候不能访问他们,是不存在的

$refs不是响应式的,只在组件渲染完成后才填充

用于元素或子组件注册引用信息,注册完成,将会注册在父组件$refs对象上

如果你获取到的总是空的,你注意一下:

1、你在哪里调用,和你调用的对象

试试在mounted()里面调用有效果没有

调用的对象是本来就存在的,还是需要数据渲染之后才会出现的,同理,在mounted()里面调用看看

2、调用对象是不是数组列表

我一开始设置ref在v-for列表上,直接获取this.$refs.name.style,永远是空的,

后来才发现,this.$refs.name是一个数组,无法通过 .style 获取样式,

只能遍历这个this.$refs.name数组,在this.$refs.name[index]上设置样式

// 6.14 更新,这个说法有点问题

但是像高度宽度,可以通过offsetHeight,等来获取。

3、调用对象是否和v-if结合使用

ref不是响应式的,所有的动态加载的模板更新它都无法相应的变化。

最后

在使用中,我发现$refs.style只能设置该对象的样式,获取出来的值都是空的

以上这篇Vue 解决通过this.$refs来获取DOM或者组件报错问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
Dec 08 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
Feb 16 Javascript
JS Replace()的高级使用方法介绍
Jun 29 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
快速解决js开发下拉框中blur与click冲突
Oct 10 Javascript
基于Vue如何封装分页组件
Dec 16 Javascript
bootstrap datepicker插件默认英文修改为中文
Jul 28 Javascript
Vue-Router基础学习笔记(小结)
Oct 15 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
May 24 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
Jun 18 Javascript
微信小程序基于高德地图查找位置并显示文字
Oct 30 Javascript
原生JavaScript实现购物车
Jan 10 Javascript
JS代码简洁方式之函数方法详解
Jul 28 #Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
Jul 28 #Javascript
JavaScript前端开发时数值运算的小技巧
Jul 28 #Javascript
js实现全选和全不选
Jul 28 #Javascript
浅谈vue中$bus的使用和涉及到的问题
Jul 28 #Javascript
js实现全选和全不选功能
Jul 28 #Javascript
JavaScript React如何修改默认端口号方法详解
Jul 28 #Javascript
You might like
PHP静态新闻列表自动生成代码
2007/06/14 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python中文件遍历的两种方法
2014/06/16 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
深入理解Python中装饰器的用法
2016/06/28 Python
python分割列表(list)的方法示例
2017/05/07 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
求职简历中个人的自我评价
2013/12/25 职场文书
创先争优公开承诺书
2014/08/30 职场文书
迎国庆横幅标语
2014/10/08 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
电力安全学习心得体会
2016/01/18 职场文书