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

本文共 1733 字,大约阅读时间需要 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

本文来源: 如需转载请联系原作者

你可能感兴趣的文章
red gate | sql CI
查看>>
blend
查看>>
[UOJ409]Highway Tolls
查看>>
[CF414E]Mashmokh's Designed Problem
查看>>
OpenSSL中关于RSA_new和RSA_free的内存泄漏
查看>>
c#中获取服务器IP,客户端IP以及Request.ServerVariables详细说明
查看>>
Centos6.5快速配置可用网卡
查看>>
mvc框架模式
查看>>
vc 串口精灵软件分析
查看>>
C#结构体和字节数组的转换
查看>>
使用Node.js搭建静态资源服务器
查看>>
bluetooth service uuid
查看>>
Android组件安全
查看>>
DOM节点属性
查看>>
Eclipse对printf()不能输出到控制台的解决方法
查看>>
【转】Open Live Writer 插件更新
查看>>
Spring Security验证流程剖析及自定义验证方法
查看>>
单链表的创建,查找,删除,插入。
查看>>
Java知识积累——Properties类的使用示例
查看>>
转:分布式ID生成方法
查看>>