Vuex概念
Vuex
是一个专为 Vue.js
应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态。Vuex
的存储管理器分为以下几个部分:
名称 |
描述 |
state |
即存储状态的数据。在 Vuex 中,存储状态的数据被定义为一个对象,称为 state 对象。它是所有组件共享的数据源 |
getters |
用于从 state 中派生出一些状态,类似于计算属性。Getters 可以让你在模板中使用简单的方法计算衍生出来的状态 |
mutations |
用于修改 state 中的数据。Mutations 只能通过提交(commit )来调用,不能直接修改 state 中的数据。这样可以更好地跟踪状态的修改,便于调试。 |
actions |
用于处理异步操作,可以包含任意异步操作。Actions 可以包含多个 Mutation ,并且可以通过提交(commit )调用 Mutation 。Actions 中的操作是异步的,可以用来处理网络请求等操作。 |
modules |
用于将 Vuex 的 store 分割成模块。每个模块拥有自己的 state 、mutations 、actions 和 getters 。 |
具体目录如下:
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实现
- 在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 }
|
- 设置getters
vi src/store/getters.js const getters = { tableDataList: state => state.ad.tableDataList } export defaults getters
|
- 在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案例
需求
- 有三个组件index.vue、search.vue、tableList.vue
- index.vue为search.vue和tablelist.vue的父组件
- 需要实现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) }
|