热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Vue3】refs的使用和vif冲突,undefined“TypeError:Cannotreadproperty‘$refs‘

参考:使el-form中的el-input自动获取焦点https:www.cnblogs.comrockyjsp13974649.htmlhttps:segment

参考:


  • 使el-form中的el-input自动获取焦点
  • https://www.cnblogs.com/rockyjs/p/13974649.html
  • https://segmentfault.com/q/1010000021805173
  • Vue中在使用v-for或v-if下ref获取DOM不到undefined的问题
  • vue 3.0 使用ref获取dom元素
  • vue3如何通过ref属性获取元素
  • Vue3 中的 $refs 绑定变得这么神奇…
  • 子组件通过v-if 来控制显示隐藏与 ref ,DOM渲染的问题!

问题:

v-if this.$refs无法获取ref的值
出现了报错:

Error in nextTick: "TypeError: Cannot read property '$refs' of undefined"

通过v-if来控制子组件显示隐藏,然后发现子组件的this.$refs都是undefind.的问题


靠谱的解决方法:


  1. 上策 :不要使用ref的方法,而是使用自定义指令->自定义指令 1

  2. 中策 :修改业务逻辑:不要同时使用refv-if(这是dom的渲染机制决定的)

  3. 下策:修改业务逻辑,将v-if改成v-show(v-show和v-if的区别可以自己查下资料)


原因:

在这里插入图片描述


这位大佬说的对,出现报错的原因是:


refs不是动态,需要等页面渲染完成后才能拿到DOM元素

在这里插入图片描述


  • 这个错误提示很明显是绑定$refs的元素或组件不存在导致的,建议理清楚业务逻辑再编码,另外根据你贴的代码图,你似乎想要调用el-input这个组件的子组件上的focus()方法,
  • 根据element-ui的定义el-input组件是不存在子组件的,所以你直接以
    this.$refs.target.focus();调用即可,
  • 还有如果你的showInput方法是点击调用的话你大可不必使用nextTick,因为当你想要调用methods
    你的视图都已渲染完毕。

v-if 和 v-ref 同时出现时,将会有可能DOM渲染完毕后,由于v-if是false,从而没有渲染到v-ref,导致后续引用为空,


不信的话你把v-if改成true,再渲染一下试试,


  • 上一层受v-if的限制,可能没有显示,从而导致子节点无法获取,
  • 可以考虑把上一层节点的v-if改成v-show,
  • 或者分析一下为什么父节点没有显示,从业务逻辑上积极这个问题

另外,Vue3里,需要把ref写成下面的形式:

test.vue

<template><div ref&#61;"myRef">获取单个DOM元素</div>
</template><script>
import { ref, onMounted } from &#39;vue&#39;; //需要引用refexport default {//没有在setup里设定 这步也可以&#xff0c;直接在函数里调用&#xff0c;setup() {const myRef &#61; ref(null); //在setup 时&#xff08;也就是dom渲染完成后&#xff09;&#xff0c;设置ref的值&#xff0c;然后用return去获取一个ref&#xff0c;return {myRef};}
};
</script>

或者使用下面的方法&#xff1a;


【自定义指令官方文档】&#xff1a;除了核心功能默认内置的指令 (例如 v-model 和 v-show)&#xff0c;Vue 也允许注册自定义指令

具体的代码实现就是&#xff0c;在script里面加一个自定义指令&#xff0c;并且定义指令内容为调用输入的聚焦

<template>
<el-inputv-focusclass&#61;"input-new-tag"v-if&#61;"inputVisible"v-model&#61;"inputValue"ref&#61;"saveTagInput"size&#61;"small"&#64;keyup.enter.native&#61;"handleInputConfirm"&#64;blur&#61;"handleInputConfirm"
>
</el-input>
<el-button v-else class&#61;"button-new-tag" size&#61;"small" &#64;click&#61;"showInput">&#43; New Tag</el-button>
</template><script>
export default{directives: {//注册一个局部的自定义指令 v-focusfocus: {// 指令的定义inserted: function (el) {// 聚焦元素el.querySelector(&#39;input&#39;).focus()}}}method:{showInput() {this.inputVisible &#61; true;//不需要下面的ref函数也可以自动聚焦了&#xff0c;因为这里的element 的输入类型的指令中&#xff0c;聚焦函数focus()的函数功能 已经被替换为了上面自定义的focus&#xff08;&#xff09;函数了&#xff1a;同理&#xff0c;上面的template部分的ref也已经可以去掉了/*this.$nextTick(_ &#61;> {this.$refs.saveTagInput.$refs.input.focus(); //可用了});*/},}
}
</script>

这样在v-if el-input显示以后就会自动聚焦了&#xff0c;而且也不会再报ref为空的错&#xff1b; 根本不需要ref了


其他的未经验证的解决方法&#xff1a;

1&#xff0c;可以采用 定时器&#xff08;不推荐&#xff09;

2&#xff0c;用this.$nextTick来进行判断当前是否数据和dom已经加载完成了

this.$nextTick(() &#61;> {console.log(this.gain);this.$refs.XXX函数.focus();});

可以在请求数据的后面then里面写&#xff0c;
也可以写在数据获取到后外面方法上面&#xff0c;都是可以实现的。




  1. 自定义指令&#xff1a;除了核心功能默认内置的指令 (例如 v-model 和 v-show)&#xff0c;Vue 也允许注册自定义指令 ↩︎



推荐阅读
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 本打算教一步步实现koa-router,因为要解释的太多了,所以先简化成mini版本,从实现部分功能到阅读源码,希望能让你好理解一些。希望你之前有读过koa源码,没有的话,给你链接 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 本文介绍了.hbs文件作为Ember.js项目中的视图层,类似于HTML文件的功能,并详细讲解了如何在Ember.js应用中集成Bootstrap框架及其相关组件的方法。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 使用Vue指令实现下拉菜单效果
    使用Vue指令实现下拉菜单效果模仿重庆红岩历史革命博物馆官网的导航栏内容和效果,使用Vue实现。官网地址如下:https:www.hongyan.info官网效果效果图片展示代码展 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom&amp;quot;echarts&amp;quot;;4、如果用到map(地图),还 ... [详细]
  • 更新vuex的数据为什么用mutation?
    更新vuex的数据为什么用mutation?,Go语言社区,Golang程序员人脉社 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • jQuery插件验证与屏幕键盘功能的集成解决方案
    本文介绍了一种集成了验证功能和屏幕键盘的jQuery插件解决方案。该插件不仅提供了强大的表单验证功能,还引入了一个高度可定制的屏幕键盘,以增强用户体验。通过这一集成方案,开发者可以轻松实现复杂的表单验证逻辑,并为用户提供便捷的输入方式,特别适用于移动设备或特殊输入场景。 ... [详细]
author-avatar
qiuyaji4379
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有