Vue进阶 | Vue3中Vuex的使用

211 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

Vuex 是 Vue 为我们提供的状态管理工具,在前面有写过关于vuex更新视图引发的思考,本文主要针对 Vue3 中使用 Vuex 来进行展开。

实现方式

一般我们会将文件存放在 store 文件夹下,创建义并导出 store 对象,具体结构如下。

import { createStore } from 'vuex'

export default createStore({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

然后在 main.js 中引入:

import store from '@/store'
app.use(store)

在页面中使用:

引入useStore,用 useStore() 返回一个 store 实例

import { useStore } from 'vuex'
const store = useStore() 
console.log(store)

数据变化

在对状态管理中的数据进行修改时,不要 使用 state 直接进行数据变化的操作,Vuex 为我们提供了方式:

  • mutation
  • action

mutation 中进行同步操作,action 中进行异步操作。

其中,mutation 中无法跟踪到异步操作的数据变化。actions 中需要 context 上下文对象,再通过 context 去触发 mutions 中的方法

mutations: {
  setName (state, name) {
    state.name = name
  }
},
actions: {
  myActions (context, name) {
    setTimeout(() => {
      context.commit('setName', name)
    }, 1000)
  }
}

mutation 定义后的调用 : commit()包含要提交的方法名称以及传递的参数

store.commit('updateData', value)

action 定义后调用:使用 dispatch() 进行分发

store.dispatch('myActions', "俺的名字")

注:

  1. Vue3 中不需要再使用 vue.set() 来进行响应式数据的更新
  2. 使用 mapState、 mapGetters 需要进行封装
  3. 在定义的时候,也可以写成装饰器的写法:

image.png

可能遇到的问题

场景1:

不要在mutation函数外修改VUEX存储状态,更改 Vuex 的 store 中的状态的唯一方法是提交 mutation

state中的值必须在Vuex的回调函中更改,而在页面修改数组或者对象的值时,触发了 vuex 中 state 的值变化,由此报出了错误。

1660807513439.png

数组或者对象赋值后,不受数据改变的影响的正确做法:

let arr = Object.assign({},this.arr)
let arr = JSON.parse(JSON.stringify(this.arr))
let arr = this.arr.slice()

场景2:

[vuex] unknown mutation type

image.png