Vuex状态管理

Vuex概念

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态。Vuex 的存储管理器分为以下几个部分:

名称 描述
state 即存储状态的数据。在 Vuex 中,存储状态的数据被定义为一个对象,称为 state 对象。它是所有组件共享的数据源
getters 用于从 state 中派生出一些状态,类似于计算属性。Getters 可以让你在模板中使用简单的方法计算衍生出来的状态
mutations 用于修改 state 中的数据。Mutations 只能通过提交(commit)来调用,不能直接修改 state 中的数据。这样可以更好地跟踪状态的修改,便于调试。
actions 用于处理异步操作,可以包含任意异步操作。Actions 可以包含多个 Mutation,并且可以通过提交(commit)调用 MutationActions 中的操作是异步的,可以用来处理网络请求等操作。
modules 用于将 Vuexstore 分割成模块。每个模块拥有自己的 statemutationsactionsgetters

具体目录如下:

store
├── getters.js
├── index.js
└── modules

说明:

目录/文件名 描述
modules 目录存放了 Vuex 中的模块(module),可以根据业务需求将不同的状态分离成不同的模块
getters.js 存放了所有的 Vuex getter 函数,getter 函数可以认为是 store 中的计算属性
index.js 是 Vuex 的主入口文件,它用于创建和配置 Vuex store 实例,将 state、mutations、actions、getters 和 modules 等组合在一起

通过Vux实现子组件数据传递

vuex实现

  1. 在modules目录下创建ad.js文件,文件内容如下:
#vi src/store/modules/ad.js
import api from '@/api/ad'

const state = {
// 初始化变量以及接受数据的类型
tableDataList: []
}

const mutations = {
// 主要用来修改state中变量的数据,传递的data的数据类型必须是变量可以接受的数据类型
// 比如Array
setTableData(state, data) {
state.tableDataList = data
}
}
// actions的函数名称用来调用action触发mutations来达到修改数据
const actions = {
async searchTableData({ commit }, searchData) {
const { data } = await api.list(searchData)
// 将获取的数据处理成Array之后通过commit方法触发mutations的setTableData函数修改state的值
commit('setTableData', data.results)
}
}

export default {
// 如果开启命名空间则访问actions函数时需要带上命名空间的名称,
// 比如this.$store.dispatch('ad/searchTableData', data)
// 这里的ad就是命名空间,命名空间的名字和模块名字保持一致
namespaced: true,
state,
mutations,
actions
}

  1. 设置getters
vi src/store/getters.js
const getters = {
tableDataList: state => state.ad.tableDataList
}
export defaults getters
  1. 在index.js中将vuex属性导入store
import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'
import ad from './modules/ad'

Vue.use(Vuex)

const store = new Vuex.Store({
modules: {
ad
},
getters
})

export default store

使用vuex案例

需求

  1. 有三个组件index.vue、search.vue、tableList.vue
  2. index.vue为search.vue和tablelist.vue的父组件
  3. 需要实现search.vue点击button按钮之后将数据传递给tablelist.vue组件,并且将数据在tablelist组件上展示出来

在index.vue中导入子组件

<template>
<div style="margin-top: 10px">
<search></search>
<table-list style="margin-top: -10px"></table-list>
</div>
</template>
<script>
import search from '@/views/ad/search'
import tableList from '@/views/ad/tableList'
export default {
// eslint-disable-next-line vue/no-unused-components
components: { search, tableList }
}
</script>

在search.vue组件中定义一个函数,点击button时调用这个函数

methods: {
queryData() {
// ad/ 代表使用ad命名空间下的searchTableData
this.$store.dispatch('ad/searchTableData', this.searchMap)
}

在tableList.vue组件中定义要展示的数据

computed: {
// 使用mapState函数将ad命名空间下tableDataList变量中的数据获取并赋值给el-table标签传递给table显示数据
...mapState('ad', ['tableDataList'])
},
created() {
// created钩子函数调用searchTableData actions将调用api接口获取到的数据通过commit触发mutations函数将数据保存到state中让computed调用
this.$store.dispatch('ad/searchTableData', this.searchMap)
}
文章作者: 慕容峻才
文章链接: https://www.acaiblog.top/Vuex状态管理/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿才的博客
微信打赏
支付宝打赏