Vuex和Pinia

目录

Vuex

简介

使用场景

优点

缺点

示例

Pinia

简介

使用方法

使用场景

优点

缺点

示例


Vuex

简介

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

Vuex的核心理念就是:一个应用的组件树中的所有组件,共享一个全局的状态。不同于单纯的全局对象的形式,Vuex采用了一种技术,将其存储在一个容器中,并利用Vue的响应式机制,实现了状态的实时更新。

使用场景

在大型应用开发中,尤其是管理比较复杂的数据。例如在交互复杂多样的SPA(单页应用)中,业务逻辑深度嵌套、组件间关系复杂、数据流变化频繁的情况下,使用Vuex可以在管理应用状态方面,给开发者减轻负担。

优点

  1. 一致性。对于复杂的应用,Vuex可以帮助我们统一管理应用的状态,让所有组件在读取状态时,都采用统一的方式,从而简化代码开发,提高应用可维护性。
  2. 调试方便。由于所有的状态改变都被追踪到了一个容器中,所以易于监控与追踪。
  3. 易于理解。使用Vuex的框架和理念都是继承了Flux架构,因此对开发者而言,不需要过多的训练便可以理解状态管理的核心思想。

缺点

  1. 使用Vuex有一定的学习成本,不太适合小型应用。
  2. Vuex的使用需要设置比较多的文件与配置,可能造成开发时的繁琐。

示例

Vuex主要有5个组件,包括state、getter、mutation、action和module。

  • 定义state
const state = {
  condition: {
    type: '',
    price: '',
    category: ''
  }
}
  • 定义getter
const getters = {
  getCondition(state) {
    return state.condition
  }
}
  • 定义mutation
const mutations = {
  setCondition(state, payload) {
    state.condition = payload
  }
}
  • 定义action
const actions = {
  updateCondition({ commit }, payload) {
    commit('setCondition', payload)
  }
}
  • 注册模块
new Vuex.Store({
  state,
  getters,
  mutations,
  actions
})

在需要使用条件筛选的组件中,我们可以通过以下方式来读写vuex中的条件:

读取条件

this.$store.getters.getCondition

修改条件

this.$store.dispatch('updateCondition', {type: 'book', price: '10-50', category: 'fiction'})

Pinia

简介

Pinia是Vue.js新一代的状态管理库,可以用来管理Vue 3应用中的数据。它是一个非常轻量级的库,只有3kb的大小,它没有任何依赖,同时与Vue生态系统完美地集成在一起。

使用方法

Pinia的用法非常简单,它提供了如下的API:

  • defineStore:定义一个store。
  • createStore:创建一个store实例。
  • useStore:在组件中使用store实例。

使用场景

Pinia适用于小中型Vue应用,能够有效地简化应用数据状态管理,同时支持异步操作。它可以使代码更加可维护、可扩展,并且更具可读性。Pinia的使用非常灵活,可以轻松地与其他库和插件配合使用。

优点

  1. 体积小。Pinia的体积非常小,只有3kb左右。
  2. 简单易用。Pinia拥有简单的API,易于开发人员上手。
  3. 基于Vue3,并且完美集成于Vue生态系统中。
  4. 支持TypeScript,可以提供完整的类型检查功能。
  5. 可以轻松地与其他库和插件配合使用。

缺点

  1. Pinia目前相对于Vuex来说还比较新,生态不够完善。
  2. 在处理大型应用的多个组件状态时,Pinia会存在不足。

示例

以下是一个简单的示例,我们可以在组件中定义一个计数器的store,并且在组件中使用该store:

  • 定义一个store。
import { defineStore } from 'pinia'
export const useCounterStore = defineStore({
  id: 'counter',
  state: () => ({
    count: 0
  }),
  actions: {
    increment() {
      this.count++
    }
  }
})
  • 在组件中使用store。
import { useCounterStore } from './store'
export default {
  setup() {
    const counter = useCounterStore()
    function handleClick() {
      counter.increment()
      console.log('Current count:', counter.count)
    }
    return { handleClick }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值