vuex 简述
vuex 本质上就是 vue 中的 mixin,store 在每个 vue 组建实例创建的时候通过 mixin 的方式注入的,mixin 就类似这样的格式
1 | const mixComponent = { |
当组建和混入的 mixins 含有同名选项时,这些选项将会以适当的方式进行合并,比如 mixins 中的 data 和组建的 data 有同名属性时,那么将会以组建中的数据为准。当具有同名的钩子函数时,那么同名的钩子函数将会组成一个数组,它们都将被调用。另外,mixins 中的钩子函数将会在组件自身钩子之前调用。
值为对象的选项时,它们将会被合并为一个对象,k-v 冲突时,取组件中的 kv。
而 vuex 正是全局的 mixins,将会在每个组件 create 的时候注入
Vue.use
可以看看官网对这个方法对介绍
参数:
{Object | Function} plugin
用法:
安装 Vue.js 插件。如果插件是一个对象,必须提供 install 方法。如果插件是一个函数,它会被作为 install 方法。install 方法调用时,会将 Vue 作为参数传入。
该方法需要在调用 new Vue() 之前被调用。
当 install 方法被同一个插件多次调用,插件将只会被安装一次。
参考:插件
然后看看源代码怎么实现的,在 vue 中,要想使用 vuex,那么肯定就要安装官方的 vuex 插件,然后在入口文件中调用 Vue.use(vuex)
1 | function initUse (Vue) { |
然后康康 install 函数做了什么
1 | export function install(_Vue){ |
OK,继续看 applyMixin
1 | export default function (Vue) { |
然后来看生成 Store 的构造函数
1 | import applyMixin from './mixin' |
首先是引入文件,applyMixin 之前有说,然后是 devtoolPlugin,看名字猜应该是 vue-devtool 有关,pass,然后是一些封装的工具函数,看一下代码
1 | # 条件断言,不满足条件抛出错误 |
可以看到,这个应该是以闭包的形式返回一个新函数
然后全局声明一个 Vue 变量,打一下断点我们可以发现 Vue 储存的其实是一个 function
然后看正文
1 | export class Store { |
OK,康康 installModule 怎么执行的
1 | # |
1 | # 获取命名空间 |
1 | function makeLocalContext(store,namespace,path){ |
makeLocalGetters
1 | function makeLocalGetters (store, namespace) { |
注册 mutations
1 | function registerMutation (store, type, handler, local) { |
注册 action
1 | function registerAction (store, type, handler, local) { |
注册 getters
1 | # 注解略,都差不多逻辑 |
resetStoreVM
1 | # 这个方法让store变成一个响应式的vue实例 |
辅助函数
mapState
1 | export const mapState = normalizeNamespace((namespace, states) => { |
看了下剩下的几个map,逻辑都一样,就是return都时候做下修改就好,那就这样啦
Done!
——- 更新 2020.6.26
害 ,发现vuex更新到vuex4了,然后我看了一下,有个东西改了,人家不用mixin来注入store这东西了哈,人家用provide和inject来注入store了
代码
看下简单的示例代码
1 | import { createApp } from 'vue' |
在调用app.use方法的时候用调用注入plugin的install方法
(如果install方法存在的话),看下use方法怎么写的
1 | use(plugin, ...options) { |
然后看下vuex中的install方法怎么写的
1 | install (app, injectKey) { |
很明显得看出是把store放到provide中实行了,并且因为在调用的时候是用的plugin.install(app)
的方法来写的,所以这个时候的this指向的是store实例,这样就可以把store实例注入到app实例中了 ,这样写的好处我觉得就是数据来源更清晰了吧。