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 EasyUI API 中文文档 - ComboGrid 组合表格
Oct 13 Javascript
js 走马灯简单实例
Nov 21 Javascript
node.js Web应用框架Express入门指南
May 28 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
Sep 10 Javascript
jQuery中dequeue()方法用法实例
Dec 29 Javascript
javascript遇到html5的一些表单属性
Jul 05 Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
Aug 02 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
May 07 Javascript
详解webpack-dev-server使用方法
Sep 14 Javascript
JavaScript计算正方形面积
Nov 26 Javascript
javascript设计模式之装饰者模式
Jan 30 Javascript
JavaScript展开运算符和剩余运算符的区别详解
Feb 18 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
2014/06/22 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
php实现的http请求封装示例
2016/11/08 PHP
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
js中开关变量使用实例
2017/02/24 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
vue中的scope使用详解
2017/10/29 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
Vue-input框checkbox强制刷新问题
2019/04/18 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
Python的另外几种语言实现
2015/01/29 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
自定义django admin model表单提交的例子
2019/08/23 Python
Python 项目转化为so文件实例
2019/12/23 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
Python使用type动态创建类操作示例
2020/02/29 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
优秀高中生事迹材料
2014/02/11 职场文书
关于运动会的广播稿
2015/08/19 职场文书
《蟋蟀的住宅》教学反思
2016/02/17 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书