博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue:触发视图更新的hack
阅读量:6489 次
发布时间:2019-06-24

本文共 1737 字,大约阅读时间需要 5 分钟。

前言

触发视图更新的hack,hack的是什么?hack那些数据改变却没有被vue检测到的更新!那么vue有哪些情况是检测不到数据的变动的? 官方说明的有下面两大类:

  • 数组
  1. 使用下标更新数组元素;
  2. 使用赋值方式改变数组长度;
  3. 使用下标增删数组元素;
  • 对象
  1. 对象的增删
  • 其他
  1. 比如props到子组件的原始属性 …… 具体看另外一篇文章:

正文

那么要怎么hack?!

原理也很简单~

既然vue检测不到数据的变化,那么就强制触发vue去更新!但是vue并没有提供这样的接口(我是说统一的接口,不是官方提供的解决方案),如果有提供就不叫hack了对吧!

是这样的:对于每次vue可以检测到的数据变动,vue都会重新去渲染整个视图上的变动,整个,注意是整个,并不是说,data里面那个对象或列表的数据变动了,就仅仅更新对应的视图区域,不是这样的,是整个,ok!所以可以利用这一点!

具体的做法就是: 在修改vue检测不到的数据后,再变动一下vue可以检测到的数据,比如更新一下一个随机数

实践

{
{ index === 0 ? '' : ', ' }}{
{ item }}
{
{key}}: {
{item}}
复制代码new Vue({ el: '#app', data: { useCounter: true, counter: 0, arrs: [0, 1, 2, 3, 4], items: { name: 'isaac', position: 'coder' } }, watch: { items: { deep: true, handler(val, oldVal) { console.log({ val, oldVal }); } } }, methods: { env(callback) { callback && callback(); this.useCounter && this.counter++; }, operate(order) { if(order === 'add') { this.env(() => { this.items.goodAt = 'javascript'; }); } else if(order === 'delete') { this.env(() => { delete this.items.goodAt; }); } else if(order === 'update'){ this.items.name = Math.random(); } else if(order === 'updateArrs') { this.env(() => { this.arrs[0] = Math.round(Math.random() * 100); }); } } }});

正如前言中说的几种情况,都会在之后更新一个data.counter,而data.counter则是可以检测被检测到的!

缺点

虽然这样hack确实出发了视图的更新,但是有个缺点:

  • 对应的watch是检测不到数据的变动!

所以说,最好还是使用官方提供的解决方案!

最后说一句

上面的hack是我在实践中发现的,应该在说debug的时候!因为自己清洗知道数组和对象那些情况下是触发不到视图更新的,但是某次却神奇地更新了视图!然后就开始慢慢地测试~

原文发布时间为:2018年06月25日
原文作者:issaxite
本文来源: 
如需转载请联系原作者

你可能感兴趣的文章
SAP 开源 SCA 工具,扫描软件包依赖漏洞
查看>>
嵌入式Linux学习方法——给那些彷徨者(上)
查看>>
Spark中Lambda表达式的变量作用域
查看>>
Zabbix3.4.2的agent端配置和安装
查看>>
mysql备份时候两个很有用的参数
查看>>
SpringBoot(三)_controller的使用
查看>>
LinkedBlockingQueue源码解析
查看>>
Kotlin 1.3 新特性抢先看,协程已稳定并将向后兼容
查看>>
Parat-基于kali2018的远程管理工具
查看>>
ES6(正则扩展)
查看>>
从零玩转jQuery-核心函数和静态方法
查看>>
8月3日科技联播:新型VR头盔可令盲人重获光明 ,联通阿里成立合资企业“云粒智慧”...
查看>>
Jeknins的Pipline方式构建任务
查看>>
Python全栈 项目(电子词典、协程、pdb调试)
查看>>
(周期计划-7)常用集合的源码分析:ArrayList
查看>>
“分叉并商品化”,GitLab 和 Elastic 炮轰 AWS 的开源方法
查看>>
MKVToolNix v33.0.0 发布,MKV 视频编辑工具软件
查看>>
Egg 2.19.0 发布,阿里开源的企业级 Node.js 框架
查看>>
CentOS7.4安装Gitlab10.5.1及汉化
查看>>
Virtualbox以及VWare在Win10下的不兼容
查看>>