vuex的使用

vuex是vue中用来管理状态的一套解决方案,它提供一个数据中心,用以管理所有组件的状态,当应用中的组件越来越多,根据组件的通信机制,消息的传递会变得难以维护,且在视图渲染中出现问题,比如想象一下一个父组件的数据需要传递给子组件,子组件接收到数据后做了该做的处理之后,需要把数据再返回给父组件,同时通知同级兄弟组件,父组件与兄弟组件收到数据后需要对视图做出改变,这一操作使用通信机制将变得非常复杂,不易维护,如果应用中组件之间充斥着类似需求,想一想都知道组件的状态是无法维护的,再者,组件难免需要一些共享数据,比如登录用户信息,如果没有数据中心的概念,我们只能放在window全局变量中,很明显这种做法不是正规军的做法。另外,使用路由时,当“页面”越来越多,从属关系变得复杂时,“页面”之间的数据传递也是无法有序维护的。vuex的出现即解决了这些难题。

vuex官方演示图
这里写图片描述
vuex需要做的是绿色虚线内的事,vuex中的数据是单向流动的,vuex建立了一个数据中心store,有三个很重要的概念是:
State:store中的数据,可以理解类似vue实例中的data,数据中心中的数据就保存在这
Actions:动作,我们在组件中触发这些动作,这些动作里调用同步或者异步(ajax请求)后,提交触发数据变更请求。可以理解类似vue实例中的methods。
Mutations:实际就是字面意思,变更,mutations由actions触发,改变数据的动作就在这里进行,actions中不直接操作state数据。

安装vuex

npm i vuex -S 

使用vuex

import Vuex from 'vuex'
Vue.use(Vuex)

我们使用的是实际上是Vuex中的store实例。

const store = new Vuex.store()
new Vue({
  el: '#app',
  store,
  render: h => h(App)
})

store实例中的配置项有

new Vuex.Store({
  state:{},
  actions: {},
  mutaitons: {},
  getters: {},
  modules: {},
  strict: true,
  plugins: []
})
  • state:vuex中的根状态对象,用来定义共享的状态对象,类似vue实例中的data
  • actions:状态动作,向store提交调用通知,调用mutaitions中的方法来改变状态,同步、异步操作在这里执行,执行之后提交调用mutations,类似vue实例中的methods,也可以想象成springmvc中的service层,逻辑处理完毕后需要去调用dao完成数据的修改。
  • mutations:状态改变定义,由actions调用,这里没有负责的逻辑,只负责更改state中的数据,可以想象成springmvc中的dao层。
  • getters:state数据获取,类似vue中的computes计算属性,比如要获取的是某个state中数组的长度,或者两个属性之和,当然用计算属性比较合适。
  • modules:state数据的模块,可以理解为命名空间。
  • strict:true为调试模式,false生产模式。
  • plugins:向vuex中添加插件。

vuex中的操作就是围绕着前五个选项进行的。

  • $state.dispatch(‘action名’,参数列表)
    用于组件中触发store的action
  • $state.commit(‘mutation名’,参数列表)
    用于action中调用store的mutation

在实际运用过程中类似view-router,vuex也提供了建议的代码结构。在src下单独建立一个store的目录,用于管理应用的状态。
这里写图片描述
看官方文档即可。
关于vuex的示例代码,官方提供的examples非常清晰了。

vuex github地址
https://github.com/vuejs/vuex

使用是简单的,但是思想是需要慢慢体会消化的,没有什么比动手写代码更好的方法了。

### 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 中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值