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 相关文章推荐
js 单击式的下拉菜单效果实例
Aug 13 Javascript
jQuery获取动态生成的元素示例
Jun 15 Javascript
每天一篇javascript学习小结(Function对象)
Nov 16 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
Apr 14 Javascript
Angularjs实现mvvm式的选项卡示例代码
Sep 08 Javascript
JavaScript中数组的各种操作的总结(必看篇)
Feb 13 Javascript
原生js实现放大镜特效
Mar 08 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
Mar 17 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
Jun 20 Javascript
vue获取DOM元素并设置属性的两种实现方法
Sep 30 Javascript
基于JS实现带动画效果的流程进度条
Jun 01 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
Apr 17 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
Terran建筑一览
2020/03/14 星际争霸
网络资源
2006/10/09 PHP
PHP crc32()函数讲解
2019/02/14 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
JavaScript中的闭包
2016/02/24 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
vue中监听返回键问题
2019/08/28 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
python自动裁剪图像代码分享
2017/11/25 Python
Python Socket使用实例
2017/12/18 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
python中import与from方法总结(推荐)
2019/03/21 Python
Python中的类与类型示例详解
2019/07/10 Python
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
社团文化节邀请函
2014/01/10 职场文书
安全生产实施方案
2014/02/23 职场文书
图书室标语
2014/06/21 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
考试作弊检讨书
2015/01/27 职场文书
端午节寄语2015
2015/03/23 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书