Vuex 状态管理

图片授权基于CC0协议

在视图「View」上来派发动作「Actions」,Actions 会对数据「State」进行修改,数据修改后会触发视图「View」的更新。

这就是形成的单向数据流。

Vuex 相比起 全局变量 更加数据化,有规则,而且方便追踪状态变化。

看下源码:
git clone https://github.com/vuejs/vuex.git
在 src/index.js 中
我们在项目中 main.js 执行的方法 Vue.use(vuex) ,会去执行 Vuex 的 install 方法。
Vuex 状态管理
install 方法里执行 applyMixin 先去判断版本,2.x 和 1.x 的区别对待;
new Vue
    new Vue({    store,})
    在 Vue 的根组件上传入 store ,赋值给 this.$store 挂载到 Vue 上。可以通过 this.$store 来访问 Vue 的实例;

    Vuex 状态管理

    实例化之前要进行 Vue.use(Vuex) ,而且使用的环境要支持 Promise,还会在 store 里面定义私有的属性:_actions、_mutations、_modules。
    我简单复述三个重要的逻辑
    1、new ModuleCollection(options)
    参数 options 就是我们外面定义的对象,我们在写 store 的时候,会去定义 state/getters/mutations 等方法。

    Vuex 状态管理

    这个类里面会执行 this.register 方法,返回一个 this.root ,this.root会包含我们定义的 state/getters/mutations 等方法。
    如果有子模块,会递归执行 this.register「去建立父子关系」,挂在到 _children 上。

    2、installModule 注册和赋值

    遍历 mutation、action、getter、child,来完成 install 的过程。
    拿 mutation 来说吧,会执行 registerMutation 方法,把我们定义的方法添加到 store._mutations 上,会添加 namespace 来拼接,如果有子模块,就拼接子模块名称和方法名。
    Vuex 状态管理
    3、resetStoreVM
    Vuex 状态管理
    先去添加一个 store.getters = {};
    执行 forearchValue 循环遍历 wrappedGetters 赋值给 store.getters ,然后 Object.defineProperty 定义 get 方法「设置属性特征」。

    其次还会执行:

    我们访问 store.state 就可以访问到 root module 的 state 了

    Vuex 还提供了语法糖 mapGetters、mapActions、mapMutations 来获取数据、处理数据、提交数据。


    推荐阅读:
    Vue 如何调试源码
    「虚拟DOM」是怎样生成的?

    JavaScript 性能测试


    参考资料:

    《Vue.js源码全方位深入解析》

    原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34562.html

    (0)
    小道研究's avatar小道研究
    上一篇 2024年4月15日 下午10:25
    下一篇 2024年4月15日 下午10:27

    相关推荐

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注