【vue】如何改写数组的方法使其成为响应式?

vue2是怎么进行数组的方法重写的?


在vue2的响应式中,数组的一些方法是无法实现响应式,需要进行重写,如何实现的呢??

在Vue中,对响应式处理利用的是Object.defineProperty对数据进行拦截,vue没有对数组进行响应式处理,例如数组内部变化、数组长度变化、数组的截取变化等等,对这些操作进行hack,让vue能够监听到其中变化

  • push()、pop()、shift()、unshift()、splice()、sort()、reverse()

如何实现

那Vue是如何实现让这些数组方法实现元素的实时更新的呢,下面是Vue中对这些方法的封装:

//缓存数组原型
const arrayProto = Array.prototype;

//实现arrayMethods.__proto__ == Array.prototye
export const arrayMethods = Object.create(arrayProto);

//需要进行功能扩展的方法
const methodsToPatch = [
  "push",
  "pop",
  "shift",
  "unshift",
  "splice",
  "sort",
  "reverse"
];

//intercept mutating methods and emit events

methodsToPatch.forEach(function(method){
  const original = arrayProto[method];
  def(arrayMethods,method,function mutator(...args){
    //执行并缓存原生数组的功能
    const result = original.apply(this,args);
    //响应式处理
    const ob = this.__ob__;
    let inserted;
    switch(method){
      //push,unshift会增加新的索引,要手动obsever
      case "push":
      case "unshift":
        inserted = args;
        break;
      case "splice":
        inserted = args.slice(2);
        break;
    }

    if(inserted) ob.observerArray(inserted);
    ob.dep.notify();
    return result;
  })
})

简单来说就是,重写了数组中的那些原生方法,首先获取到这个数组的__ob__,也就是它的Observer对象,如果有新的值,就调用observeArray继续对新的值观察变化(也就是通过target__proto__ == arrayMethods来改变了数组实例的型),然后手动调用notify,通知渲染watcher,执行update。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值