首页 > 其他分享 >记一次vue数据异步刷新引发的bug

记一次vue数据异步刷新引发的bug

时间:2024-08-23 09:26:25浏览次数:9  
标签:vue true 异步刷新 信号量 赋值 x1 useform bug 页面

问题背景

在开发过程中,为了threejs对象在watch监听中能够被顺利取到,我加了一个信号量,在初始化对象后,通过threejs对象状态和表单状态来重新渲染画面。然而,我把threejs对象从null设置为正常的对象时,页面居然卡死了。在实际的代码中,用到对象的情况只有wacth里面监听到信号量为true时。什么都没改,只是把之前的对象赋值页面就没有了

///页面逻辑
let _self = this;
_self.form.x1 = 45;
_self.threejsObj = threejsObj;
_self.useform = true;

///监听逻辑
wacth:
	"form.x1":handler:function(newVal,olval){
		if(this.useform){
			///对threejs对象进行操作,并操作画面
		}
	}

排查过程

  1. 第一步,把threejs对象还是设置为null,页面可以正常渲染了
  2. 第二步,我判断可能是有绑定的数据有问题,我注释了信号量useform,页面也能正常了
  3. 第三步,我恢复了对象和信号量,去掉了wacth,页面正常了
  4. 第四步,我加上了日志,看wacth的触发顺序,发现 虽然this.useform在 x1后面赋值但是触发的时候还是true

这样问题就简单了,变量是按顺序赋值的,watch里面也是顺序操作的,可是,数据真正赋值的顺序似乎不对。

问题简单抽象

下面把问题简单描述:
表单里面有x1,x2,y1,y2 同时有useform信号量判断表单是否可用,;在vue的监听里面写如下代码

wacth:
    'x1': handler:function(newVal, oldVal){
		if(this.useform){
			do something;
		}
	}

在页面逻辑中这样写:

	this.x1 = 1;
	this.form = true;

发现在给x1赋值的时候,就触发了,并且debugger输出。this.form已经是true,这就奇怪了。
我在这里描述的很简单,实际的代码是很复杂的,表单和页面里面还嵌入了threejs等一系列的变量,这引发了严重的bug.

问题解决

为了确保顺序,我这样加上了代码,给信号量赋值的时候加上nextTick,通过debugger,watch触发逻辑已经正常,页面可以正常渲染了。

this.form.x1 = 45;
this.$nextTick(()=>{this.useform=true})

问题本质

Vue.js框架里面 data绑定的数据,赋值逻辑实际上异步的。也就是说 this.form.x1 = 45; this.useform = true; 在Vue内部看来的顺序,是不一定的。造成情况的原因在于 Vue的双向绑定,data变了dom也要变,实际上Vue在处理的时候是当成队列来处理的。

后记

那么知道了这样的情况,我们在写代码的时候,就要注意了。
1.如果data双向绑定赋值的的顺序,对业务有影响,操作要小心。利用好nextTick;
2.有些数据比如上文的useform如果不参与dom渲染,其实可以不放在data里面

标签:vue,true,异步刷新,信号量,赋值,x1,useform,bug,页面
From: https://www.cnblogs.com/lovefoolself/p/18375246

相关文章

  • 十五分钟两百行代码,手写一个vue项目全局通用的弹框
    前言:我们在写vue项目时,弹框是非常常用的组件,并且在同一个项目中,弹框大多类似。所以我们可以抽离封装出一个通用的弹框;因为vue3可向下兼容,所以作者这边会使用vue2的写法,vue3写法大同小异。第一步:新建相关文件一般来说是在src/components/dialog下新建如下两个文件:index.vue:该......
  • Vue Router 返回后记住滚动条位置的实现方法
    要在VueRouter中实现返回时记住滚动条位置的功能,可以利用VueRouter提供的scrollBehavior函数。这允许在导航时控制页面的滚动行为,包括返回之前访问的页面时恢复到之前的滚动位置。实现方法以下是一个示例,展示如何在Vue3中使用scrollBehavior实现返回时记住滚动条位......
  • java+vue计算机毕设美食(风情)展示系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着全球化和互联网的飞速发展,人们对美食的追求已不再局限于地域限制,而是跨越国界,渴望体验不同文化背景下的风味佳肴。美食不仅是味蕾的享受,更是文化......
  • java+vue计算机毕设快递驿站管理系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展,快递行业迎来了前所未有的增长高峰。每天数以亿计的包裹在各大城市间流转,快递驿站作为连接快递公司与用户的最后一公里服务节......
  • java+vue计算机毕设基于微信小程序英语在线考试系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,智能手机已成为人们日常生活中不可或缺的一部分,尤其在教育领域,移动学习因其便捷性、灵活性和高效性正逐步成为学习的新......
  • 047、Vue3+TypeScript基础,pinia库store的组合式写法
    01、main.js代码如下:<template><divclass="app"><h2class="title">App.Vue</h2><!--<Page1/>--><br><Page2/></div></template><scriptlang="ts......
  • 045、Vue3+TypeScript基础,pinia库中使用$subscribe订阅数据变动
    01、main.js代码如下://引入createApp用于创建Vue实例import{createApp}from'vue'//引入App.vue根组件importAppfrom'./App.vue'//第一步:引入piniaimport{createPinia}from'pinia'constapp=createApp(App);//第二步:创建pinia实例constpinia=......
  • uni-app Vue3项目引入Tailwind CSS
    前情TailwindCSS是一个原子类CSS框架,它将基础的CSS全部拆分为原子级别,同时还补全各种浏览器模式前缀,兼容性也不错。它的工作原理是扫描所有HTML文件、JavaScript组件以及任何模板中的CSS类名,然后生成相应的样式代码并写入到一个静态CSS文件中。TailwindCSS快速、......
  • 基于nodejs+vue在线学习行为的学生课程预警研究与实现[程序+论文+开题]-计算机毕业设
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,在线教育已成为教育领域不可或缺的一部分,它打破了传统教育的时空限制,为广大学生提供了更加灵活多样的学习途径。然而,在线学习环境的......
  • 基于nodejs+vue血库管理系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码毕设程序文件开题报告内容研究背景在医疗体系中,血液作为拯救生命的重要资源,其管理与调配的高效性直接关系到患者救治的成功率与生命安全。随着医疗技术的不断进步和临床需求的日益增长,传统的人工......