Vuex实现原理

69 阅读1分钟

1.给每个Vue实例添加$store属性

主要是通过Vue.mixin()方法,vue的全局混入方法。改动的是beforeCreate()钩子,使得每个组件实例在创建前都添加了$store属性。

注:mixin普通用法是在对象中配置mixins: [mixin]属性,使得vue实例可以用mixin对象中的data和methods等。但Vue.mixin()是全局混入,一旦使用全局混入,它将影响每一个之后创建的 Vue 实例。

2.通过new一个新的vue实例的方式,实现数据响应式

class Store {
  constructor (options) {
    // this.vm  = options.state   只是单纯获取state数据,但是数据修改不会更新界面
    /** 借用Vue的双向绑定机制让Vuex中data变化实时更新界面 */
    this.vm = new _Vue({
      data: {
        state: options.state
      }
    })
  }
/* 类的属性访问器
    访问state对象时候,就直接返回响应式的数据
    Object.defineProperty get 同理
  */
  get state () {
    return this.vm.state
  }
}

state里面的数据其实都是重新放在data属性中的,然后通过vue实例的data暴露出去,实现数据响应式的。