• vuex和pinia


    Vuex和Pinia都是Vue.js的状态管理库,用于帮助开发者更好地组织和管理应用中的状态。

    Vuex

    Vuex是一个专为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态的一致性。在Vue.js中,当应用变得复杂且组件数量增多时,组件之间的通信和状态管理会变得复杂和冗余。Vuex通过提供一个全局的状态管理机制,将应用中的状态存储在一个单一的、可预测的状态树中(即store),并允许任何组件访问和修改这些状态。

    Vuex的核心概念包括:

    • state:用于存储应用的状态。
    • mutations:用于修改state中的状态,且必须是同步函数。
    • actions:用于处理异步操作,通过提交mutation来间接修改state。
    • getters:用于获取派生状态,即基于state的计算属性。

    示例

    假设我们有一个购物车应用,需要管理购物车中的商品列表。我们可以使用Vuex来管理这个状态。

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. Vue.use(Vuex)
    4. const store = new Vuex.Store({
    5. state: {
    6. shopCarArr: [/* 初始购物车商品列表 */]
    7. },
    8. mutations: {
    9. addToCart(state, product) {
    10. // 将商品添加到购物车
    11. state.shopCarArr.push(product)
    12. },
    13. removeFromCart(state, productId) {
    14. // 从购物车中移除商品
    15. const index = state.shopCarArr.findIndex(item => item.id === productId)
    16. if (index !== -1) {
    17. state.shopCarArr.splice(index, 1)
    18. }
    19. }
    20. },
    21. actions: {
    22. async fetchProducts({ commit }) {
    23. // 异步获取商品列表,并提交mutation更新状态
    24. const products = await fetchProductsFromApi()
    25. commit('updateProducts', products)
    26. }
    27. },
    28. getters: {
    29. cartTotal(state) {
    30. // 计算购物车总价
    31. return state.shopCarArr.reduce((total, product) => total + product.price, 0)
    32. }
    33. }
    34. })

    在组件中,我们可以通过this.$store.state.shopCarArr访问购物车列表,通过this.$store.commit('addToCart', product)添加商品到购物车,以及通过this.$store.dispatch('fetchProducts')异步获取商品列表。同时,我们还可以使用this.$store.getters.cartTotal获取购物车总价。

    Pinia

    Pinia是Vue.js的另一个状态管理库,由Vue的作者维护。它采用了去中心化的架构,将状态分布在多个模块中,每个模块拥有自己的状态、mutations和actions。这使得Pinia在一些小型或简单的项目中可能更容易上手。同时,Pinia在设计之初就对TypeScript提供了原生的支持,提供了更好的类型推导和类型检查的支持。

    示例

    同样以购物车应用为例,使用Pinia管理状态可能如下所示:

     

    1. import { defineStore } from 'pinia'
    2. export const useShopCartStore = defineStore({
    3. id: 'shopCart',
    4. state: () => ({
    5. shopCarArr: [/* 初始购物车商品列表 */]
    6. }),
    7. actions: {
    8. addToCart(product) {
    9. this.shopCarArr.push(product)
    10. },
    11. removeFromCart(productId) {
    12. const index = this.shopCarArr.findIndex(item => item.id === productId)
    13. if (index !== -1) {
    14. this.shopCarArr.splice(index, 1)
    15. }
    16. },
    17. async fetchProducts() {
    18. const products = await fetchProductsFromApi()
    19. this.shopCarArr = products
    20. }
    21. },
    22. getters: {
    23. cartTotal: (state) => {
    24. return state.shopCarArr.reduce((total, product) => total + product.price, 0)
    25. }
    26. }
    27. })

    在组件中,我们可以使用const shopCart = useShopCartStore()来获取store的实例,并通过shopCart.shopCarArr访问购物车列表,通过shopCart.addToCart(product)添加商品到购物车,以及通过shopCart.fetchProducts()异步获取商品列表。同样地,我们可以使用shopCart.cartTotal获取购物车总价。

    Vuex和Pinia在开发中存在一些显著的区别,这些区别主要体现在设计理念、结构、语法以及使用场景等方面。

    首先,从设计理念上看,Vuex采用全局单例模式,通过一个store对象来管理所有的状态,组件通过store对象来获取和修改状态。而Pinia则采用了分离模式,每个组件都拥有自己的store实例,通过在组件中创建store实例来管理状态。这种设计使得Pinia在处理复杂组件间的状态共享时更加灵活和高效。

    其次,从结构上看,Pinia没有mutations,只有state、getters和actions,这与Vuex有所不同。Vuex有State、Getters、Mutations和Actions等核心特性,其中Mutations用于同步地修改state中的数据。而Pinia通过设计提供扁平结构,每个store都是互相独立的,没有命名空间,使得代码分割更加清晰且易于管理。

    再者,从语法和使用上看,Pinia的语法比Vuex更容易理解和使用。Pinia提供了更好的TypeScript支持,使得代码类型检查更加准确,有助于提高代码质量和开发效率。同时,Pinia支持Vue3和Vue2,可以无缝地与不同版本的Vue.js配合使用,为开发者提供了更大的灵活性。

    最后,从使用场景上看,Vuex更适合用于大型项目或需要集中管理共享数据的场景。而Pinia则更适合用于小型或中型项目,以及需要更灵活和高效的状态管理的场景。

     

  • 相关阅读:
    深入理解java泛型
    [JSON] JSON基础知识
    庖丁解牛:NIO核心概念与机制详解 07 _ 字符集
    第144篇:阿里低开项目 init方法
    探索顺序结构:栈的实现方式
    A30 STM32_HAL库函数 之 NAND通用驱动 -- A-- 所有函数的介绍及使用
    基于Xlinx的时序分析与约束(2)----基础概念(上)
    list 模拟与用法
    基于微信小程序的线上课堂系统
    chatgpt API扫盲贴
  • 原文地址:https://blog.csdn.net/geng1025/article/details/137289149