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+iview实现分页及查询功能
Nov 17 Vue.js
Vue如何循环提取对象数组中的值
Nov 18 Vue.js
vue 通过base64实现图片下载功能
Dec 19 Vue.js
Vue实现多页签组件
Jan 14 Vue.js
Vue实现圆环进度条的示例
Feb 06 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
Vue多选列表组件深入详解
Mar 02 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
vue引入Excel表格插件的方法
Apr 28 Vue.js
vue-element-admin项目导入和导出的实现
May 21 Vue.js
vue中利用mqtt服务端实现即时通讯的步骤记录
Jul 01 Vue.js
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
vue+django实现下载文件的示例
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
You might like
使用数据库保存session的方法
2006/10/09 PHP
php常用的安全过滤函数集锦
2014/10/09 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
JavaScript Chart 插件整理
2010/06/18 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
详解vue跨组件通信的几种方法
2017/06/15 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
django实现前后台交互实例
2017/08/07 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
pytorch masked_fill报错的解决
2020/02/18 Python
python如何使用代码运行助手
2020/07/03 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
HTTP状态码详解
2021/03/18 杂记
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
宝宝周岁宴答谢词
2014/01/26 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
pytorch中的numel函数用法说明
2021/05/13 Python
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android