# 一、使用
//src/store/index
import {createStore} from 'vue'
const store = createStore({
state: {
age: 1,
},
getters: {
getAgeaa(state, getters) {
console.log("getter不会缓存");
return state.age + 5;
},
},
actions: {
//
age_action({ commit },playload) {
setTimeout(() => {
console.log("修改");
commit("add_age",playload);
}, 2000);
},
},
mutations: {
add_age(state, playload ) {
state.age += playload.count;
},
},
});
export default store
//main.js 引入插件
import store from './store'
createApp({}).use(store)
//App.vue
<script setup>
import useStore from 'vue'
age
<script>
//v2的使用方式
<h1>$store.state.age</h1>
<h2>
# 二、实现
// util/index
//工具函数:后面遍历getters mutation,actions
export default function foreach(obj,cb){
// 执行cb 传入对象的key,value
Object.keys(obj).foreach((item)=>{
cb(item,obj[item])
})
}
import {reactive,inject} from 'vue'
let defaultKey='store'
class MyVuex {
constructor(options){
//处理state
this.state=reative(options.state)
//处理getter
let getters=options.getters
this.getters={}
foreach(getters,(key,value)=>{
//value是getters函数
Object.defineProperty(this.getters,key,{
//必须是箭头函数 this才是 MyVuex
get:()=>{
return value(this.state)
}
})
})
//处理mutations -- 配合commit调用
let mutations=options.mutations
this.mutations={}
foreach(mutations,(key,value)=>{
mutations[key]=(data)=>{
value(this.state,data)
}
})
//处理actions -- 配合dispatch调用
let actions=options.actions
this.actions={}
foreach(actions,(key,value)=>{
actions[key]=(data)=>{
value(this,data)
}
})
}
install(app,key){
//1.挂载到全局上
//兼容v2
app.config.globalProperties=this
//vue3
app.provide(key||defaultKey)
}
commit=(name,data)=>{
//箭头函数 this永远指向MyVueX
this.mutations[name](data)
}
dispatch=(name,data)=>{
//箭头函数 this永远指向MyVueX
this.actions[name](data)
}
}
export function createStore(options){
return new MyVueX(options)
}
export function useStore(key) {
return inject(key||defaultKey)
}
# 三、总结
- vuex需要
use引入,需要实现install install做的事- 将vuex挂载到全局
app(vue实例上)
- 将vuex挂载到全局
- 实现
createStoreuseSotre工厂单例模式 - 处理state 使用
reactive变为响应式 - 处理 getters 需要在get就执行函数
- 处理mutations 实现
commit(使用箭头函数) - 处理actions 实现dispatch(使用箭头函数)