zoukankan      html  css  js  c++  java
  • vuex原理

    vuex的设计思想借鉴了flux、redux,将数据存放到全局的store,再将store挂载到每个vue实例组件中,利用vue.js的细粒度数据响应机制来进行高效的状态更新。

    • vuex的store是如何挂载注入组件中的?

    在vue项目中安装vuex,利用Vue的插件机制使用Vue.use(vuex)时,会调用vuex的install方法,装在vuex,install方法代码

    export function install (_Vue) {
      if (Vue && _Vue === Vue) {
        if (process.env.NODE_ENV !== 'production') {
          console.error(
            '[vuex] already installed. Vue.use(Vuex) should be called only once.'
          )
        }
        return
      }
      Vue = _Vue
      applyMixin(Vue)
    }
    

    applyMixin方法使用Vue混入机制,Vue的生命周期beforeCreate钩子函数前混入vuexInit方法,核心代码如下

    Vue.mixin({ beforeCreate: vuexInit });
    
    function vuexInit () {
        const options = this.$options
        // store injection
        if (options.store) {
          this.$store = typeof options.store === 'function'
            ? options.store()
            : options.store
        } else if (options.parent && options.parent.$store) {
          this.$store = options.parent.$store
        }
    }
    

    分析源码,vuex是利用Vue的mixin混入机制,在beforeCreate钩子前混入vuexInit方法,vuexInit方法实现了store注入Vue组件实例,并注册了vuex store的引用属性$store。

    • vuex的state和getters是如何实现映射到各个组件实例中响应式更新状态?

    resetStoreVM核心方法

    function resetStoreVM (store, state, hot) {
      const oldVm = store._vm
    
      // 设置 getters 属性
      store.getters = {}
      const wrappedGetters = store._wrappedGetters
      const computed = {}
      // 遍历 wrappedGetters 属性
      forEachValue(wrappedGetters, (fn, key) => {
        // 给 computed 对象添加属性
        computed[key] = partial(fn, store)
        // 重写 get 方法
        // store.getters.xx 其实是访问了store._vm[xx],其中添加 computed 属性
        Object.defineProperty(store.getters, key, {
          get: () => store._vm[key],
          enumerable: true // for local getters
        })
      })
    
      const silent = Vue.config.silent
      Vue.config.silent = true
      // 创建Vue实例来保存state,同时让state变成响应式
      // store._vm._data.$$state = store.state
      store._vm = new Vue({
        data: {
          $$state: state
        },
        computed
      })
      Vue.config.silent = silent
    
      // 只能通过commit方式更改状态
      if (store.strict) {
        enableStrictMode(store)
      }
    }
    

    从上面源码,我们可以看出Vuex的state状态是响应式,是借助vue的data是响应式,将state存入vue实例组件的data中;Vuex的getters则是借助vue的计算属性computed实现数据实时监听。

    computed计算属性监听data数据变更主要经历以下几个过程:

    小结

    Vuex是通过全局注入store对象,来实现组件间的状态共享。在大型复杂的项目中(多级组件嵌套),需要实现一个组件更改某个数据,多个组件自动获取更改后的数据进行业务逻辑处理,这时候使用vuex比较合适。假如只是多个组件间传递数据,使用vuex未免有点大材小用,其实只用使用组件间常用的通信方法即可。

  • 相关阅读:
    边缘引导插值/方向卷积插值
    cout显示Mat类对象报错Access Violation
    图像特征点匹配C代码
    TF-IDF(词频-逆向文件频率)用于文字分类
    Jsp中如何通过Jsp调用Java类中的方法
    根据wsdl文件,soupUI生成webservice客户端代码
    根据wsdl,axis2工具生成客户端代码
    根据wsdl,apache cxf的wsdl2java工具生成客户端、服务端代码
    根据wsdl,基于wsimport生成代码的客户端
    Mysql截取和拆分字符串函数用法
  • 原文地址:https://www.cnblogs.com/zhenjianyu/p/13403758.html
Copyright © 2011-2022 走看看