vuex的使用

442 阅读3分钟

Vuex介绍

  Vuex是专为 Vue.js 设计 的状态管理模式,他可以集中式存储和管理应用程序中所有组件的状态,避免了多个组件内互相传递变量,集中统一方便管理

Vuex的使用流程

1.安装 Vuex:

  npm install vuex  ||  yarn add vuex    //两种方式都可以

2.创建文件

在 /src 目录下,创建一个名为 store 的目录 在该目录中设置一个index.js文件作为出口

具体引用步骤:
import Vue from "vue"
//然后引入下好的vuex包
import Vuex from "vuex"

//把vuex挂载到Vue上
Vue.use(Vuex)

//创建Vuex.Store的实例
const store = new Vuex.Store({
  // 各种配置(类似于data,methods,computed....)
  // state就对应理解为组件中data 定义公共变量的地方
  state: {
    num: 100//这就是一个公共变量
  },
    
})
// 3. 导出store实例
export default store

在 main.js文件下引入:

import Vue from 'vue'
import App from './App.vue'
// 在入口文件中引入store
import store from './store/index.js'
Vue.config.productionTip = false

// 挂载到vue的实例上
new Vue({
  store: store,
  render: h => h(App),
}).$mount('#app')

3.vuex中的属性

new Vuex.Store({
    state:{},
    geeter:{
        //是vuex中的计算属性,存放从基本数据(state)派生的数据
    },
    mutations:{
        // 函数名可以是任意合法的函数名
        // 参数1:表示当前state
        // 参数2:可选。它表示调用函数1时,传入的参数。
        函数名1(参数1,参数2){
            // 在函数内部,修改state中的数据
        }
    },
    actions:{
        // context类似于$store对象
        // payload是传过来的参数值
        // 必须在actions里提交mutations来触发state更新(规定)
        asyncSubNum(context, payload){
            // 可以加入异步任务后, -> 触发mutations -> 修改state
            setTimeout(() => {
                context.commit("subNumFn", payload);
            }, 1000);
        }
    },
    modules:{
        //存放模块名
        //模块化vuex,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理
    }
})

4.使用vuex中的变量

方法1:调用导出的store对象使用
模板中使用变量:`{{ $store.state.变量名 }}`

vue页面配置项中:
未定义模块时
    --调用state属性中变量:`this.$store.state.num`
    --调用mutations属性中方法: `this.$store.commit('函数名',要传入的值)`
    --调用actions属性中异步方法: `this.$store.dispatch('函数名',要传入的值)`
定义模块后
    --调用state属性中变量:`this.$store.state.模块名.num`
    --调用mutations属性中方法: `this.$store.commit('模块名/函数名',要传入的值)`
    --调用actions属性中异步方法: `this.$store.dispatch('模块名/函数名',要传入的值)`


js页面中: 
首先引入导出的store对象: import store from './store/index.js'
未定义模块时
    --调用state属性中变量:`store.state.num`
    --调用mutations属性中方法: `store.commit('函数名',要传入的值)`
    --调用actions属性中异步方法: `store.dispatch('函数名',要传入的值)`
定义模块后
    --调用state属性中变量:`store.state.模块名.num`
    --调用mutations属性中方法: `store.commit('模块名/函数名',要传入的值)`
    --调用actions属性中异步方法: `store.dispatch('模块名/函数名',要传入的值)`

当前vuex中调用其他属性或方法:
    //vuex推荐在mutation属性中修改store.js中的数据,而不是利用$store修改
    //通过这种方式操作起来稍微繁琐一些,但是可以集中监控所有数据的变化
    mutations:{
        合法的函数名(state,参数){
            //第一个参数名推荐state,语义化清晰,相当于映射state属性到mutations函数中通过state使用变量,
            //参数
            //修改state中数据的语法:
            state.变量名 = ...  (进行任意操作)
        }
        
    },
    actions:{
        async 方法名(context,参数){
             //参数1 context类似于$store对象
             //参数2 为传进来的任意参数值
             //如果想要使用mutations中的方法
             //语法:
             context.commit('mutations中方法名',参数)
             //不需要模块名,因为本身就在当前模块调用
             //想使用actions中的方法
             context.dispatch('actions中方法名',参数)
             //使用其他模块方法只需要在方法名前追加一个模块名
              context.commit('模块名/mutations中方法名',参数)
              context.dispatch('模块名/actions中方法名',参数)
        }
    },
***注意,定义模块后需要设置namespace = true,开启命名空间,开启后调用相同的方法或变量名字需要携带模块名,避免名字相同引起混乱
方法2:map映射使用
映射关系:
mapState > computed
mapGetters > computed
mapMutations > methods
mapActions > methods

使用步骤

未定义模块
1. 组件中按需导入mapState函数: 
`import { mapState } from 'vuex'`
`import { mapMutations } from 'vuex'`
`import { mapGetters } from 'vuex'`
`import { mapActions } from 'vuex'`
2. 将vuex中数据或方法映射: 
`computed:{ ...mapState(['state中的变量名','多个用逗号隔开']) }`
`computed`{ ...mapGetters(['Getters中的变量名'])}
`methods:{ ...mapMutations(['mutations中的方法名'])} `
`methodus`:{ ...mapActions(['actions中的方法名'])}
3. 把映射到组件内的数据当成一般计算属性使用

定义模块后
只需在变量名或方法名之前添加 模块名 就可以
例子:computed:{ ...mapState('user'['state中的变量名','多个用逗号隔开']) }`
// ...mapActions('user', ['login']) //为了避免和状态值重名,也可以使用完整路径,如下
    ...mapActions(['user/login'])
    // 在使用的时候
this['user/login']('admin').then(res => {})

以上就是我的总结,不足的地方希望能够指正