Vuex的基本用法、使用场景以及缺点和解决方案

  大家好~ 我是前端uio,本文主要介绍Vuex的基本用法、使用场景以及缺点和解决方案,最后在Vue3中与Pinia进行比较。有什么疑问都欢迎私聊或者在评论区留言。如果需要开发web网页或者微信小程序都可以找我私聊,我会尽可能回答我了解的内容。


一、基本介绍

1.可参考官方文档进行学习( Vuex的使用 )

        Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

2.作用

        i)集中管理状态:Vuex 允许开发者将应用的状态集中存储在一个地方,便于管理和维护。
       ii)使状态响应式:Vuex 的状态是响应式的,当状态发生变化时,依赖这些状态的组件会自动更新。
       ii)强制使用单一数据源:Vuex 要求开发者通过 mutations 来改变状态,这样可以避免直接修改状态,从而保证状态的一致性。
      iv)便于调试:Vuex 的状态变化可以被追踪,这有助于开发者更好地理解应用的工作原理,并进行调试。

3.使用场景

        i)单页应用

        在单页应用中,组件之间的状态共享、音乐播放控制、登录状态管理、购物车管理等都可以通过 Vuex 来实现

       ii)复杂的组件通信

        Vuex 可以解决多层级组件嵌套时的状态传递问题,使得组件之间的通信更为清晰和易于管理。

      iii)数据中心化

        Vuex 作为数据中心,可以集中管理应用的状态,避免数据在不同组件之间的重复存储和不一致性。

二、基本用法

1.创建 Vuex Store

  在Vue 项目中创建一个 store 文件夹,并在该文件夹内创建 index.js 文件作为 Vuex 的入口文件。

// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    message: '胡桃!'
  },
  mutations: {
    updateMessage(state, newMessage) {
      state.message = newMessage;
    }
  },
  actions: {
    changeMessage({ commit }, newMessage) {
      setTimeout(() => {
        commit('updateMessage', newMessage);
      }, 1000); // 模拟异步操作
    }
  }
});

export default store;

2.在组件中使用Vuex

        i)使用 mapStatemapMutations 和 mapActions 辅助函数来简化代码。这些辅助函数允许我们将 Vuex 的状态、mutations 和 actions 映射到 Vue 组件的计算属性和方法中

// App.vue
<template>
  <div>
    <h1>{{ message }}</h1>
    <button @click="changeMessage">Change Message</button>
  </div>
</template>

<script>
import { mapState, mapMutations, mapActions } from 'vuex';

export default {
  computed: {
    ...mapState(['message'])
  },
  methods: {
    ...mapMutations(['updateMessage']),
    ...mapActions(['changeMessage'])
  }
};
</script>

        ii)如果你需要从 Vuex Store 中获取经过计算的状态,可以使用 getters。

        ① 使用 mapGetters 辅助函数来将 Vuex 的 getter 映射到 Vue 组件的计算属性中。

// store/index.js
getters: {
  reversedMessage(state) {
    return state.message.split('').reverse().join('');
  }
}
// App.vue
<template>
  <div>
    <h1>{{ reversedMessage }}</h1>
  </div>
</template>

<script>
import { mapState, mapGetters } from 'vuex';

export default {
  computed: {
    ...mapState(['message']),
    ...mapGetters(['reversedMessage'])
  }
};
</script>

        ② 直接访问 $store.state

<template>
  <!-- 模板中的内容 -->
</template>

<script>
export default {
  methods: {
    incrementCount() {
      this.$store.state.count++; // 直接访问 Vuex store 中的 count 状态并增加它的值
    }
  }
};
</script>

三、缺点以及解决方式

1.缺点:刷新导致状态重置,数据丢失

        当浏览器进行刷新时,Vuex中的状态会重新变为初始状态,这可能导致用户体验上的不便,简单来说,就是数据没有保存在本地,特别是在用户登录或提交订单后跳转到另一个页面,如果此时刷新浏览器,可能会丢失重要的 信息,如token令牌或订单状态。

2.解决方式:使用状态持久化插件

        可以根据缺点产生的原因来进行解决,可以手动进行配置,进行本地化保存,也可以使用如vuex-persistedstate这样的插件来解决刷新浏览器导致状态重置的问题。这些插件可以在页面刷新前将Vuex中的数据保存到浏览器缓存中,页面刷新后,再从缓存中恢复数据,确保状态的持续性。

四、总结与思考

 1.使用Vuex的场景(用户登录状态、购物车管理等)

2.在vue3中,使用pinia进行状态管理,与Vuex有什么不同(弃用mutation,用action处理同步、异步方法,使用pinia-plugin-persistedstate进行状态管理)

  • 32
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vuex和Pinia都是用于状态管理的库,但它们在用法和一些方面上存在一些差异。 VuexVue.js官方推荐的状态管理库,它使用中央化的方式管理应用的状态。在Vuex中,你需要定义一个全局的store来存储应用程序的状态,并使用mutations来修改状态,actions来处理异步操作。Vuex提供了一些辅助函数如`mapState`,`mapGetters`等来简化在组件中的状态获取和更新。Vuex还提供了插件系统和严格模式来帮助开发者更好地调试和追踪状态的变化。 Pinia是一个基于Vue 3 Composition API的状态管理库,它提供了类似Vuex的功能。与Vuex不同,Pinia使用了分散化的方式管理状态,每个模块都有自己的store。在Pinia中,你可以定义多个store模块,并使用`defineStore`来创建store实例。在组件中,你可以使用`useStore`函数来访问和更新store中的状态。Pinia还提供了类似于Vuex的辅助函数来简化在组件中的状态操作。 优点方面,Vuex是一个成熟且广泛使用的库,在Vue社区中有很多资源和支持。它提供了丰富的功能和插件系统,并且在大型应用程序中表现良好。而Pinia是基于Vue 3的Composition API开发的,可以更好地利用新的Vue特性和优点。它还具有较小的包大小和更好的性能。 缺点方面,Vuex在一些情况下可能会显得过于重量级,对于小型应用来说可能有些过度设计。而Pinia虽然是一个很有潜力的库,但由于它相对较新,可能在社区支持和插件生态方面还不如Vuex成熟。 总的来说,选择使用Vuex还是Pinia取决于你的项目需求和团队的偏好。如果你使用的是Vue 2,而且项目较大或者你喜欢中央化的状态管理方式,那么Vuex是一个很好的选择。如果你正在使用Vue 3并且更喜欢分散化的状态管理方式,那么Pinia可能更适合你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值