vue中data改变后让视图同步更新的方法


Posted in Vue.js onMarch 29, 2021

前言

不久前天看到一个比较有趣的问题,vue中data改变后,如何让视图同步更新,搜索了一下,并没有发现解决问题的方法,只能从源码去找解决方法了。

原因

我们都知道,在vue中改变数据后,视图并不是同步更新的。

在vue实例初始化后,会将data设置为响应式对象,当我们执行this.xxx = 1时,会触发这个响应式对象的setter。在setter中,会触发更新,通知所有订阅了xxx的订阅者。但是这个触发更新并不是同步的,它会将所有的watcher都添加到一个队列,并在nextTick之后去更新视图。

这就是vue不能同步更新视图的原因。

解决方法

知道了原因,总能找到解决方法。

既然是在nextTick的时候去更新视图,这个时候,必然会去执行一个更新视图的方法,那么我们手动在数据改变的时候去执行这个方法,就达到了同步更新视图的目的。

在了解源码后,我们可以发现执行的是watcher.run()这个方法,那么问题来了,怎么去获取这个方法?

想快速了解这一块建议阅读 Vue.js技术揭秘

我们在控制台打印一下this

vue中data改变后让视图同步更新的方法

可以在_watcher这个对象的原型上找到run这个方法,因此问题就解决了。

this.xxx = 1;
this._watcher.run()

执行以上代码,在更新完数据后,手动更新视图,就可以做到同步的效果。

更好的解决方法

如果每次想要视图同步更新都要加一句 this._watcher.run() ,那岂不是太麻烦了,因此,我写了一个插件,支持this.xxx = 1 之后就同步更新视图。

这个插件原理很简单,就是在组件的options里边加了一个选项syncData,跟data是类似的,然后放入data里面,created钩子调用的时候重新劫持这部分数据,syncData里边数据改变的时候,自动触发_watch.run(),从而同步更新视图。

插件地址:GitHub地址

后记

讲道理我觉得这个插件并没有什么卵用,理论上这个插件能解决的问题$nextTick都可以解决。

Vue.js 相关文章推荐
Vue如何实现验证码输入交互
Dec 07 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 Vue.js
vue+echarts实现中国地图流动效果(步骤详解)
Jan 27 Vue.js
基于vue的video播放器的实现示例
Feb 19 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
vue基于Teleport实现Modal组件
May 31 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
vue ref如何获取子组件属性值
Mar 31 Vue.js
如何优化vue打包文件过大
Apr 13 Vue.js
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
vue项目proxyTable配置和部署服务器
Apr 14 Vue.js
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
vue+django实现下载文件的示例
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
You might like
php自动跳转中英文页面
2008/07/29 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
js下用eval生成JSON对象
2010/09/17 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
js表头排序实现方法
2015/01/16 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
原生JS实现无缝轮播图片
2020/06/24 Javascript
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
Python解惑之True和False详解
2017/04/24 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
Django实现学生管理系统
2019/02/26 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
大二自我鉴定范文
2013/10/05 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
企业节能减排实施方案
2014/03/19 职场文书
学校教代会开幕词
2016/03/04 职场文书
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL