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 相关文章推荐
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
Dec 02 Vue.js
VUE中鼠标滚轮使div左右滚动的方法详解
Dec 14 Vue.js
vue实现验证用户名是否可用
Jan 20 Vue.js
Vue实现摇一摇功能(兼容ios13.3以上)
Jan 26 Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 Vue.js
Vite和Vue CLI的优劣
Jan 30 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
开发一个封装iframe的vue组件
Mar 29 Vue.js
Vue通过懒加载提升页面响应速度
May 10 Vue.js
前端vue+express实现文件的上传下载示例
Feb 18 Vue.js
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
vue递归实现树形组件
Jul 15 Vue.js
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
vue+django实现下载文件的示例
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
You might like
层叠菜单的动态生成
2006/10/09 PHP
解析curl提交GET,POST,Cookie的简单方法
2013/06/29 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
2018/09/19 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
python杀死一个线程的方法
2015/09/06 Python
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
使用Python从有道词典网页获取单词翻译
2016/07/03 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
2019/08/08 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
pygame实现贪吃蛇游戏(下)
2019/10/29 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
Python 去除字符串中指定字符串
2020/03/05 Python
生产班组长岗位职责
2014/01/05 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
学校周年庆活动方案
2014/08/22 职场文书
2014年教研工作总结
2014/12/06 职场文书
2015年大学生入党自荐书
2015/03/24 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python