Vuex的使用

本文详细介绍了Vuex——一个专为Vue.js应用程序设计的状态管理模式+库。内容覆盖Vuex的基本概念、核心组件如state、getters、mutations及actions的使用方法,并提供了在项目中安装配置Vuex的具体步骤。

Vuex是什么

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
好处:定义全局变量,让其在各个页面上实现数据的共享包括状态,并且可操作

存储组件的状态包括:
 

export default {
	namespaced: true,//开启命名空间,防止变量或方法重名
	state: {//state类似于vue页面中的 data{}
		score: 10000,
		rank: 100
	},
	getters: {//计算属性,当state改变时,计算出最新值到页面去
		rank(state) {
			return Math.floor(state.score / 10);
		}
	},
	mutations: {//改变state的唯一方式
		SET_SCORE(state, data) {
			state.score = data;
		}
	},
	actions: {//actions动作 异步,延迟方法,不能直接修改state 提交mutation,可以包含异步操作   
 //异步的赋值(但是其实就是在Mutations的基础上包装了一层)
		login(context) {
			alert("我是test的login");
			context.commit("SET_SCORE", 2048);
		}
	},
    modules:{
        Module将vuex进行分模块
    }
}

在项目中安装和配置 Vuex
进入项目目录,安装包(这里说明一下,如果是vue2的项目,那么就需要按照下面的指定版本号,如果是vue3不需要指定版本号,直接npm i vuex就可以了)

npm install vuex@3.6.2 -S

与router一样,当我们在项目中使用vuex之后,为了方便代码维护,我们一般需要做特殊的目录调整,约定的结构如下:

 

 

 在store/index.js 中放置具体的代码
 

在src/main.js中:

  1. 导入store
  2. 并注入Vue实例

 

 如果自定义安装Vue安装了vuex就不用再配置了

个个组件之间的使用:

在组件中,通过this.$store.state.属性名来访问。

在模板中,则可以省略this而直接写成: {{$store.state.属性名}}

使用 Vuex 提供的 mapState 辅助函数,可以方便的把 Store 中指定的数据,映射为当前组件的计算属性:

写在组件页面的计算属性内:

computed: { 
  ...mapState(['xxx']), 
  ...mapState({'新名字': 'xxx'})
}
定义好之后直接用 新名字就可以访问 全局变量

调用Mutations修改公共数据:

直接使用 this.$store.commit('mutation名', 载荷) 来调用

使用Vuex 提供的 mapMutations 辅助函数,可以方便的把 Store 中指定的方法,映射为当前组件的 methods

methods: { 
  ...mapMutations(['mutation名']), 
  ...mapMutations({'新名字': 'mutation名'})
}

注意:Mutation 必须是同步函数Mutation 里面不能放异步代码


调用actions执行异步函数:

直接使用:在组件中通过this.$store.dispatch('actions的名字', 参数)来调用action


 使用Vuex 提供的 mapActions 辅助函数,可以方便的把 Store 中指定的 Action,映射为当前组件的 methods:
 

methods: { 
    ...mapActions(['actions名']),
     ...mapActions({'新名字': 'actions名'}) 
}

 modules来拆分复杂的业务

所有的全局数据、方法都集中在了一起,导致 Vuex 的结构混乱,不利于现阶段的开发和后期的维护

modules的作用

拆分模板,把复杂的场景按模块来拆开

使用了modules之后,在访问数据时就要额外添加modules的名字了。

结论: 在使用modules时,建议都给加上namespaced!

### Vuex 使用指南及实现状态管理示例 Vuex 是一个专为 Vue.js 应用设计的状态管理库,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化[^1]。以下是关于 Vuex 的核心概念和使用方法的详细说明。 #### 1. 核心概念 Vuex 的核心概念包括以下几个部分: - **State**:用于存储共享的状态数据。 - **Getter**:类似于 Vue 组件中的计算属性,用于从 state 中派生出一些状态。 - **Mutation**:用于同步地修改 state 的方法。 - **Action**:类似于 mutation,但可以包含异步操作,最终会提交 mutation 来改变 state。 - **Module**:将 store 分割成模块,使代码更易于维护。 #### 2. 创建 Vuex Store 在项目中创建一个 `store.js` 文件,定义 Vuex 的 store: ```javascript // store.js import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state: { count: 0 // 示例状态 }, getters: { doubleCount(state) { return state.count * 2; // 计算属性示例 } }, mutations: { increment(state) { state.count++; // 同步修改状态 } }, actions: { incrementAsync({ commit }) { setTimeout(() => { commit('increment'); // 异步操作后提交 mutation }, 1000); } } }); ``` #### 3. 在 Vue 实例中引入 Store 在 `main.js` 文件中引入并挂载 store: ```javascript // main.js import Vue from 'vue'; import App from './App.vue'; import store from './store'; new Vue({ store, // 挂载 store render: h => h(App) }).$mount('#app'); ``` #### 4. 在组件中使用 Vuex 通过 `mapState`、`mapGetters`、`mapMutations` 和 `mapActions` 辅助函数简化对 Vuex 的访问: ```javascript <template> <div> <p>Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click="increment">Increment</button> <button @click="incrementAsync">Increment Async</button> </div> </template> <script> import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'; export default { computed: { ...mapState(['count']), // 映射 state 到本地计算属性 ...mapGetters(['doubleCount']) // 映射 getter 到本地计算属性 }, methods: { ...mapMutations(['increment']), // 映射 mutation 到本地方法 ...mapActions(['incrementAsync']) // 映射 action 到本地方法 } }; </script> ``` #### 5. 状态持久化 未进行持久化配置可能导致状态丢失、数据不一致或重复操作等问题[^3]。可以通过插件如 `vuex-persistedstate` 实现状态持久化: ```javascript // store.js import createPersistedState from 'vuex-persistedstate'; export default new Vuex.Store({ state: { count: 0 }, plugins: [createPersistedState()] // 添加持久化插件 }); ``` 这样,即使页面刷新,状态也会被保存到 localStorage 或 sessionStorage 中。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值