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 相关文章推荐
一个不错的应用,用于提交获取文章内容,不推荐用
Mar 03 Javascript
用js实现输入提示(自动完成)的实例代码
Jun 14 Javascript
JS实现点击链接取消跳转效果的方法
Jan 24 Javascript
jquery实现表单输入时提示文字滑动向上效果
Aug 10 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
Jun 21 Javascript
js轮盘抽奖实例分析
Apr 17 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
Oct 08 Javascript
javascript 中Cookie读、写与删除操作
Mar 29 Javascript
微信小程序日历组件使用方法详解
Dec 29 Javascript
教你搭建按需加载的Vue组件库(小结)
Jul 29 Javascript
layui 实现表格某一列显示图标
Sep 19 Javascript
JavaScript中reduce()的用法
May 11 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删除HTMl标签的实现代码
2013/06/30 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
js 深拷贝函数
2008/12/04 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
window.addEventListener来解决让一个js事件执行多个函数
2012/12/26 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
js点击选择文本的方法
2015/02/09 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
介绍Python中的一些高级编程技巧
2015/04/02 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
深入浅析Python中的yield关键字
2018/01/24 Python
python-opencv颜色提取分割方法
2018/12/08 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
党员批评与自我批评
2014/02/12 职场文书
婚内分居协议书范文
2014/11/26 职场文书
员工2014年度工作总结
2014/12/09 职场文书
Django实现聊天机器人
2021/05/31 Python
关于Numpy之repeat、tile的用法总结
2021/06/02 Python