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单元格多列合并的实现
Nov 26 Vue.js
对vue生命周期的深入理解
Dec 03 Vue.js
vue使用exif获取图片经纬度的示例代码
Dec 11 Vue.js
vue的hash值原理也是table切换实例代码
Dec 14 Vue.js
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 Vue.js
Vuex实现简单购物车
Jan 10 Vue.js
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 Vue.js
Vue项目打包部署到apache服务器的方法步骤
Feb 01 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
vue+echarts实现多条折线图
Mar 21 Vue.js
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
vue+django实现下载文件的示例
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
You might like
php中拷贝构造函数、赋值运算符重载
2012/07/25 PHP
php中in_array函数用法探究
2014/11/25 PHP
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
codeMirror插件使用讲解
2017/01/16 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
node.js调用C++函数的方法示例
2018/09/21 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
Python中用Spark模块的使用教程
2015/04/13 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
Django中间件实现拦截器的方法
2018/06/01 Python
Python 查看list中是否含有某元素的方法
2018/06/27 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
Python实现汇率转换操作
2020/05/03 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
德国网上花店:Valentins
2018/08/15 全球购物
汽车维修工岗位职责
2014/02/12 职场文书
加强作风建设工作总结
2014/10/23 职场文书
2016年社区文体活动总结
2016/04/06 职场文书