在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。
多个组件需要共享数据时

state:主要是store的储存位置,用于数据的存储;
Vue Components:是在index文件中配置的vuex生成的vc属性,方便连接使用store
Action:dispatch方法的调用,主要是对参数精选判断,判断要传的具体参数后给下一步进行处理(api调用);
Mutations:commit方法的调用,对传来的数据进行最终的处理,修改state里的数据,方便最终的展示;
先下载:npm:
npm i vuex@3
注意:在vue2中要vuex3,在vue3中要vuex4。
注意:在main.js中引入:
import vuex from 'vuex';
Vue.use(vuex)
src/store/index.js- //引入Vue核心库
- import Vue from 'vue'
- //引入Vuex
- import Vuex from 'vuex'
- //应用Vuex插件
- Vue.use(Vuex)
-
- //准备actions对象——响应组件中用户的动作
- const actions = {}
- //准备mutations对象——修改state中的数据
- const mutations = {}
- //准备state对象——保存具体的数据
- const state = {}
-
- //创建并暴露store
- export default new Vuex.Store({
- actions,
- mutations,
- state
- })
main.js中创建vm时传入store配置项- ......
- //引入store
- import store from './store'
- ......
-
- //创建vm
- new Vue({
- el:'#app',
- render: h => h(App),
- store
- })
actions、配置mutations,操作文件store.js- 模板引入数据:
- {{$store.state.sum}}
-
- 方法:
- increment(){
- this.$store.commit('JIA',this.n)
- },
- decrement(){
- this.$store.commit('JIAN',this.n)
- },
- incrementOdd(){
- this.$store.dispatch('jiaOdd',this.n)
- },
- incrementWait(){
- this.$store.dispatch('jiaWait',this.n)
- },
actions和mutations中的两个传参,第一个是上下文,方便去取上面的数据或者进行下一步操作
- //引入Vue核心库
- import Vue from 'vue'
- //引入Vuex
- import Vuex from 'vuex'
- //引用Vuex
- Vue.use(Vuex)
- const actions = {
- //响应组件中加的动作
- jia(context,value){
- // console.log('actions中的jia被调用了',miniStore,value)
- context.commit('JIA',value)
- },
- }
-
- const mutations = {
- //执行加
- JIA(state,value){
- // console.log('mutations中的JIA被调用了',state,value)
- state.sum += value
- }
- }
-
- //初始化数据
- const state = {
- sum:0
- }
-
- //创建并暴露store
- export default new Vuex.Store({
- actions,
- mutations,
- state,
- })
$store.state.sum$store.dispatch('action中的方法名',数据) 或 $store.commit('mutations中的方法名',数据)备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即不写dispatch,直接编写commit
store.js中追加getters配置$store.getters.bigSum- ......
- const getters = {
- bigSum(state){
- return state.sum * 10
- }
- }
-
- //创建并暴露store
- export default new Vuex.Store({
- ......
- getters
- })
帮助引入store的方法到组件里,方便使用;
注意:使用前都要先引入:
import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
用于帮助我们映射state中的数据为计算属性
- computed: {
- //借助mapState生成计算属性:sum、school、subject(对象写法)
- ...mapState({sum:'sum',school:'school',subject:'subject'}),
-
- //借助mapState生成计算属性:sum、school、subject(数组写法)
- ...mapState(['sum','school','subject']),
- },
mapGetters方法:
用于帮助我们映射getters中的数据为计算属性
- computed: {
- //借助mapGetters生成计算属性:bigSum(对象写法)
- ...mapGetters({bigSum:'bigSum'}),
-
- //借助mapGetters生成计算属性:bigSum(数组写法)
- ...mapGetters(['bigSum'])
- },
mapActions方法:
用于帮助我们生成与actions对话的方法,即:包含
$store.dispatch(xxx)的函数
- methods:{
- //靠mapActions生成:incrementOdd、incrementWait(对象形式)
- ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
-
- //靠mapActions生成:incrementOdd、incrementWait(数组形式)
- ...mapActions(['jiaOdd','jiaWait'])
- }
使用时注意传参:可在模板里面加上括号,如:
其中的参数n是该模板data中的数据
mapMutations方法:
用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数
- methods:{
- //靠mapActions生成:increment、decrement(对象形式)
- ...mapMutations({increment:'JIA',decrement:'JIAN'}),
-
- //靠mapMutations生成:JIA、JIAN(对象形式)
- ...mapMutations(['JIA','JIAN']),
- }
备注:mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。
- //该文件用于创建Vuex中最为核心的store
- import Vue from 'vue'
- //引入Vuex
- import Vuex from 'vuex'
- import countOptions from './count'
- import personOptions from './person'
- //应用Vuex插件
- Vue.use(Vuex)
-
- //创建并暴露store
- export default new Vuex.Store({
- modules:{
- countAbout:countOptions,
- personAbout:personOptions
- }
- })
person:
- //人员管理相关的配置
- import axios from 'axios'
- import { nanoid } from 'nanoid'
- export default {
- namespaced:true,
- actions:{
- addPersonWang(context,value){
- if(value.name.indexOf('王') === 0){
- context.commit('ADD_PERSON',value)
- }else{
- alert('添加的人必须姓王!')
- }
- },
- addPersonServer(context){
- axios.get('https://api.uixsj.cn/hitokoto/get?type=social').then(
- response => {
- context.commit('ADD_PERSON',{id:nanoid(),name:response.data})
- },
- error => {
- alert(error.message)
- }
- )
- }
- },
- mutations:{
- ADD_PERSON(state,value){
- console.log('mutations中的ADD_PERSON被调用了')
- state.personList.unshift(value)
- }
- },
- state:{
- personList:[
- {id:'001',name:'张三'}
- ]
- },
- getters:{
- firstPersonName(state){
- return state.personList[0].name
- }
- },
- }
count:
- //求和相关的配置
- export default {
- namespaced:true,
- actions:{
- jiaOdd(context,value){
- console.log('actions中的jiaOdd被调用了')
- if(context.state.sum % 2){
- context.commit('JIA',value)
- }
- },
- jiaWait(context,value){
- console.log('actions中的jiaWait被调用了')
- setTimeout(()=>{
- context.commit('JIA',value)
- },500)
- }
- },
- mutations:{
- JIA(state,value){
- console.log('mutations中的JIA被调用了')
- state.sum += value
- },
- JIAN(state,value){
- console.log('mutations中的JIAN被调用了')
- state.sum -= value
- },
- },
- state:{
- sum:0, //当前的和
- school:'阳光小学',
- subject:'前端',
- },
- getters:{
- bigSum(state){
- return state.sum*10
- }
- },
- }