VUE对数组的劫持操作

VUE对数组的劫持操作


大家都知道 vue的双向绑定都是用object.defineProperty操作的,但是这个方法只能监听对对象的操作,不支持数组,所以vue对数组监听用了另一种方式,就是把数组的原型上的方法进行了更改,相当于对数组操作的方法(push,pop,shift等)进行了监听。以下是对数组方法unshift举例

<div id="app"></div>
  <script type="text/javascript">
    let state = [1, 2, 3]; // 初始化数据
    let originalArray = Array.prototype; 
    let arrayMethods = Object.create(originalArray); // 创建一个数组的原型对象
    
    function defineReactive(obj) {   // 函数劫持
      arrayMethods.unshift= function(...args) {
      alert('劫持到了有人调用新修改的数组unshift方法,所以现在用户在修改array数据')
        originalArray.unshift.call(this, ...args);
        render(); // 重新渲染view
      }
      obj.__proto__ = arrayMethods;
    }
    defineReactive(state); // 调用函数劫持
  
	render(); //初始化页面时先渲染一下view,以便做对比
    function render() { // 渲染vaule
      app.innerHTML = state;
    }

    // 执行shift操作  异步修改数据 看是否监听到
    setTimeout(function(){
      state.unshift(1);
    },2000)
setTimeout(function(){
      state.unshift(2);
    },2000)
  </script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值