vue双向绑定之(一)vue是如何知道数据发生变化的

11 篇文章 0 订阅
4 篇文章 0 订阅

vue最大的特点之一就是数据驱动视图。

一个页面的数据是支撑页面变成一个活页面的基础。
页面中数据变化的原因,可能是由于用户操作或者后端数据的变化引起的,数据data的变化,导致页面模板也随之变化。今天来说一下vue是如何知道数据变化了的。

开门见山,vue监听数据变化其实是用了js自带的标准内置对象 Object 中的一个静态方法 defineProperty

Object.defineProperty
依据vue源码路径:项目中uve源码文件node_modules/vue/src/core/observer/index.js

源码太复杂,我附上我理解的简化过的代码:

监听一个属性时:
const data = {}
let housePriceVal = 180
Object.defineProperty(data, 'price', {
  enumerable: true,
  configurable: true,
  get () {
    console.log('price属性被读取了')
    return housePriceVal
  },
  set (newVal) {
    console.log('price属性被修改了')
    housePriceVal = newVal
  }
})
setTimeout(() => {
  const price = data.price
  console.log('price', price)
}, 500)

setTimeout(() => {
  data.price = 200
}, 1000)

在node上运行的结果是:

price属性被读取了
price 180
price属性被修改了
模拟vue监听data下的多个属性:
const data = {
  price: 180,
  age: 70
}
const observer = function () {
  for (const key in data) {
    // 重新定义各个属性,监听起来
    defineReactive(data, key, data[key])
  }
}

const defineReactive = (data, key, value) => {
  Object.defineProperty(data, key, {
    enumerable: true,
    configurable: true,
    get () {
      console.log(`${key}属性被读取了`)
      return value
    },
    set (newVal) {
      console.log(`${key}属性被修改了`)
      value = newVal
      // 监听到被修改了可以做各种操作
    }
  })
}

setTimeout(() => {
  console.log('price:', data.price)
}, 500)

setTimeout(() => {
  data.price = 200
  console.log('price:', data.price)
}, 1000)
observer()


setTimeout(() => {
  console.log('price:', data.price)
}, 500)

setTimeout(() => {
  data.price = 200
  console.log('price:', data.price)
}, 1000)
observer()

node 运行的结果:

price属性被读取了
price: 180
price属性被修改了
price属性被读取了
price: 200
  • 所以数据就是这样变得可观测的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值