Vue的状态管理——Vuex3&4&Pinia

Vue3中Vuex的使用_vue3 vuex-CSDN博客

VueX详解_组合式vuex-CSDN博客

15分钟学会Pinia

Vuex 3和4详解

Vuex 3

Vuex 3是Vue.js 2.x版本的状态管理库,它提供了一种集中式存储和管理组件状态的方式。以下是Vuex 3的一些关键特性:

  1. 状态集中管理:Vuex 3的状态是集中存储的,所有的状态都放在一个树状结构中,并且只能通过mutations来修改状态。
  2. 响应式状态:当状态发生改变时,相关的组件会自动更新。
  3. 模块化:虽然Vuex 3本身不支持模块热替换,但可以通过将状态划分为不同的模块来提高代码的可维护性和可扩展性。
  4. 插件系统:Vuex 3的插件接口相对简单,通过storesubscribe方法来监听全部的状态变化。

Vuex 4

Vuex 4是Vue.js 3.x版本的状态管理库,它在Vuex 3的基础上进行了多项改进和优化,使其更加适用于大型应用和复杂场景。以下是Vuex 4的一些新特性:

  1. 状态分割和模块热替换:Vuex 4引入了状态分割和模块热替换的概念,状态可以分割成多个模块,每个模块拥有自己的状态、操作和订阅。这种分割的方式有助于组织和维护大型应用中的状态,并且可以通过热替换来动态添加或移除模块。
  2. 响应式状态管理改进:Vuex 4通过引入markRawshallowRef的概念,对响应性进行进一步改进。使用markRaw可以标记一个对象为非响应式的,使用shallowRef可以创建一个浅响应式对象,如果浅响应式对象的属性变化,不会触发组件的更新。
  3. 插件接口改进:Vuex 4通过引入subscribeActionsubscribeMutationsubscribeGetter方法来对插件接口进行改进,使得开发者可以更加细粒度地对应用程序的状态进行监听和处理。
  4. 性能优化:Vuex 4减少了状态变化时的不必要计算和更新,提高了性能。
  5. TypeScript支持:Vuex 4支持TypeScript,提供了更好的类型检查和开发工具支持。
  6. Vuex持久化插件:vuex-persistedstate

Pinia详解

Pinia是Vue.js 3.x的状态管理库,它可以看作是Vuex的升级版,旨在提供一种更简单、更直观的方式来管理Vue.js应用程序的状态。以下是Pinia的一些关键特性:

  1. 状态管理:Pinia提供了一个集中的位置来存储和管理应用程序的状态。
  2. 模块化状态:Pinia支持将状态划分为不同的模块,以提高代码的可维护性和可扩展性。每个模块可以包含自己的状态、getters、mutations和actions。
  3. 状态订阅:Pinia允许开发者订阅状态的变化,并在状态发生变化时触发相应的回调函数。
  4. 缓存和持久化:Pinia支持缓存状态数据以提高性能,并支持将状态数据持久化到本地存储或后端数据库中。
  5. 与Vue.js生态系统无缝集成:Pinia与Vue.js的其他工具和库配合良好,可以轻松地与Vue Router等一起使用。
  6. 轻量级:Pinia非常轻巧,只有大约1kb的大小。
  7. 类型安全:通过类型推断,Pinia可以提供自动完成的功能。
  8. Vue Devtools支持:Pinia支持Vue Devtools,可以方便地进行调试。

Vuex 3、Vuex 4与Pinia的对比表格

特性/库Vuex 3Vuex 4Pinia
Vue版本兼容性Vue 2.xVue 3.xVue 3.x
状态管理方式集中存储,通过mutations修改集中存储,支持状态分割和模块热替换集中存储,模块化设计
响应式状态管理响应式,自动更新组件引入markRawshallowRef进行改进响应式,自动更新组件
插件接口简单,通过subscribe监听全部状态变化改进,引入subscribeActionsubscribeMutationsubscribeGetter灵活,支持多种扩展方式
TypeScript支持无原生支持,但可配合工具使用原生支持,提供更好的类型检查和开发工具支持原生支持,提供类型安全
模块化支持,但无模块热替换支持状态分割和模块热替换支持模块化状态管理
缓存和持久化需要额外插件或手动实现类似Vuex 3,可能需要额外插件或手动实现内置支持缓存和持久化
性能优化依赖于Vue 2.x的性能优化进一步优化了状态变化的计算和更新轻量化设计,性能良好
生态系统支持成熟,广泛应用于Vue 2.x项目逐渐完善,适用于Vue 3.x项目适用于Vue 3.x项目,新兴但受欢迎
学习曲线相对较陡峭,API较为复杂类似于Vuex 3,但引入了新特性和改进较简单,更直观,易于上手

Vuex 3 示例

安装 Vuex 3(注意:Vue 3 项目通常不使用 Vuex 3,但为了完整性,这里仍提供示例)

对于 Vue 2 项目,你可以安装 Vuex 3:

npm install vuex@3 --save

配置 Vuex Store(Vue 2 示例)

在 Vue 2 项目中,你可能会在 src/store/index.js 中设置 Vuex store:

import Vue from 'vue'; 
import Vuex from 'vuex'; 


Vue.use(Vuex); 


export default new Vuex.Store({ 
state: { 
count: 0 
}, 
mutations: { 
increment(state) { 
state.count++; 
} 
}, 
actions: { 
incrementIfOddOnRootSum({ state, commit, rootState }) { 
if ((state.count + rootState.otherCount) % 2 === 1) { 
commit('increment'); 
} 
} 
}, 
modules: { 
// 模块可以在这里定义 
} 
});

在 Vue 组件中使用 Vuex 3:

<template> 
<div>{{ count }}</div> 
<button @click="increment">Increment</button> 
</template> 


<script> 
export default { 
computed: { 
count() { 
return this.$store.state.count; 
} 
}, 
methods: { 
increment() { 
this.$store.commit('increment'); 
} 
} 
} 
</script>

注意:在 Vue 3 项目中,你通常会使用 Vuex 4 或 Pinia 而不是 Vuex 3。

Vuex 4 示例

安装 Vuex 4

对于 Vue 3 项目,安装 Vuex 4:

npm install vuex@next --save # 或使用 vuex@4
import { createStore } from 'vuex'; 


export default createStore({ 
state() { 
return { 
count: 0 
}; 
}, 
mutations: { 
increment(state) { 
state.count++; 
} 
}, 
actions: { 
incrementIfOdd({ commit, state }) { 
if (state.count % 2 === 1) { 
commit('increment'); 
} 
} 
}, 
modules: { 
// 模块可以在这里定义 
} 
});

配置 Vuex Store(Vue 3 示例)

在 Vue 3 项目中,你可能会在 src/store/index.js 或 src/store/index.ts 中设置 Vuex store:

在 Vue 组件中使用 Vuex 4(与 Vuex 3 类似,但通常是在 Vue 3 上下文中):

<template> 
<div>{{ count }}</div> 
<button @click="increment">Increment</button> 
</template> 


<script> 
import { useStore } from 'vuex'; 


export default { 
setup() { 
const store = useStore(); 


const count = computed(() => store.state.count); 


const increment = () => { 
store.commit('increment'); 
}; 


return { count, increment }; 
} 
} 
</script>

注意这里使用了 Vue 3 的 Composition API。

Pinia 示例

安装 Pinia

npm install pinia --save

配置 Pinia Store

在 Vue 3 项目中,你可以在 src/stores/index.js 或 src/stores/index.ts 中设置 Pinia store:

import { defineStore } from 'pinia'; 


export const useCounterStore = defineStore('counter', { 
state: () => ({ 
count: 0 
}), 
actions: { 
increment() { 
this.count++; 
} 
} 
});

在 Vue 组件中使用 Pinia:

vue复制代码

<template> 
<div>{{ count }}</div> 
<button @click="increment">Increment</button> 
</template> 


<script> 
import { useCounterStore } from '@/stores/index'; 


export default { 
setup() { 
const store = useCounterStore(); 


const count = computed(() => store.count); 


const increment = () => { 
store.increment(); 
}; 


return { count, increment }; 
} 
} 
</script>

同样,这里也使用了 Vue 3 的 Composition API。注意,Pinia 的用法与 Vuex 4 在 Composition API 上下文中非常相似,但 Pinia 的 API 和概念可能更加直观和易于理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值