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 相关文章推荐
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
vue使用exif获取图片经纬度的示例代码
Dec 11 Vue.js
详解vue中使用transition和animation的实例代码
Dec 12 Vue.js
vue监听滚动事件的方法
Dec 21 Vue.js
Vue3 实现双盒子定位Overlay的示例
Dec 22 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
vue实现按钮切换图片
Jan 20 Vue.js
如何管理Vue中的缓存页面
Feb 06 Vue.js
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 Vue.js
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
vue3不同环境下实现配置代理
May 25 Vue.js
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
vue+django实现下载文件的示例
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
You might like
php格式化工具Beautify PHP小小BUG
2008/04/24 PHP
常用的php对象类型判断
2008/08/27 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
JS option location 页面跳转实现代码
2008/12/27 Javascript
有趣的javascript数组定义方法
2010/09/10 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
python获取糗百图片代码实例
2013/12/18 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
python微信公众号之关键词自动回复
2018/06/15 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
python实现三壶谜题的示例详解
2020/11/02 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
前台接待岗位职责
2013/12/03 职场文书
法律专业实习鉴定
2013/12/22 职场文书
家长给孩子的评语
2014/01/30 职场文书
运动会入场式解说词
2014/02/18 职场文书
《白鹅》教学反思
2014/04/13 职场文书
一体化教学实施方案
2014/05/10 职场文书