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中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
vue $router和$route的区别详解
Dec 02 Vue.js
Vue——前端生成二维码的示例
Dec 19 Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
vue中watch的用法汇总
Dec 28 Vue.js
Vuex实现简单购物车
Jan 10 Vue.js
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
vue3引入highlight.js进行代码高亮的方法实例
Apr 08 Vue.js
vue 数字翻牌器动态加载数据
Apr 20 Vue.js
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
vue+django实现下载文件的示例
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
You might like
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
php中stream(流)的用法
2014/03/25 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
2015/05/12 PHP
PHP里的单例类写法实例
2015/06/25 PHP
YII框架中搜索分页jQuery写法详解
2016/12/19 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
Python while循环使用else语句代码实例
2020/02/07 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
2020/08/02 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
卫校护理专业毕业生求职信
2013/11/26 职场文书
销售总经理岗位职责
2014/03/15 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
校庆筹备方案
2014/03/30 职场文书
森林防火宣传标语
2014/06/27 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
2015年教师业务工作总结
2015/05/26 职场文书
党纪处分决定书
2015/06/24 职场文书
大学学生会竞选稿
2015/11/19 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript
python基础之函数的定义和调用
2021/10/24 Python