Vuex 使用

159 阅读3分钟

6MA1X.jpg

Vuex 解决了什么

  1. 集中管理状态:Vuex 将应用程序的状态存储在一个集中的地方(数据存储在Store),称为 Store。这使得状态的更改变得可预测和可追踪。
  2. 组件之间共享状态:组件之间的数据通信可以通过 Store 进行管理。这样,多个组件就可以共享同一份状态,而不需要通过父子组件传递 props 或事件总线等方法。
  3. 更好的调试:由于状态集中存储在 Store 中,因此可以轻松地跟踪状态的更改历史记录。这使得调试变得更加容易。
  4. 更好的可维护性:Vuex 通过明确地分离关注点,使代码更加模块化和可维护。Store 用于存储状态,Actions 用于处理异步逻辑和副作用,Mutations 用于更改状态。

Vuex 为 Vue.js 应用程序提供了一种统一的状态管理机制,使得应用程序状态的管理变得更加简单和高效。

Vuex 是什么

Vuex 是一个用于 Vue.js 应用程序的状态管理模式和库。它的目的是解决在大型应用程序中,组件之间共享状态所带来的复杂性和难以维护的问题。

image.png

使用

cdn 安装

https://unpkg.com/vuex@4.0.0/dist/vuex.global.js

npm#

npm install vuex@next --save
yarn add vuex@next --save

快速上手

  1. 创建一个store
  2. src/store/indx.js
  3. 插件安装到app app.use(store)

核心概念

使用Vuex的模板

import  {createStore} from  "vuex"

const store = createStore({
  state() { //类似data() ,管理所有状态
    return {}
  },
  getters: { //类似计算属性

  },
  mutations: { //类似methods 改变state

  },
  actions: { //可执行异步操作

  },
  modules: { //单一state容易过于庞大,可分多个store

  }
})

export default store

state

声明state

image.png

使用

image.png

image.png

Vuex 使用插件use(store),将store实例从根组件注入到所有的子组件, 子组件使用this.$store, 这里使用模板语法,可以省略this

getters

只想获得指定结果,而不修改数据,请使用getters

声明

image.png

使用

image.png 结果:xeuv si sihT

mutations

改变state的状态,唯一方法提交mutaions

声明

image.png

使用

使用$store.commit(函数名, 参数)

image.png mutation 必须是同步函数

actions

  • Action 提交的是 mutation,而不是直接变更状态。
  • Action 可以包含任意异步操作。

声明

image.png

使用

使用dispatch 使用 actions 里的函数

image.png

module

store 分割成模块(module) 。每个模块拥有自己的 state、mutation、action、getter、

image.png 注册到modules image.png 每个模块都有自己的状态,因此访问需要加上模块名

image.png

模块如何访问根节点:

对于getters:根节点状态会作为第三个参数暴露出来

image.png 对于模块内部的 action,局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState

image.png

命名空间

  • 访问模块的state ,需要加上模块名
  • 模块的 getters actions会注册到全局命名空间(全局发访问),这样背离了module的初衷, 因此我们希望通过模块名访问到 模块的getters ations
  • 你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块

mpaState

我们使用store 需要加上非常长的前缀,能不能直接想访问data,那样呢.

对象展开

computed: {
  localComputed () { /* ... */ },
  // 使用对象展开运算符将此对象混入到外部对象中
  ...mapState({ //不会和局部的conputed冲突
    // ...
  })
}