加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

茶余饭后聊聊 Vue3.0 相应式数据那些事儿

发布时间:2019-11-01 06:58:24 所属栏目:建站 来源:佚名
导读:别再更新了,其实是学不动了这句话道出了几多前端开拓者的心声,不幸的是 Vue 的作者在国庆区间宣布了 Vue3.0 的 pre-Aplha 版本,这意味着 Vue3.0 将近和我们晤面了。既来之则安之,扶我起来我要开始讲了。Vue3.0 为了到达更快、更

Vue2.x 中被各人吐槽的最多的一点就是针对数组只实现了 push,pop,shift,unshift,splice,sort,reverse' 这七个要领的监听,早年通过数组下标改变值的时辰,是不能触发视图更新的。这里插一个题外话,许多人以为 Vue2.x 中数组不能实现全方位监听是 Object.defineProperty 不能监听数组下标的改变,这可就冤枉人家了,人家也能侦听数组下标变革的好吗,不信你看

  1. const arr = ["2019","云","栖","音","乐","节"]; 
  2. arr.forEach((val,index)=>{ 
  3.     Object.defineProperty(arr,index,{ 
  4.         set(newVal){ 
  5.             console.log("赋值"); 
  6.         }, 
  7.         get(){ 
  8.             console.log("取值"); 
  9.             return val; 
  10.         } 
  11.     }) 
  12. }) 
  13. let index = arr[1]; 
  14. //取值 
  15. arr[0] = "2050"; 
  16. //赋值 

没短处,统统变革都在人家的把握中。上面这段代码,有没有人没看懂,我冒充你们都不懂,贴张图

茶余饭后聊聊 Vue3.0 相应式数据那些事儿

从数组的数据布局来看,数组也是一个 Key-Value 的键值对荟萃,只是 Key 是数字而已,天然也可以通过Object.defineProperty 来实现数组的下标会见和赋值拦截了。着实 Vue2.x 没有实现数组的全方位监听首要有两方面缘故起因:

数组和平凡工具对比,JS 数组太"多变"了。好比: arr.length=0 ,可以刹时清空一个数组; arr[100]=1 又可以刹时将一个数组的长度变为 100(其他位置用空元素添补),等等骚操纵。对付一个平凡工具,我们一样平常只会改变 Key 对应的 Value 值,而不会连key都改变了,而数组就纷歧样了 Key 和 Value 都常常增进或镌汰,因此每次变革后我们都必要从头将整个数组的全部 key 递归的行使 Object.defineProperty 加上 setter 和 getter,同时我们还要穷举每一种数组变革的也许,这样势必就会带来机能开销题目,有的人会认为这点机能开销算个 x 呀,可是机能题目都是由小变大的,假如数组中存的数据量大并且操纵频仍时,这就会是一个大题目。React16.x 在就由于在优化 textNode 的时辰,移除了有时义的 span 标签,机能听说都晋升了几多个百分点,以是机能题目不行鄙视。

数组在应用中常常会被操纵,可是凡是 push,pop,shift,unshift,splice,sort,reverse 这 7 种操纵就能到达目标。因此,出于机能方面的思量 Vue2.x 做出了必然的弃取。

那么 Vue3.0 怎么又走转头路去实现了数组的全面监听了呢?谜底就是 Proxy 和 Reflet 这一对原生 CP 的呈现,Vue3.0 行使 Proxy 作为相应式数据实现的焦点,用 Proxy 返回一个署理工具,通过署理工具来网络依靠和触发更新。或许的道理像这段代码一样:

  1. const arr = ["2019","云","栖","音","乐","节"]; 
  2. let ProxyArray = new Proxy(arr,{ 
  3.     get:function(target, name, value, receiver) { 
  4.         console.log("取值") 
  5.         return Reflect.get(target,name); 
  6.     }, 
  7.     set: function(target, name, value, receiver) { 
  8.        console.log("赋值") 
  9.        Reflect.set(target,name, value, receiver);; 
  10.     } 
  11.  }) 
  12.  const index = ProxyArray[0]; 
  13.  //取值 
  14.  ProxyArray[0]="2050" 
  15.  //赋值 

结果和 Object.defineProperty 一样一样的,又显得清爽脱俗有没有?并且 Proxy 只要是工具都能署理,后头还会提到。虽然 Vue3.0 是固然有了新欢,但也没健忘旧爱,对付在之前版本中数组的几种要领的监听照旧照样支持的。

惰性监听

什么是"惰性监听"?

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读