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

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

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

根据 target 类型适配不同的 handler,如果是集合 ( Map、Set )就使用 collectionHandlers,是其他类型就使用 baseHandlers。接下来看看 collectionHandlers

  1. export const mutableCollectionHandlers: ProxyHandler<any> = { 
  2.   get: createInstrumentationGetter(mutableInstrumentations) 
  3. export const readonlyCollectionHandlers: ProxyHandler<any> = { 
  4.   get: createInstrumentationGetter(readonlyInstrumentations) 

没有意外只有 get,骚就骚在这儿:

  1. // 可变数据插桩对象,以及一系列相应的插桩方法 
  2. const mutableInstrumentations: any = { 
  3.   get(key: any) { 
  4.     return get(this, key, toReactive) 
  5.   }, 
  6.   get size() { 
  7.     return size(this) 
  8.   }, 
  9.   has, 
  10.   add, 
  11.   set, 
  12.   delete: deleteEntry, 
  13.   clear, 
  14.   forEach: createForEach(false) 
  15. // 迭代器相关的方法 
  16. const iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator] 
  17. iteratorMethods.forEach(method => { 
  18.   mutableInstrumentations[method] = createIterableMethod(method, false) 
  19.   readonlyInstrumentations[method] = createIterableMethod(method, true) 
  20. }) 
  21. // 创建getter的函数 
  22. function createInstrumentationGetter(instrumentations: any) { 
  23.   return function getInstrumented( 
  24.     target: any, 
  25.     key: string | symbol, 
  26.     receiver: any 
  27.   ) { 
  28.     target = 
  29.       hasOwn(instrumentations, key) && key in target ? instrumentations : target 
  30.     return Reflect.get(target, key, receiver) 
  31.   } 

由于 Proxy 的 traps 跟 Map|Set 集合的原生方法不一致,因此无法通过 Proxy 劫持 set,所以作者在在这里进行了"偷梁换柱",这里新创建了一个和集合对象具有相同属性和方法的普通对象,在集合对象 get 操作时将 target 对象换成新创建的普通对象。这样,当调用 get 操作时 Reflect 反射到这个新对象上,当调用 set 方法时就直接调用新对象上可以触发响应的方法,是不是很巧妙?所以多看源码好处多多,可以多学学人家的骚操作。

IE 怎么办?

这是个实在不想提但又绕不开的话题,IE 在前端开发者眼里和魔鬼没什么区别。在 Vue3.0 之前,响应式数据的实现是依赖 ES5 的 Object.defineProperty,因此只要支持 ES5 的浏览器都支持 Vue,也就是说 Vue2.x 能支持到 IE9。Vue3.0 依赖的是 Proxy 和 Reflect 这一对出生新时代的 CP,且无法被转译成 ES5,或者通过 Polyfill 提供兼容,这就尴尬了。开发者技术前线获悉的信息,官方在发布最终版本之前会做到兼容 IE11,至于更低版本的 IE 那就只有送上一曲凉凉了。

其实也不用太纠结IE的问题,因为连微软自己都已经放弃治疗 IE 拥抱 Chromium 了,我们又何必纠结呢?

结语

在使用开源框架时不要忘了,我们之所以能免费试用他,靠的维护者投入的大量精力。希望我们多去发现它带来的优点和作者想通过它传递的编程思想。最后期待 Vue3.0 正式版本的早日到来。

(编辑:核心网)

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

热点阅读