vuex的实现的底层原理

1.vuex原理

        (1)实现一个受保护的state

                通过new去初始化一个vue实例,利用vue中的data是响应式的。在data中定义$$state(不会被代理)属性,值就是传递state对象,然后通过访问get的方式去访问state。在get中返回的值式:this._vm._data.$$state

        

  this._vm = new Vue({
    data: {
      // 在一个属性前面加上两个$, 那么这个属性是不被代理的
      $$state: options.state
    }
  })

  // 通过访问器的方式来访问state
  get state() {
    return this._vm._data.$$state
  }

                (2)实现单项数据流

                定义commit方法和dispatch方法,这两个方法都分别接受两个参数type(传递的数据类型)和payload(载荷信息),获取到mutations和actions这两个选项。然后分别在commit和dispatch方法中通过type属性获取到函数并执行。commit中的函数执行的时候需要传递state和payload作为参数;dispatch中的函数在执行的时候需要传递store作为参数

 commit(type, payload) {
    const entry = options.mutations[type]
    entry && entry(state, payload)
  }
  dispatch(type, payload) {
    const entry = options.actions[type]
    entry && entry(store, payload)
  }

                (3)getters的实现

                        getters的实现借助了vue中的computed属性。遍历getters中的所有key,并在computed中通过key声明一个无参函数,并返回一个带有参数的state的函数(这个函数就是定义在getters中的函数),然后通过object.defineproperty一个getters对象。只提供get方法。在get方法中返回计算属性computed的结果

const computed = {};
 const getters = {}
 Object.keys(options.getters).forEach(key => {
   const fn = options.getters(key);
   computed[key] = function() {
     return fn(state)
   }
 })
 Object.defineProperty(getters, key, {
   // 定义get方式即可
   get() {

   }
 })
 new Vue({
   computed: 
 })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

筱闯~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值