vuex和pinia

简介: vuex和pinia

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

Vuex

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

Vuex的核心概念包括:

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

示例

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

import Vue from 'vue'  
import Vuex from 'vuex'  
  
Vue.use(Vuex)  
  
const store = new Vuex.Store({  
  state: {  
    shopCarArr: [/* 初始购物车商品列表 */]  
  },  
  mutations: {  
    addToCart(state, product) {  
      // 将商品添加到购物车  
      state.shopCarArr.push(product)  
    },  
    removeFromCart(state, productId) {  
      // 从购物车中移除商品  
      const index = state.shopCarArr.findIndex(item => item.id === productId)  
      if (index !== -1) {  
        state.shopCarArr.splice(index, 1)  
      }  
    }  
  },  
  actions: {  
    async fetchProducts({ commit }) {  
      // 异步获取商品列表,并提交mutation更新状态  
      const products = await fetchProductsFromApi()  
      commit('updateProducts', products)  
    }  
  },  
  getters: {  
    cartTotal(state) {  
      // 计算购物车总价  
      return state.shopCarArr.reduce((total, product) => total + product.price, 0)  
    }  
  }  
})

在组件中,我们可以通过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管理状态可能如下所示:

 

import { defineStore } from 'pinia'  
  
export const useShopCartStore = defineStore({  
  id: 'shopCart',  
  state: () => ({  
    shopCarArr: [/* 初始购物车商品列表 */]  
  }),  
  actions: {  
    addToCart(product) {  
      this.shopCarArr.push(product)  
    },  
    removeFromCart(productId) {  
      const index = this.shopCarArr.findIndex(item => item.id === productId)  
      if (index !== -1) {  
        this.shopCarArr.splice(index, 1)  
      }  
    },  
    async fetchProducts() {  
      const products = await fetchProductsFromApi()  
      this.shopCarArr = products  
    }  
  },  
  getters: {  
    cartTotal: (state) => {  
      return state.shopCarArr.reduce((total, product) => total + product.price, 0)  
    }  
  }  
})

在组件中,我们可以使用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则更适合用于小型或中型项目,以及需要更灵活和高效的状态管理的场景。

 

相关文章
|
6天前
|
存储 JavaScript API
vuex的使用
vuex的使用
13 0
|
10月前
|
存储 资源调度 JavaScript
Vuex详解,详细讲解一下Vuex
Vuex详解,详细讲解一下Vuex
175 0
|
5月前
vuex
vuex
28 0
|
7月前
|
存储 缓存 API
都2023年了,不允许你还不会使用pinia
都2023年了,不允许你还不会使用pinia
38 0
|
9月前
|
存储 JavaScript API
Pinia使用
Pinia是一个Vue 3的状态管理库。它提供了一个简单但功能强大的API,用于管理应用程序中的数据状态,包括状态的获取、修改和监听等。
69 0
|
11月前
|
存储 JavaScript
Pinia 详解
Pinia 详解
109 0
|
存储 JavaScript API
大菠萝 Pinia 赶紧用起来
上次使用 Vuex4.0 的时候带来的体验不能说很差吧,可以说是非常不好,类型支持需要自定义等等问题让我将目光转向了社区中的新兴势力——Pinia
185 0
|
存储 JavaScript 前端开发
Pinia与Vuex到底哪个好用?什么时候用?
首先,这两个都是Vue的状态管理库。
1545 0
|
存储 JavaScript API
vuex初步认识
Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。当我们在之后介绍到 Modules 时,你就知道 context 对象为什么不是 store 实例本身了。
71 0
|
存储 JavaScript
Vuex(二)
Vuex是一个专为vue.js应用程序开发的状态管理模式。他采用集中式存储来管理应用程序中所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex也集成到了vue的官网调试工具vue-devtools中,提供了诸如零配置的time-travel调试、状态快照导入导出等高级调试功能
117 0