Vue.observable源码解读(by实例)

9 篇文章 2 订阅

Vue.observable

官方文档:https://cn.vuejs.org/v2/api/#Vue-observable

实例:Vue.observable

<body>
    <div id="root">
      {{message}}
      <button @click="change">Change</button>
    </div>
    <script>
      const state = Vue.observable({ message: 'Vue 2.6' })
      const mutation = {
        setMessage(value) {
          state.message = value
        }
      }
      new Vue({
        el: '#root',
        computed: {
          message() {
            return state.message
          }
        },
        methods: {
          change() {
            mutation.setMessage('Vue 3.0')
          }
        }
      })
    </script>
  </body>

官方解释:

Vue.observable(object) 是vue2.6版本新增的全局API,它可以让一个对象可响应。Vue 内部会用它来处理 data 函数返回的对象。
返回的对象可以直接用于渲染函数和计算属性内,并且会在发生改变时触发相应的更新。也可以作为最小化的跨组件状态存储器,用于简单的场景

在 Vue 2.x 中,被传入的对象会直接被 Vue.observable 改变;在 Vue 3.x 中,则会返回一个可响应的代理,而对源对象直接进行修改仍然是不可响应的。因此,为了向前兼容,官方推荐始终操作使用 Vue.observable 返回的对象,而不是传入源对象。

通俗来说,Vue.observable在简单场景下可以代替vuex

本示例中Vue.observable执行流程:

  • 首先initGlobalAPI (vue.js:5406)
  • 执行Vue.observable内容
// 2.6 explicit observable API
Vue.observable = function (obj) {
  observe(obj);
  return obj
};
  • vue初始化
  • 使用计算属性将state.message渲染到页面
  • 点击按钮
  • 执行change()
  • 执行setMessage(),修改state.message的值
  • 使用计算属性将新的state.message值渲染到页面

可以看出Vue.observable实际就是封装了observe:
在这里插入图片描述

  • 首先判断是否包含__ob__这个属性
  • 实例化一个Observer对象:
    在这里插入图片描述
  • 由于本实例中传入的不是数组,进入walk()
  • 在walk中遍历key,并使用defineReactive$$1创建响应式对象
    在这里插入图片描述

Walk through all properties and convert them into getter/setters. This method should only be called when value type is Object.
遍历所有属性并将它们转换为getter/setter。仅当值类型为Object时才应调用此方法。

  • 通过property.get进行取值,通过property.set进行赋值
    在这里插入图片描述
  • 接下来调用Object.defineProperty()给对象定义响应式属性(Object.defineProperty是vue.js实现「响应式系统」的关键之一)
    • enumerable,属性是否可枚举,默认 false。
    • configurable,属性是否可以被修改或者删除,默认 false。
    • get,获取属性的方法。(进行依赖收集)(数据劫持)
    • set,设置属性的方法。(进行响应式更新)
      在这里插入图片描述
  • dep.notify():通过dep.notify()对观察者watchers进行通知
  • 然后state就成全局响应式对象了,

拓展:

思想来源:观察者模式 vs 发布订阅模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序边界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值