目录
一、概念
1. 状态管理
2. Vuex的状态管理
3. 单一状态树
二、Vuex 的基本使用
1. Vuex的安装
2. 创建store
3. 在store文件夹下创建index.js
4. 在main.js中引入
5. 组件中使用sotre
6. 效果
三、核心概念 State
1. 直接使用
2. mapState
使用
封装 useState.js 文件
代码
使用
四、核心概念 Getters
1. 基本使用
代码
使用
2. getters第二个参数
代码
使用
3. getters的返回函数
代码
使用
4. mapGetters
使用
封装 useGetters.js 文件
代码
使用
五、核心概念 Mutations
1. 重要原则
2. 基本使用
代码
使用
3. 携带数据
代码
使用
4. 常量类型
定义mutation_types.js
代码
使用
5. mapMutations
使用
封装 useMutations.js 文件
代码
使用
六、核心概念 Actions
七、核心概念 Modules
vue2 契合 vuex | vue3 契合 pinia
在开发中,应用程序需要处理各种各样的数据,这些数据需要保存在应用程序中的某一个位置,对于这些数据的管理就称之为是状态管理
Vuex 使用单一状态树 :
单一状态树的优势 :
单一状态树的缺点 : 不够灵活
npm install vuex
每一个Vuex应用的核心就是store(仓库)
store本质上是一个容器,它包含着你的应用中大部分的状态(state)
Vuex和单纯的全局对象的区别 :
// 1. 引入
import { createStore } from 'vuex';
// 2. 创建store对象
const store = createStore({
// 3. 定义state
state: () => ({
// 4. 定义数据
count: 100
}),
// 5. 定义mutations
mutations: {
// 6. 定义方法
increment(state) {
state.count++;
}
}
});
// 5. 导出
export default store;
import { createApp } from 'vue';
import App from './App.vue';
// 1. 导入
import store from './store';
// 2. 使用
createApp(App).use(store).mount('#app');
App 页面
模版 : {{ $store.state.count }}
computed : {{ storeCount }}
解构count : {{ count }}
App 页面
模版 : {{ $store.state.count }}
computed : {{ storeCount }}
解构count : {{ count }}
App 页面
模版 : {{ $store.state.count }}
mapState : {{ cCount }}
import { useStore, mapState } from 'vuex';
import { computed } from 'vue';
export default function useState(mapper) {
// 1. 拿到store对象
const store = useStore();
// 2. 使用mapState拿到对应的方法
const stateFnsObj = mapState(mapper);
// 4. 定一个接受对象
const newState = {};
// 5.遍历
Object.keys(stateFnsObj).forEach((key) => {
// 6. 生成绑定过的对象
newState[key] = computed(stateFnsObj[key].bind({ $store: store }));
});
// 7. 返回
return newState;
}
App 页面
模版 : {{ $store.state.count }}
封装哒 : {{ fCount }}
import { createStore } from 'vuex';
const store = createStore({
state: () => ({
count: 100
}),
mutations: {
increment(state) {
state.count++;
}
},
// 定义getters
getters: {
doubleCount(state) {
return state.count * 2;
}
}
});
export default store;
App 页面
模版 : {{ $store.state.count }}
doubleCount : {{ $store.getters.doubleCount }}
getters可以接收第二个参数,用来调用其他的getters
import { createStore } from 'vuex';
const store = createStore({
state: () => ({
count: 100
}),
mutations: {
increment(state) {
state.count++;
}
},
getters: {
doubleCount(state, getters) {
// 可以调用其他的getters函数
return state.count * 2 + getters.mathRanDom;
},
// 生成[5,50)的随机数
mathRanDom() {
return Math.floor(Math.random() * 45) + 5;
}
}
});
export default store;
App 页面
模版 : {{ $store.state.count }}
random : {{ $store.getters.mathRanDom }}
doubleCount : {{ $store.getters.doubleCount }}
getters中的函数本身,可以返回一个函数,可用来接受参数
import { createStore } from 'vuex';
const store = createStore({
state: () => ({
count: 100
}),
mutations: {
increment(state) {
state.count++;
}
},
getters: {
doubleCount(state, getters) {
// 可以调用其他的getters函数
return state.count * 2 + getters.mathRanDom;
},
// 生成[5,50)的随机数
mathRanDom() {
return Math.floor(Math.random() * 45) + 5;
},
countAddNum(state) {
// 可用来接受传进来的参数
return function (num) {
return state.count + num;
};
}
}
});
export default store;
App 页面
模版 : {{ $store.state.count }}
doubleCount : {{ $store.getters.doubleCount }}
random : {{ $store.getters.mathRanDom }}
countAddNum : {{ $store.getters.countAddNum(10) }}
countAddNum : {{ $store.getters.countAddNum(20) }}
App 页面
{{ doubleCount }}
import { useStore, mapGetters } from 'vuex';
import { computed } from 'vue';
export default function useGetters(mapper) {
const store = useStore();
// 1. 接受全部getters
const gettersFn = mapGetters(mapper);
// 2. 定义新的函数数组
const newGetters = {};
// 3. 遍历绑定
Object.keys(gettersFn).forEach((key) => {
newGetters[key] = computed(gettersFn[key].bind({ $store: store }));
});
// 返沪
return newGetters;
}
App 页面
{{ doubleCount }}
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation
mutation 必须是同步函数
import { createStore } from 'vuex';
const store = createStore({
state: () => ({
count: 100
}),
mutations: {
increment(state) {
state.count++;
}
}
});
export default store;
App 页面
{{ $store.state.count }}
import { createStore } from 'vuex';
const store = createStore({
state: () => ({
count: 100
}),
mutations: {
// 接受传递过来的参数
increment(state, num) {
state.count += num;
}
}
});
export default store;
App 页面
{{ $store.state.count }}
// 定义成常量类型
export const INCREMENT = 'increment';
import { createStore } from 'vuex';
// 1. 导入
import { INCREMENT } from './mutation_types';
const store = createStore({
state: () => ({
count: 100
}),
mutations: {
// 2. 使用常量作为名称,使用计算属性值
[INCREMENT](state, num) {
state.count += num;
}
}
});
export default store;
App 页面
{{ $store.state.count }}
App 页面
{{ $store.state.count }}
import { useStore, mapMutations } from 'vuex';
export default function useMutations(mapper) {
const store = useStore();
// 1. 接受全部函数
const mutationFns = mapMutations(mapper);
// 2. 定义新的函数数组
const newMutations = {};
// 3. 遍历绑定
Object.keys(mutationFns).forEach((key) => {
newMutations[key] = mutationFns[key].bind({ $store: store });
});
// 返回对象
return newMutations;
}
Action类似于mutation
参数context :
import { createStore } from 'vuex';
const store = createStore({
state: () => ({
count: 100
}),
mutations: {
increment(state) {
state.count++;
}
},
getters: {
doubleCount(state, getters) {
return state.count * 2 + getters.mathRanDom;
},
mathRanDom() {
return Math.floor(Math.random() * 45) + 5;
}
},
actions: {
// 定义actions方法
incrementAction(context) {
// 1. 可进行接口请求
// balabalabala~
// 2. 通过mutation来修改state的状态
context.commit('increment');
}
}
});
export default store;
App 页面
{{ $store.state.count }}
import { createStore } from 'vuex';
const store = createStore({
state: () => ({
count: 100
}),
mutations: {
increment(state, num = 10) {
state.count += num;
}
},
getters: {
doubleCount(state, getters) {
return state.count * 2 + getters.mathRanDom;
},
mathRanDom() {
return Math.floor(Math.random() * 45) + 5;
}
},
actions: {
// 定义actions方法,接受参数
incrementAction(context, num) {
// 调用mutations方法
context.commit('increment', num);
}
}
});
export default store;
App 页面
{{ $store.state.count }}
App 页面
{{ $store.state.count }}
import { useStore, mapActions } from 'vuex';
export default function useActions(mapper) {
const store = useStore();
// 1. 接受全部的actions
const actionsFn = mapActions(['incrementAction']);
// 2. 定义新的actions对象
const newActions = {};
// 3. 遍历
Object.keys(actionsFn).forEach((key) => {
newActions[key] = actionsFn[key].bind({ $store: store });
});
return newActions;
}
App 页面
{{ $store.state.count }}