Vue 实例中使用$refs的注意事项


Posted in Vue.js onJanuary 29, 2021

在开发过程中,经常会通过实例的vm.$refs(this.$refs)取得通过ref注册过的组件,并进行相应操作,但存在取不到元素的情况,其根本原因是因为$refs只能取得mounted(渲染)之后的元素。

Vue 实例中使用$refs的注意事项

例如,在这种情况中,若flag从真值切换到假值取不到节点是正常的,因为v-if如果为假值,那么该节点不会被渲染。

但如果从假值切换到真值时,也可能取不到节点,这是因为渲染需要时间,通常可以使用$nextTick()解决。

...
<el-table v-if="flag" ref="table">
  <el-table-column prop="prop1"></el-table-column>
  <el-table-column prop="prop2"></el-table-column>
</el-table>
...
 
 
export default {
  methods: {
    this.$refs.table.XXX()
  }
}

但存在一个极特殊的情况,第一次页面渲染的时候,$refs也取不到值。这个时候就要考虑v-show进行组件元素的隐藏与展示。

因为v-show是通过css的display:none进行隐藏控制,所以一开始就会渲染,肯定能够取到元素

补充:Vue.js中ref ($refs)用法举例总结及应注意的坑

一、根据官方文档总结的用法:

看Vue.js文档中的ref部分,自己总结了下ref的使用方法以便后面查阅。

1、ref使用在外面的组件上

HTML 部分

<div id="ref-outside-component" v-on:click="consoleRef">
  <component-father ref="outsideComponentRef">
  </component-father>
  <p>ref在外面的组件上</p>
</div>

js部分

var refoutsidecomponentTem={
    template:"<div class='childComp'><h5>我是子组件</h5></div>"
  };
  var refoutsidecomponent=new Vue({
    el:"#ref-outside-component",
    components:{
      "component-father":refoutsidecomponentTem
    },
    methods:{
      consoleRef:function () {
        console.log(this); // #ref-outside-component   vue实例
        console.log(this.$refs.outsideComponentRef); // div.childComp vue实例
      }
    }
  });

2、ref使用在外面的元素上

HTML部分

<!--ref在外面的元素上-->
<div id="ref-outside-dom" v-on:click="consoleRef" >
  <component-father>
  </component-father>
  <p ref="outsideDomRef">ref在外面的元素上</p>
</div>

JS部分

var refoutsidedomTem={
    template:"<div class='childComp'><h5>我是子组件</h5></div>"
  };
  var refoutsidedom=new Vue({
    el:"#ref-outside-dom",
    components:{
      "component-father":refoutsidedomTem
    },
    methods:{
      consoleRef:function () {
        console.log(this); // #ref-outside-dom  vue实例
        console.log(this.$refs.outsideDomRef); //  <p> ref在外面的元素上</p>
      }
    }
  });

3、ref使用在里面的元素上---局部注册组件

HTML部分

<!--ref在里面的元素上-->
<div id="ref-inside-dom">
  <component-father>
  </component-father>
  <p>ref在里面的元素上</p>
</div>

JS部分

var refinsidedomTem={
    template:"<div class='childComp' v-on:click='consoleRef'>" +
            "<h5 ref='insideDomRef'>我是子组件</h5>" +
         "</div>",
    methods:{
      consoleRef:function () {
        console.log(this); // div.childComp  vue实例 
        console.log(this.$refs.insideDomRef); // <h5 >我是子组件</h5>
      }
    }
  };
  var refinsidedom=new Vue({
    el:"#ref-inside-dom",
    components:{
      "component-father":refinsidedomTem
    }
  });

4、ref使用在里面的元素上---全局注册组件

HTML部分

<!--ref在里面的元素上--全局注册-->
<div id="ref-inside-dom-all">
  <ref-inside-dom-quanjv></ref-inside-dom-quanjv>
</div>

JS部分

Vue.component("ref-inside-dom-quanjv",{
    template:"<div class='insideFather'> " +
          "<input type='text' ref='insideDomRefAll' v-on:input='showinsideDomRef'>" +
          " <p>ref在里面的元素上--全局注册 </p> " +
         "</div>",
    methods:{
      showinsideDomRef:function () {
        console.log(this); //这里的this其实还是div.insideFather
        console.log(this.$refs.insideDomRefAll); // <input type="text">
      }
    }
  });
  var refinsidedomall=new Vue({
    el:"#ref-inside-dom-all"
  });

二、应注意的坑

1、如果通过v-for 遍历想加不同的ref时记得加 :号,即 :ref =某变量 ;

这点和其他属性一样,如果是固定值就不需要加 :号,如果是变量记得加 :号

Vue 实例中使用$refs的注意事项

2、通过 :ref =某变量 添加ref(即加了:号) ,如果想获取该ref时需要加 [0],如this.$refs[refsArrayItem] [0];如果不是:ref =某变量的方式而是 ref =某字符串时则不需要加,如this.$refs[refsArrayItem]

Vue 实例中使用$refs的注意事项

加和不加[0]的区别--未展开

Vue 实例中使用$refs的注意事项

加和不加[0]的区别--展开了

3、想在element ui 对话框打开后取dom时,应该使用$nextTick,而不是直接使用this.$refs. imgLocal2:

console.log('this.$refs.imgLocal2外面', this.$refs.imgLocal2);
    setTimeout(() => {
     console.log('this.$refs.imgLocal2 setTimeout', this.$refs.imgLocal2);
    }, 500); // 不推荐
    this.$nextTick(() => {
     console.log('this.$refs.imgLocal2 $nextTick', this.$refs.imgLocal2);
    });

Vue 实例中使用$refs的注意事项

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Vue.js 相关文章推荐
springboot+vue实现文件上传下载
Nov 17 Vue.js
Vue3配置axios跨域实现过程解析
Nov 25 Vue.js
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 Vue.js
Vue实现简易购物车页面
Dec 30 Vue.js
vue实现登录功能
Dec 31 Vue.js
vue中activated的用法
Jan 03 Vue.js
用vite搭建vue3应用的实现方法
Feb 22 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
VUE递归树形实现多级列表
Jul 15 Vue.js
vue 项目@change多个参数传值多个事件的操作
Jan 29 #Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 #Vue.js
聊聊vue 中的v-on参数问题
Jan 29 #Vue.js
vue集成一个支持图片缩放拖拽的富文本编辑器
Jan 29 #Vue.js
Vue 事件的$event参数=事件的值案例
Jan 29 #Vue.js
Vue 3自定义指令开发的相关总结
Jan 29 #Vue.js
vue 中this.$set 动态绑定数据的案例讲解
Jan 29 #Vue.js
You might like
php array_flip() 删除数组重复元素
2009/01/14 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
PHP 的比较运算与逻辑运算详解
2016/05/12 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
js计算精度问题小结
2013/04/22 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
Python实现破解猜数游戏算法示例
2017/09/25 Python
python针对excel的操作技巧
2018/03/13 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
python实现按首字母分类查找功能
2019/10/31 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
标记环介质访问控制协议
2016/03/27 面试题
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
慈善晚会策划方案
2014/05/14 职场文书
企业文化理念标语
2014/06/10 职场文书
预备党员表决心的话
2015/09/22 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
python中的被动信息搜集
2021/04/29 Python
浅谈Web Storage API的使用
2021/06/23 Javascript