vue中使用refs定位dom出现undefined的解决方法


Posted in Javascript onDecember 21, 2017

之前在公司做项目,一直感觉用ref来定位dom节点挺方便的。但是期间遇到了一个问题,就是在mounted(){}钩子里面使用this.$refs.xxx,打印出来的却是undefined?

于是我就对比了一下之前使用ref定位的.vue文件,发现了他们之间的区别。

我们要想知道为什么会定位不到某个DOM节点,我们首先要理解mounted(){}这个钩子函数是用来做什么的。

下面是vue官方给出的vue生命周期(部分),正如官方所说的一样,一开始不必先理解,不过随这你的学习与使用,他的参考价值会越来越高。

 vue中使用refs定位dom出现undefined的解决方法

原来,mounted阶段,DOM结构准备就绪,但是这里的准备就绪需要特别说明一下:

DOM结构已经出来了,但是如果在DOM结构中的某个DOM节点使用了v-if、v-show或者v-for(即根据获得的后台数据来动态操作DOM,即响应式),那么这些DOM是不会再mounted阶段找到的。

此时的mounted阶段,一般是用于发起后端请求,拿回数据,配合路由钩子做一些事情,简单来说就是在mounted钩子中加载数据而已,加载回来的数据是不会再这个阶段更新的DOM中的

所以如果在mounted钩子中使用$refs,如果ref是定位在有v-if、v-for、v-show中的DOM节点,返回来的只能是undefined,因为在mounted阶段他们根本不存在!!

经过检验,上面端文字是错误的,$refs定位不到的主要原因是因为v-if、v-for、v-show这些语句如果依赖父组件传来的参数的话,该该参数是在mounted()阶段子还没获取得到~~~~!!!!

如果想要真正地在DOM加载完成后拿到数据,就需要调用VUE的全局api : this.$nextTick(() => {})

如果说mounted阶段是加载阶段,那么updated阶段则是完成了数据更新到DOM的阶段(对加载回来的数据进行处理),此时,ref、数据等等全部都挂载到DOM结构上去,在update阶段使用this.$refs.xxx,就100%能找到该DOM节点。

updated与mounted不同的是,在每一次的DOM结构更新,vue都会调用一次updated(){}钩子函数!而mounted仅仅只执行一次而已

简单来说,只要在调试的时候,能看到元素的存在,在updated阶段都可以使用this.$refs.xxx找到对应的DOM节点!

关于$refs的使用,官方文档特别给出了以下提示:

vue中使用refs定位dom出现undefined的解决方法 

使用的时候就注意咯- -

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 自动转到命名锚记
Jan 10 Javascript
写出更好的JavaScript之undefined篇(上)
Nov 22 Javascript
基于Jquery的温度计动画效果
Jun 18 Javascript
继续学习javascript闭包
Dec 03 Javascript
window.onerror()的用法与实例分析
Jan 27 Javascript
Vue.js实现实例搜索应用功能详细代码
Aug 24 Javascript
vue-cli实现多页面多路由的示例代码
Jan 30 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
May 14 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
Sep 03 Javascript
vue-cli脚手架的.babelrc文件用法说明
Sep 11 Javascript
如何让vue长列表快速加载
Mar 29 Vue.js
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
May 30 Javascript
js中bool值的转换及“&&”、“||”、 “!!”详解
Dec 21 #Javascript
利用node实现一个批量重命名文件的函数
Dec 21 #Javascript
详解webpack3编译兼容IE8的正确姿势
Dec 21 #Javascript
利用vue开发一个所谓的数独方法实例
Dec 21 #Javascript
开发Vue树形组件的示例代码
Dec 21 #Javascript
详解使用vuex进行菜单管理
Dec 21 #Javascript
Angular5.1新功能分享
Dec 21 #Javascript
You might like
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
php文件包含的几种方式总结
2019/09/19 PHP
utf8的编码算法 转载
2006/12/27 Javascript
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
详解vue axios二次封装
2018/07/22 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
Python实现list反转实例汇总
2014/11/11 Python
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
tornado+celery的简单使用详解
2019/12/21 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
利用Python优雅的登录校园网
2020/10/21 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
DNA基因检测和分析:23andMe
2019/05/01 全球购物
AJAX的优缺点都有什么
2015/08/18 面试题
校园安全演讲稿
2014/05/09 职场文书
重温入党誓词主持词
2015/06/29 职场文书
党员发展大会主持词
2015/07/03 职场文书
人生感悟经典句子
2019/08/20 职场文书
Python实现byte转integer
2021/06/03 Python
V Rising 服务器搭建图文教程
2022/06/16 Servers