关于ref哪怕在$nextTick()中有时候获取不到节点元素的问题。(较为诡异的bug)

我的需求是用element-ui的messagebox,来实现验证码接受的功能。并将cancel按钮换成刷新功能,在beforeClose中实现验证码刷新。元素都是在$msgbox中生成的,下面是最开始出错的核心代码。

        let result = await this.$API.reqCaptchaImg();this.captchaImg = "data:image/png;base64," + result.img;this.uuid = result.uuid;const h = this.$createElement;const inputElem = h("input",{attrs: {value: this.inputCaptcha,id: "input1",},on: {input: function (event) {this.inputCaptcha = event.target.value;}.bind(this),},},"");const imgElem = h("img", {ref: "captchaImg",attrs: {src: this.captchaImg,},});// 将 input 和 img 元素放到 Vue 组件之外的 div 中const divElem = h("div", [inputElem, imgElem]);await this.$msgbox({title: "Please enter the verification code",message: divElem,type: "warning",center: true,showCancelButton: true,confirmButtonText: "confirm",cancelButtonText: "refresh",distinguishCancelAndClose: true,beforeClose: async (action, instance, done) => {// console.log(action);if (action === "confirm") {flag = true;done();} else if (action === "cancel") {let result = await this.$API.reqCaptchaImg();this.captchaImg = "data:image/png;base64," + result.img;this.uuid = result.uuid;this.$nextTick(() => {// 更新captchaImg元素的src属性this.$refs.captchaImg.src = this.captchaImg;      });} else {flag = false;done();}},}).then((action) => {}).catch((action) => {});

其中,通过解决方法,可知错误主要集中在这俩处。

        const imgElem = h("img", {ref: "captchaImg",attrs: {src: this.captchaImg,},});this.$nextTick(() => {// 更新captchaImg元素的src属性this.$refs.captchaImg.src = this.captchaImg;      });

这样写,之后,出现了非常奇怪的bug。我测试的过程中,大部分时候的刷新验证码功能是完好的。但有时候就会出现无法获取ref元素的情况。出现下面的报错。

Error in nextTick: "TypeError: Cannot set properties of undefined (setting 'src')"

  1. 第一个奇怪的地方:首次出现验证码界面时,每一次都是正常显示的。只有点击刷新时,才有可能会出现报错。这说明节点元素明明已经更新到页面上了,但后续确找不到ref绑定。且报错会一直存在。除非手动刷新浏览器,才能正常刷新验证码。

  1. 第二个奇怪的地方:开发的时候,我发现报错是偶尔才会出现的,但一直不清楚报错出现的情况。后来,我发现:如果你每次都手动刷新浏览器,功能是正常的。但如果你是修改了代码,哪怕只是删了一行注释。然后ctrl+s保存,vue帮你自动刷新页面。你再重新打开messagebox刷新验证码,便会出现ref找不到绑定的情况。

在全网论坛上寻找原因,并没有找到解决方法。后面在chatgpt上寻找原因,发现chatgpt也不是万能的,最开始几次提供的都是错误的思路。(包括但不限于清除浏览器缓存,divElem放到msgbox外面,为$refs.captchaImg提供初始图片等)

多试了几次后,gpt找到了正确的方法。如下:尝试将 $refs.captchaImg 替换为 document.getElementById('captcha-img')。修改后代码的核心如下:

        const imgElem = h("img", {//不要这个//ref: "captchaImg",attrs: {src: this.captchaImg,//要这个id:"captcha-img",},style: {"margin-top": "20px",},});this.$nextTick(() => {// 更新captchaImg元素的src属性// this.$refs.captchaImg.src = this.captchaImg;document.getElementById('captcha-img').src = this.captchaImg;});

关于为什么使用ref会出现这么诡异的bug,id却不会。gpt解释如下:

问题是解决了,但是这并没有打消我对前面两个问题的疑问。先写一篇文章放在这里,等待后续再来回顾。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/70359.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序实现分页加载,触底加载下一页,滚动加载

这里我就不写wxml了,就是一个列表循环,直接看js代码逻辑,注释都写在代码后面了,这个方法可以实现无限滚动加载,直到加载完最后一条数据,也可以实现触底没数据后,二次触底可以从新加载刷新&#…

某地刑侦大队对涉及6个嫌疑人的一桩疑案进行分析

(1)A、B 至少有一人作案; (2)A、E、F 三人中至少有两人参与作案; (3)A、D 不可能是同案犯; (4)B、C 或同时作案,或与本案无关&#xf…

今天,微软重新发明搜索引擎:首款ChatGPT搜索来了

从现在起,比 ChatGPT 更强大的语言模型直接进入了你的浏览器。 一夜之间,全球最大的科技公司仿佛都回到了自己年轻时的样子。 在谷歌宣布「实验性对话式人工智能服务」Bard 之后仅 24 小时,北京时间 2 月 8 日凌晨两点,微软发布了…

嵌入式工程师的入门须知----亲测

嵌入式工程师的学习路线----亲测 本文概述入门之前必做竭尽所能了解嵌入式技术与职业规划正确认识自己 我眼中的嵌入式技术我眼中的职业规划我的入门之路总结 本文概述 这是一篇关于想要踏进嵌入式技术之路与相关职业规划的建议性文档,文中观点仅限于个人对于嵌入式…

嵌入式软件工程师面试必备技能

随着当前信息化网络技术在各行业的快速普及,嵌入式系统在技术领域呈现了前所未有的发展趋势,作为一个正在崛起的热门IT行业,人才的匮乏已经成为了嵌入式开发行业发展过程中呈现出的一种现象。据相关部门统计,我国目前嵌入式软件工…

电子通信、嵌入式工程师的面试指南

作者:火哥 授权转载自公众号嵌入式老鸟的职场之道(id:ict_embedded),火哥也是我们的校园代理 火哥自从校招找工作到现在,面试过不下50家公司,拿到过不少于30个offer。虽然不能说百战百胜,但是也还算有着较…

嵌入式软件工程师培训:提升技能、实现卓越

如果您对嵌入式培训感兴趣,以下是一些建议和关键点,可以帮助您进行嵌入式培训: 培训目标:明确确定您的嵌入式培训目标。是为了提升员工的技能水平,使他们能够承担更高级别的嵌入式开发工作,还是为了向非嵌入…

嵌入式工程师常用的软件工具推荐

前言:常言道:工欲善其事,必先利其器。作为一名合格的嵌入式工程师,日常可能需要接触和处理各种奇奇怪怪的问题,这时候一款高适配性的工具将会令工作效率大大提升。作者根据个人的实际使用情况与粉丝的客观感受&#xf…

软考中级-嵌入式系统设计师(一)

第一章 硬件基础 1、嵌入式微处理器结构 ARM采用哈佛结构,是一种RISC体系结构的微处理器。 DSP(数字信号处理技术)采用哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的指令,可以用…

嵌入式软件工程师学习路线图

人们去学习嵌入式的话,最后也是想成为嵌入式软件工程师的,这对于学习嵌入式学员来说还是有些难度的,所以这回小编就给大家介绍下嵌入式软件工程师学习路线图吧。 点击获取1V1嵌入式学习规划,现在还送100G精选学习资料。&#xff0…

嵌入式工程师的『2022 || 2023』

因为一些个人关系,2022年初我从北京回到了石家庄。在找工作,包括后续的研发工作中,不同地点的经历在对比中我逐渐总结出了一些经验。关于“人”方面的感悟我就不赘述了,下面主要在这里总结一些找工作,做工作的经验&…

嵌入式工程师必备开发工具

其实入行也有2年了,这两年用到了不少的开发工具,我猜大家很多也都用到过。这里主要是讲一下用到那些工具,安装自己去找教程吧!毕竟安装这些软件可比开发容易多了! 1.KEIL5 嵌入式产品开发写代码用到的工具。STM32相关…

送5本新出版《趣学算法(第2版)》

文末赠书 学大家在学习算法时遇到的各种困难:看不懂、题目刷了忘然后忘了刷、大部头算法书啃不动。甚至不少人学算法都开始怀疑自己是不是太笨不适合编程了…… 如何轻松学算法? 今天给大家推荐一本《趣学算法(第2版)》。这本书第…

Python趣味代码整合之提升学生编程兴趣

这篇文章主要是整合一些趣味代码,一方面自己对这些内容比较感兴趣,另一方面希望这些代码能提升学生的编程兴趣,其主旨是代码能在我的电脑上运行并有些趣味。 参考资料: 知乎 - 可以用 Python 编程…

趣学算法第二次

14天阅读挑战赛一、一棋盘的麦子 计算一棋盘的麦子&#xff0c;python代码如下&#xff1a; import matplotlib.pyplot as plt s[] def cal(n):sum0i0while i<n:sumsumpow(2,i)i1s.append(sum)return s nint(input("请输入一个数&#xff1a;")) xrange(n1) for …

《趣学算法》阅读笔记(二)

14天阅读挑战赛 话不多说&#xff0c;我们接着上篇文章《趣学算法》阅读笔记&#xff08;一&#xff09;&#xff0c;继续总结学习 1. 第一章 算法之美 1.3 哥德巴赫猜想的证明 哥德巴赫猜想&#xff1a;任一大于2的偶数&#xff0c;都可表示成两个素数之和。 验证&#xff1…

趣学python编程答案_《趣学Python编程》习题总结

上周买了本书叫《趣学Python编程》&#xff08;英文名&#xff1a;Python for kids&#xff09;&#xff0c;昨天看完后把书后面的题都做了下。由于第1、2章没有习题&#xff0c;第13章及之后都是描写实例的章节&#xff0c;因此这个总结性的文章中只包含了第3-12章的习题答案。…

小鹅通课程下载(一)

【需求】 花钱买了小鹅通付费课程&#xff0c;想要下载到本地观看或者存档&#xff1f; 【问题】 直接下载视频会有aes-256加密&#xff0c;要自己通过m3u8找密钥用openssl解码 【解决方案】 &#xff08;仅用于windows系统&#xff09; 小鹅通exe运行工具&#xff0c;双击打…

GPT4官方联网功能和插件功能

chatgpt免费入口 http://chat.xutongbao.top https://mbd.baidu.com/newspage/data/landingsuper?context%7B%22nid%22%3A%22news_9764161741531547244%22%7D&n_type-1&p_from-1

mac微信备份位置macos手机微信备份的文件迁移走

mac微信备份位置 如果你没有更改过mac版微信的备份文件夹的位置的话&#xff0c;那么mac版微信备份的聊天记录被保存在电脑的【/User/用户/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/】 一个叫【Backup】的文件夹当…