Vuex状态管理store
- 一、Vuex的安装与配置
- 二、store使用方法
- 1、基础使用
- 2、提交变更
- 3、getters使用
- 4、在其他页面(组件)中显示
- 5、modules多模块
做vue项目的时候, store状态管理器可以帮助我们完成一些数据的存储和管理,通俗理解是存储在store里的都是全局变量,可以通过方法提交更新,其他页面和组件也会同步更新,拿到最新的值。
一、Vuex的安装与配置
方法 | 描述 |
---|---|
state | 状态树:定义需要管理的数组、对象、字符 |
getters | 类似计算属性,当需要从store的state中派生出一些状态,就需要使用getter,getter会接受state作为第一个参数,而getter的返回值会根据它的依赖缓存起来,只有getter中的依赖值发生改变才回重新计算。 |
mutation | 更改store中state状态的唯一方法就是提交mutation。每个mutation都有一个字符串类型的事件和一个回调函数,我们需要改变state的值就要在回调函数中改变。我们要执行这个回调函数,那么我们需要执行一个相应的调用方法:store.commit |
- Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到更新。
- 不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交(commit)mutation。
- 安装vuex支持
npm install vuex --save
注意:
Vue 3 匹配 Vuex 4npm install vuex@4 --save
Vue 2 匹配 Vuex 3
npm install vuex@3 --save
卸载vuex
npm uninstall vuex --save
- 在src下创建store文件夹,建立
store/index.js
--> 在index.js
中引入vue 和 vuex- 引入vue 和 vuex,并使用
Vue.use(Vuex)
【☆☆☆☆☆】 - 创建state和mutations
- export导出Vuex.Store 实例
- 引入vue 和 vuex,并使用
初始代码
import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const state = {username: '牛牛',
}
const mutations = {setUser(state, name) {state.username = name},
}
export default new Vuex.Store({state,mutations
})
- 在main.js配置,这样就可以全局引入了,省的每个要使用的页面单独在引入。
import Vue from 'vue'
import App from './App.vue'import VueRouter from 'vue-router';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import router from './router/index.js';
import axios from 'axios';import './mock/index.js';
import '@/assets/css/global.css';
import store from './store/index.js';Vue.config.productionTip = false;
Vue.prototype.$axios =axios;
Vue.use(ElementUI);
Vue.use(VueRouter);new Vue({router,store,render: h => h(App),
}).$mount('#app')
二、store使用方法
1、基础使用
语法:$store.state.XXX(XXX属性名)
页面代码,我是以Main2.vue作为基础操作的
<template><div><span>这是Main2</span><br /><br /><h1>{{ $store.state.username }}</h1></div>
</template><script>
export default {name: "Main2",
};
</script><style scoped>
</style>
页面效果
2、提交变更
使用方法 commit ,语法如下:
this.$store.commit('提交方法名',数据);
在store.js中一个状态字段 userState 和提交的方法 setUserState
页面代码修改
<template><div><span>这是Main2</span><br /><br /><h1>{{ $store.state.username }}</h1><br />数据状态:{{ $store.state.userState }}<el-button @click="addState">状态+1</el-button></div>
</template><script>
export default {name: "Main2",methods: {addState() {this.$store.commit("setUserState", 1);},},
};
</script><style scoped>
h1,
.el-button {height: auto;
}
</style>
页面效果
3、getters使用
对数据进行修饰,比如上例中的用户状态,我们假设如下:
0 :无效
1 :1级
2 :2级
…
在 store/index.js
增加getters进行数据的修饰并导出getters,全部代码如下:
import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const state = {username: '牛牛',userState: 0
}
const mutations = {setUser(state, name) {state.username = name},setUserState(state, data) {state.userState += data},
}
const getters = {getUserState(state) {let data;if (state.userState == 0) {data = '无效'} else {data = state.userState + '级'}return data;}
}export default new Vuex.Store({state,mutations,getters
})
页面代码修改
页面效果
4、在其他页面(组件)中显示
直接在footer 页面加入显示即可
数据状态:{{$store.state.userState}}
<template><div>store/index.js 来的数据:{{ $store.state.userState }}</div>
</template><script>
export default {name: "Footer",
};
</script><style scoped>
</style>
更新state中的状态时都会同步更新:
5、modules多模块
-
在store下创建文件夹 module ,并建立两个文件 moduleA.js moduleB.js
-
moduleA.js 定义state 的username 为 module_a_user,同理,moduleB.js为 module_b_user
import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {username: "module_a_user"},mutations: {},getters: {}
})
- 在store.js中创建modules并导出
- 代码示例
import Vue from 'vue'
import Vuex from 'vuex'
import moduleA from './module/moduleA.js';
import moduleB from './module/moduleB.js';Vue.use(Vuex)const state = {username: '牛牛',userState: 0
}
const mutations = {setUser(state, name) {state.username = name},setUserState(state, data) {state.userState += data},
}
const getters = {getUserState(state) {let data;if (state.userState == 0) {data = '无效'} else {data = state.userState + '级'}return data;}
}const modules = {a:moduleA,b:moduleB
}export default new Vuex.Store({state,mutations,getters,modules
})
页面使用:
语法:$store.state.模块名.字段名
module用户a:{{$store.state.a.username}}
<br>
module用户b:{{$store.state.b.username}}
页面效果
操作全部代码,仅供参考
Main2.vue参考代码
<template><div><span>这是Main2</span><br /><br /><h1>{{ $store.state.username }}</h1><br />数据状态:{{ $store.state.userState }}<el-button @click="addState">状态+1</el-button><br /><br />计算数据状态:{{ $store.getters.getUserState }}<br /><br />module用户a:{{ $store.state.a.username }}<br />module用户b:{{ $store.state.b.username }}</div>
</template><script>
export default {name: "Main2",methods: {addState() {this.$store.commit("setUserState", 1);},},
};
</script><style scoped>
h1,
.el-button {height: auto;
}
</style>
store/index.js代码在5.4小节中已经全部提供,往上翻一下
store/module/moduleA.js代码在5.2小节中已经全部提供,往上翻一下
Vuex状态管理store的用法就介绍到这啦~~