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自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
Vue Elenent实现表格相同数据列合并
Nov 30 Vue.js
Vue 组件注册全解析
Dec 17 Vue.js
vue穿梭框实现上下移动
Jan 29 Vue.js
vue中h5端打开app(判断是安卓还是苹果)
Feb 26 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
Vue+TypeScript中处理computed方式
Apr 02 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 Vue.js
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
vue+django实现下载文件的示例
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
You might like
Sony CFR 320 修复改造
2020/03/14 无线电
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
Javascript改变CSS样式(局部和全局)
2013/12/18 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
js获取ip和地区
2017/03/10 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
Angular网络请求的封装方法
2018/05/22 Javascript
axios 封装上传文件的请求方法
2018/09/26 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
python中实现迭代器(iterator)的方法示例
2017/01/19 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
Python的缺点和劣势分析
2019/11/19 Python
python实现飞船大战
2020/04/24 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
医院后勤自我鉴定
2013/10/13 职场文书
毕业生就业协议书
2014/04/11 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
奖学金申请个人主要事迹材料
2015/11/04 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL