uni-app中使用vuex

3 篇文章 0 订阅
本文详细介绍了在Vue.js项目中如何使用Vuex进行状态管理,包括state的基本配置、getter的注册与获取、mutation的提交与action的分发,以及模块化的状态管理。通过实例和简表,帮助开发者理解和实践Vuex在uni-app中的应用。
摘要由CSDN通过智能技术生成

文档

链接:uni-app官网•教程•vue语法•vue2•vuex

大纲

  • 状态管理 (state、getter、mutation、action)
  • 状态管理 (module)
  • 简表


状态管理 (state、getter、mutation、action)

State

配置

  • 步骤
  1. 在 uni-app 项目根目录下,新建 store 目录,在此目录下新建 index.js 文件。在 index.js 文件配置如下:
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    username:'foo',
		age:18
  },
  mutations: { },
  actions: { },
  getters: { }
})
export default store

示例:
在这里插入图片描述

  1. main.js 中导入文件
import Vue from 'vue'
import App from './App'
import store from './store'

Vue.prototype.$store = store

const app = new Vue({
  store,
  ...App
})
app.$mount()

示例:
在这里插入图片描述

获取state

(1)通过属性访问
  • 步骤
  1. 在根节点注入store
import store from '@/store/index.js'
  1. 获取state
store.state.节点state的属性名

示例一:
在这里插入图片描述
示例二:
在这里插入图片描述
示例三:
在这里插入图片描述

(2)通过 this.$store 访问
this.$store.state.节点state的属性名

示例:
在这里插入图片描述

(3)通过 mapState 辅助函数访问
  • 步骤
  1. 引入mapState
import { mapState } from 'vuex'
  1. 在计算属性(computed)中映射:

使用扩展运算符将对象传给computed属性;

给 mapState 传一个字符串数组

(映射的计算属性的名称与 state 的子节点名称相同)

computed: {
	...mapState(['state节点的属性名1', 'state节点的属性名2', ...])
}

示例:
在这里插入图片描述

Getter

可以认为Getter是 store 的计算属性

(就像 computed 计算属性一样,getter 返回的值会根据它的依赖被缓存起来,且只有当它的依赖值发生改变才会被重新计算)

注册getters

  • 步骤
    在 uni-app 项目根目录下,store 目录下的 index.js 文件:
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
	state:{
        obj: {
          username: '111',
          age: 100
        },
        address: '200'
	},
    getters: {
        obj: state => state.obj,
        address: state => state.address
    }
})
export default store

示例:
在这里插入图片描述

获取getters

(1)通过属性访问
  • 步骤
  1. 在根节点注入store
import store from '@/store/index.js'
  1. 获取getters
store.getters.节点getters的属性名

示例一:
在这里插入图片描述

(2)通过 this.$store 访问
this.$store.getters.节点getters的属性名

示例:
在这里插入图片描述

(3)通过 mapGetters 辅助函数访问
  • 步骤
  1. 引入mapGetters
import { mapGetters } from 'vuex'
  1. 在计算属性(computed)中映射:

使用扩展运算符将 getter 混入 computed 对象中

computed: {
	...mapGetters(['getters节点的属性名1', 'getters节点的属性名2', ...])
}

示例:
在这里插入图片描述

Mutation

mutations 里面装着改变数据的方法集合。

通过提交 mutation 的方式来改变状态数据。

每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。回调函数接受 state 作为第一个参数。

mutation 必须是同步函数。

注册mutation

在 uni-app 项目根目录下,store 目录下的 index.js 文件:

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

Vue.use(Vuex)

const store = new Vuex.Store({
	state:{
        count: 10
	},
    mutations: {
		add(state) {
			state.count += 2
		}
	}
})
export default store

在这里插入图片描述

提交mutation

(1)通过 store.commit 调用mutation
  • 步骤
  1. 在根节点注入store
import store from '@/store/index.js'
  1. 调用 store.commit 方法
store.commit('mutation的事件名')

示例:
在这里插入图片描述

  • 传入参数
store.commit('mutation的事件名', 参数)

示例:
在这里插入图片描述

(2)通过 this.$store.commit(‘xxx’) 提交mutation
this.$store.commit('mutation的事件名')

示例:
在这里插入图片描述

  • 传入参数
this.$store.commit('mutation的事件名', 参数)
(3)通过 mapMutations 辅助函数提交
  • 步骤
  1. 引入mapMutations
import { mapMutations } from 'vuex'
  1. 使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用
methods: {
	...mapMutations(['mutations节点的事件名1', 'mutations节点的事件名2', ...])
}

示例:
在这里插入图片描述

  • 传入参数
    示例:
    在这里插入图片描述

Action

action 类似于 mutation ,不同在于:

  • action 提交的是 mutation,通过 mutation 来改变 state ,而不是直接变更状态。
  • action 可以包含任意异步操作。

注册action

action 函数接受一个context 对象(该context 对象与 store 实例具有相同方法和属性),因此可以调用 context.commit 提交一个 mutation。

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

Vue.use(Vuex)

const store = new Vuex.Store({
	state:{
        count: 10
	},
    mutations: {
		add(state) {
			state.count += 2
		}
	},
    actions: {
        addCountAction(context){
          context.commit('add')
        }
    }
})
export default store

示例:
在这里插入图片描述

分发action

(1)通过 store.dispatch 方法触发
  • 步骤
  1. 在根节点注入store
import store from '@/store/index.js'
  1. 分发action
store.dispatch('actions节点的方法名')

示例:
在这里插入图片描述

  • 传入参数
store.dispatch('actions节点的方法名', 参数)

在这里插入图片描述

(2)通过 this.$store.dispatch(‘xxx’) 分发action
this.$store.dispatch('actions节点的方法名')

示例:
在这里插入图片描述

  • 传入参数
this.$store.dispatch('action节点的方法名', 参数)

示例:
在这里插入图片描述

(3)通过 mapActions 辅助函数分发
  • 步骤
  1. 引入mapActions
import { mapActions } from 'vuex'
  1. 使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用
methods: {
	...mapActions(['actions节点的方法名1', 'actions节点的方法名2', ...])
}

示例:
在这里插入图片描述

  • 传入参数
    示例:
    在这里插入图片描述

状态管理 (module)

文档

链接:Vuex•核心概念•Module

配置

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

  • 步骤
  1. 在 store 文件夹下新建 modules 文件夹,并在下面新建 xxx.js 文件等用来存放 vuex 的模块
    在这里插入图片描述

  2. main.js 文件中引入 store
    在这里插入图片描述

  3. 在 store 文件夹下面新建 index.js 文件,作为模块入口,引入各子模块
    在这里插入图片描述
    在这里插入图片描述

  4. 子模块的页面内容

export default {
  state:{

  },
  mutations: {

  },
  actions: {

  },
  getters: {}
}

命名空间

如果希望模块具有更高的封装度,可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。

namespaced: true

示例一:
在这里插入图片描述
示例二:
在mutations中调用mutation事件

this.commit('模块/mutation的事件名')

在这里插入图片描述

getters

  1. 可以在store文件夹下单独定义js文件(getters.js),管理状态
    在这里插入图片描述

  2. getters.js 文件的内容

const getters = {
     count: state => state.moduleA.count //示例
}

export default getters

示例:
在这里插入图片描述

  1. store文件夹下的index.js文件中
    在这里插入图片描述

获取state、提交mutation、分发action

获取state

store.state.moduleA // -> moduleA 的状态
store.state.moduleB // -> moduleB 的状态
(1)通过属性访问
import store from '@/store/index.js'
store.state.模块.节点state的属性名
(2)通过 this.$store 访问
this.$store.state.模块.节点state的属性名
(3)通过 mapState 辅助函数访问
import { mapState } from 'vuex'
computed: {
	...mapState('模块', ['state节点的属性名1', 'state节点的属性名2', ...])
}

示例:
在这里插入图片描述

提交mutation

(1)通过 store.commit 调用 mutation
import store from '@/store/index.js'
store.commit('模块/mutation的事件名')

示例:
在这里插入图片描述

  • 传入参数
store.commit('模块/mutation的事件名', 参数)

示例:
在这里插入图片描述

(2)通过 this.$store.commit(‘xxx’) 提交 mutation
this.$store.commit('模块/mutation节点的事件名')
  • 传入参数
this.$store.commit('模块/mutation节点的事件名', 参数)
(3)通过 mapMutations 辅助函数提交
import { mapMutations } from 'vuex'
methods: {
	...mapMutations('模块', ['mutation节点的事件名1', 'mutation节点的事件名2', ...])
}
  • 传入参数
    示例:
    在这里插入图片描述

分发action

(1)通过 store.dispatch 方法触发
import store from '@/store/index.js';
store.dispatch('模块/actions节点的方法名')
  • 传入参数
store.dispatch('模块/actions节点的方法名', 参数)
(2)通过 this.$store.dispatch(‘xxx’) 分发action
this.$store.dispatch('模块/actions节点的方法名')
  • 传入参数
this.$store.dispatch('模块/actions节点的方法名', 参数)
(3)通过 mapActions 辅助函数分发
import { mapActions } from 'vuex'
methods: {
	...mapActions('模块', ['actions节点的方法名1', 'actions节点的方法名2', ...])
}
  • 传入参数
    示例:
    在这里插入图片描述

createNamespacedHelpers

<script>
import { createNamespacedHelpers } from 'vuex'
const { mapState, mapMutations, mapActions } = createNamespacedHelpers('模块')
export default {
	computed: {
		...mapState(['state节点的属性名1', 'state节点的属性名2', ...])
	},
	methods: {
		...mapMutations(['mutations节点的事件名1', 'mutations节点的事件名2', ...]),
		...mapActions(['actions节点的方法名1', 'actions节点的方法名2', ...])
	}
}
</script>

示例:
在这里插入图片描述

简表

  • state、getter、mutation、action
stategettermutationaction
作用存储状态store的计算属性变更状态提交mutation
定义计算属性名: state => state.属性名函数名(state, payload) {state.属性名 = payload}函数名(context){context.commit(‘事件名’)}
获取/调用 方法一(先注入store:import store from ‘@/store/index.js’store.state.节点state的属性名store.getters.节点getters的属性名store.commit(‘mutation的事件名’)store.dispatch(‘actions节点的方法名’)
传入参数store.commit(‘mutation的事件名’, 参数)store.dispatch(‘actions节点的方法名’, 参数)
获取/调用 方法二this.$store.state.节点state的属性名this.$store.getters.节点getters的属性名this.$store.commit(‘mutation的事件名’)this.$store.dispatch(‘actions节点的方法名’)
传入参数this.$store.commit(‘mutation的事件名’, 参数)this.$store.dispatch(‘actions节点的方法名’, 参数)
获取/调用 方法三①import { mapState } from 'vuex’②…mapState([‘state节点的属性名’])①import { mapGetters } from 'vuex’②…mapGetters([‘getters节点的属性名’])①import { mapMutations } from 'vuex’②…mapMutations([‘mutations节点的事件名’])①import { mapActions } from 'vuex’②…mapActions([‘actions节点的方法名’])
传入参数调用方法,传入参数调用方法,传入参数
  • module
modulestategettermutationaction
作用存储状态store的计算属性变更状态提交mutation
定义计算属性名: state => state.属性名函数名(state, payload) {state.属性名 = payload}函数名(context){context.commit(‘事件名’)}
获取/调用 方法一(先注入store:import store from ‘@/store/index.js’store.state.模块.节点state的属性名store.getters.模块.节点getters的属性名store.commit(‘模块/mutation的事件名’)store.dispatch(‘模块/actions节点的方法名’)
传入参数store.commit(‘模块/mutation的事件名’, 参数)store.dispatch(‘模块/actions节点的方法名’, 参数)
获取/调用 方法二this.$store.state.模块.节点state的属性名this.$store.getters.模块.节点getters的属性名this.$store.commit(‘模块/mutation的事件名’)this.$store.dispatch(‘模块/actions节点的方法名’)
传入参数this.$store.commit(‘模块/mutation的事件名’, 参数)this.$store.dispatch(‘模块/actions节点的方法名’, 参数)
获取/调用 方法三①import { mapState } from 'vuex’②…mapState(‘模块’, [‘state节点的属性名’])①import { mapGetters } from 'vuex’②…mapGetters(‘模块’, [‘getters节点的属性名’])①import { mapMutations } from 'vuex’②…mapMutations(‘模块’, [‘mutations节点的事件名’])①import { mapActions } from 'vuex’②…mapActions(‘模块’, [‘actions节点的方法名’])
传入参数调用方法,传入参数调用方法,传入参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值