vuex4 和vuex3 源码差别
快速过Vuex3.x原理
1、为什么每个组件都可以通过this.$store访问到store数据?
在beforeCreate时,通过mixin的方式注入了store
2、为什么Vuex中的数据都是响应式的
创建store的时候调用的是new Vue,创建了一个Vue实例,相当于借用了Vue的响应式。
3、mapXxxx是怎么获取到store中的数据和方法的
mapXxxx只是一个语法糖,底层实现也是从$store中获取然后返回到computed / methods中。
Vuex4使用
Vuex4是怎么注入Vue的
Vuex是以插件的形式在Vue中使用的,在createApp时调用install安装
Store 类的install,两种实现分别为挂载到全局和组件内访问
- :实现通过inject获取 (全局提供)
- 实现this. s t o r e 获 取 : 将 s t o r e 挂 载 到 全 局 p r o p e r t i e s ( 让 每 一 个 组 件 实 例 都 有 一 个 store获取:将store挂载到全局properties(让每一个组件实例都有一个 store获取:将store挂载到全局properties(让每一个组件实例都有一个store)
// Vuex4实现插件install
install (app, injectKey) {
// 实现通过inject获取
app.provide(injectKey || storeKey, this)
// 实现this.$store获取
app.config.globalProperties.$store = this
}
useStore的实现
Vue.inject、Vue.provide
通过provide时存入的key取出store
有父级实例则取父级实例的provides,没有则取根实例的provides
function useStore (key = null) {
return inject(key !== null ? key : storeKey)
}
createStore
- 可以发现Vuex4中的state是通过reactive API去创建的响应式数据,Vuex3中是通过new Vue实例
- ispatch、commit的实现基本是封装了一层执行,底层也是通过store去执行
- 而Vuex4的响应式实现,同样是借用了Vue3的响应式API reactive
通过$store 是怎么获得getter的
const forEach = (obj, cb) => {
Object.keys(obj).forEach((key) => {
cb(key, obj[key], obj);
});
};