简单实现vue2响应式

<script>

      let data = { // 定义一个对象

        name: '张三',

        age: 18,

        info: {

          birth: '江西'

        },

        color: ['red', 'blue', 'orange']

      }

      let oldArray = Array.prototype // 拿到数组的原型对象

      let newArray = Object.create(oldArray); // 创建一个新的对象,让其原型上的一些方法为数组原型上的方法,简而言之,依据数组原型声明一个对象

      ['push', 'shift', 'unshift', 'pop', 'splice'].forEach(element => {

        newArray[element] = function() {

          console.log('更新数组视图')

          oldArray[element].call(this, ...arguments)

        }

      });

     

      observer(data) // 监听对象,让其处于响应式

      function observer(data) { // 定义监听的方法

        if(typeof !data === 'object' || data === null) { // 判断是否是对象类型的数据

          return data

        }

        if(Array.isArray(data)) { // 判断是否是数组,是数组就改变原型

          data.__proto__ = newArray

        }

        for (let key in data) {

          defineReactive(data, key, data[key])

        }

      }

      function defineReactive(data, key, value) {

        if(typeof value === 'object'){ // 判断对象的内部数据是不是对象,是就进行递归处理。

          observer(value)

        }

        Object.defineProperty(data, key, { // 通过Object.defineProperty进行数据劫持

          get () { // get进行监听读取返回原数据

            return value

          },

          set (newValue) { // set进行修改监听,赋值新数据

            if(value !== newValue){

              value = newValue

              observer(value) // 这里判断赋的新的值是不是对象类型,进行监听

              console.log('更新视图')

            }

          }

        })

      }

      data.color.unshift()

      console.log(data)

    </script>
vue给对象进行增加或者删除某元素可以通过vue.set或vue.$set(通过vue实例),vue.delete方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值