简单理解vue中data数据的改变影响视图

本文深入探讨Vue框架中data数据变化如何触发视图更新。通过简化虚拟DOM的渲染过程,展示了Object.defineProperty和递归在实现数据响应式中的关键作用。讲解了如何监听数据对象及子对象的变化,并分析了Object.defineProperty无法监听数组元素变动的问题。
摘要由CSDN通过智能技术生成

简单的理解vue中data数据的改变影响视图


前言

这个简化了vue虚拟dom的渲染,为了更好地理解vue中data数据的改变影响视图这句话而写的。

请熟知 Object.defineProperty和原型原型链的知识,闭包也要有所掌握

我们用到的函数

data对象变量我们需要的数据
updateViews()方法简化的渲染方法
observer()方法判断元素并且运行绑定Object.defineProperty的方法
defineReactive()方法绑定Object.defineProperty的具体操作

监听

渲染方法是固定的所以我们写在前面

updateViews方法

function updateViews () {
  console.log('数据更新了');
}

普通监听

我们首先创建一个简单的data数据,同时调用observer()方法

const data = {
    nihao: '123',
    num: 2
}

observer(data)

写入observer的方法

function observer (data) {

  for (const key in data) {
    defineReactive(data, key, data[key])
  }
}

写入defineReactive方法

function defineReactive (data, key, value) {
  Object.defineProperty(data,key,{
    get() {
      return value
    },
    set(nwevalue) {
      if (value !== nwevalue) {
        updateViews()
        value = nwevalue
      }
    }
  })
}

请结合defineReactive和observer一起观看

  • 首先我们创建了data数据并且同时调用observer(data)方法,将我们的创建的data传参传过去
  • observer()方法接收到我们的data,然后进行for循环来为我们data每个元素绑定Object.defineProperty。
  • 可以看到我们再Object.defineProperty里面的set方法中调用了, updateViews()渲染方法,这样才实现了,数据更新视图的要求。

但是现在有两个问题,如果data中的数据也是的对象,我们如何监听data对象中的对象中暑数据呢,说到了这里大家是不是想到了递归,没错我来进行代码演示

对象监听(深度监听)

data数据

const data = {
  nihao: '123',
  list: {
    nihao: '15'
  }
}

// 调用方法
observer(data)

observer的方法

function observer (data) {
  if (typeof data !== 'object' || data ===null) {
    return data;
  }

  for (const key in data) {
    defineReactive(data, key, data[key])
  }
}

defineReactive方法

function defineReactive (data, key, value) {
  // 深度监听
  observer(value)

  Object.defineProperty(data,key,{
    get() {
      return value
    },
    set(nwevalue) {
      if (value !== nwevalue) {
        updateViews()
        value = nwevalue
      }
    }
  })
}

这里我们用到了递归

  • 在observer加入了一个判断条件,如果我们传入的data他不是一个对象或者是空的,他就不用执行我们的递归了。因为根本没有必要。
  • defineReactive方法中我们运用到了递归的知识。defineReactive的递归和observer的判断,打出了一套很好的配合。

又有新的问题,我们不能监听数组元素的增删改,所以这个也是Object.defineProperty的一个弊端

数组监听

时间太晚了现在凌晨2.30了,等我更新

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值