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+vant实现购物车全选和反选功能
Nov 17 Vue.js
ESLint 是如何检查 .vue 文件的
Nov 30 Vue.js
Vue实现简单购物车功能
Dec 13 Vue.js
vue中如何添加百度统计代码
Dec 19 Vue.js
Vue组件简易模拟实现购物车
Dec 21 Vue.js
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
Vue实现下拉加载更多
May 09 Vue.js
Vue h函数的使用详解
Feb 18 Vue.js
Vue的列表之渲染,排序,过滤详解
Feb 24 Vue.js
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
vue+django实现下载文件的示例
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
You might like
中国第一家无线电行
2021/03/01 无线电
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
全文搜索和替换
2006/10/09 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
图解js图片轮播效果
2015/12/20 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
Vuex中的State使用介绍
2019/01/19 Javascript
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
100%羊绒:NakedCashmere
2020/08/26 全球购物
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
什么是事务?事务有哪些性质?
2012/03/11 面试题
运动会广播稿100字
2014/01/11 职场文书
物流创业计划书
2014/02/01 职场文书
《狼和小羊》教学反思
2014/04/20 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
员工生日活动方案
2014/08/24 职场文书
个人贷款收入证明
2014/10/26 职场文书
2014年环保局工作总结
2014/12/11 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
2015年服务员工作总结
2015/04/08 职场文书
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS