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 相关文章推荐
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
Oct 24 Javascript
jquery实现metro效果示例代码
Sep 06 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
Feb 25 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
Aug 31 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
May 27 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
利用n工具轻松管理Node.js的版本
Apr 21 Javascript
简单谈谈JS中的正则表达式
Sep 11 Javascript
基于vue实现web端超大数据量表格的卡顿解决
Apr 02 Javascript
开发Node CLI构建微信小程序脚手架的示例
Mar 27 Javascript
Vue仿Bibibili首页的问题
Jan 21 Vue.js
javascript中Set、Map、WeakSet、WeakMap区别
Dec 24 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 mysql索引问题
2008/06/07 PHP
php调用C代码的实现方法
2014/03/11 PHP
php类的定义与继承用法实例
2015/07/07 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
js 操作css实现代码
2009/06/11 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
Linux开机引导的步骤是什么
2014/02/26 面试题
毕业生自荐信
2013/12/14 职场文书
学术会议欢迎词
2014/01/09 职场文书
装饰活动策划方案
2014/02/11 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
施工工地安全标语
2014/06/07 职场文书
中国世界遗产导游词
2015/02/13 职场文书
收费员岗位职责
2015/02/14 职场文书
保姆聘用合同
2015/09/21 职场文书
详解PyTorch模型保存与加载
2022/04/28 Python