简单使用Vuex

172 阅读1分钟

第一步,安装

在命令行中输入安装指令

npm install vuex -s

配置 vuex,在src路径下创建store文件夹,然后创建index.js文件,文件内容如下:

import Vue from 'vue' //在vue3中不需要
import Vuex from 'vuex' 

Vue.use(Vuex) //在vue3中不需要

export default new Vuex.Store({
  state: {
    name: '女孩',
    number: 1,
  },
  getters: {
   
  },
  mutations: {
 
  },
  actions: {
   
  },
  modules: {}
})

修改main.js:

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store' // 引入store对象
Vue.config.productionTip = false
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

第二步,在页面中使用state

<template>
    <div></div>
</template>

<script>
    export default {
        mounted() {
            // 使用this.$store.state.XXX可以直接访问到仓库中的状态
            console.log(this.$store.state.name); 
        }
    }
</script>

即可在控制台输出刚才我们定义在store中的name的值。

image.png

第三步,使用修饰器:getters

首先,在store对象中增加getters属性

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    name: '女孩',
    number: 1,
  },
  getters: {
    getMessage(state) { 
      return `我的${state.name}`;
    }
  },
})

在组件中使用:

 <template>
    <div></div>
</template>

<script>
    export default {
        mounted() {
           // 注意不是$store.state了,而是$store.getters
            console.log(this.$store.getters.getMessage)
        }
    }
</script>

查看控制台:

image.png

第四步,使用修改值:mutations

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    name: '女孩',
    number: 0,
  },
 mutations: {
    setNumber(state) { //让num从1变成10,state是必须默认参数
      state.number = 10;
    }
  },
})

在组件中使用:

 <template>
    <div></div>
</template>

<script>
    export default {
        mounted() {
           console.log(`旧值:${this.$store.state.number}`);
           this.$store.commit('setNumber');//注意是通过$store.commit获取
           console.log(`新值:${this.$store.state.number}`);
        }
    }
</script>

还可以将setNumber(state)传不固定参

     setNumber(state,payload) { 
         state.number = payload.number;
    }

在页面中使用

 this.$store.commit('setNumber', { number: 10 });

查看控制台:

image.png

这里说一条重要原则:Mutations里面的函数必须是同步操作,不能包含异步操作!

第五步,了解异步操作:actions

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    name: '女孩',
    number: 0,
  },
 mutations: {
    setNumber(state) { //让num从1变成10,state是必须默认参数
      state.number = 10;
    }
  },
actions: {
    setNum(content) {  // 增加setNum方法,默认第一个参数是content,其值是复制的一份store
      return new Promise(resolve => {  // 我们模拟一个异步操作,1秒后修改number为999
        setTimeout(() => {
          content.commit('setNumber', { number: 999 });
          resolve();
        }, 1000);
      });
    }
  },
})

在组件中使用:

 <template>
    <div></div>
</template>

<script>
    export default {
         async mounted(){
            console.log(`旧值:${this.$store.state.number}`);
            await this.$store.dispatch('setNum');//注意是通过$store.dispatch获取
            console.log(`新值:${this.$store.state.number}`);
      },
    }
</script>

查看控制台:

image.png