Vue状态管理
在 Vue 3 中,状态管理主要有两种方式:
- 组合式 API (Composition API) +
reactive()/ref()(适用于小型应用) - Pinia(推荐替代 Vuex,适用于中大型应用)
1. 组合式 API 的状态管理
Vue 3 自带的 reactive() 和 ref() 使得我们可以在组件间共享状态,适用于 小型应用或简单的状态管理。
(1)使用 reactive() 创建响应式对象
1 | <script setup> |
📌 特点:
reactive()只能用于 对象,返回的是深层响应式对象。- 访问属性时需要
state.count,不能直接state。
(2)使用 ref() 创建基本数据类型的响应式状态
1 | <script setup> |
📌 特点:
ref()可以用于 基本数据类型(number、string、boolean)。- 访问和修改时必须使用
.value,如count.value++。
(3)跨组件共享状态
在 Vue 3 中,我们可以使用 单独的模块 进行状态管理。
创建 store.js(用于共享状态)
1 | import { reactive } from 'vue'; |
在 A.vue 中使用
1 | <script setup> |
在 B.vue 中使用
1 | <script setup> |
📌 特点:
store在多个组件中共享,A.vue组件修改count后,B.vue也会同步更新。
2. 使用 Pinia 进行状态管理
在中大型应用中,推荐使用 Pinia 作为 Vue 3 的官方状态管理库(Vuex 已被 Pinia 取代)。
(1)安装 Pinia
1 | yarn add pinia |
(2)创建 store/index.js
1 | import { defineStore } from 'pinia'; |
📌 说明:
defineStore('counter', { ... })定义一个名为counter的状态管理模块。state用于存储数据。actions用于定义 修改 state 的方法(类似 Vuex 的mutations+actions)。
(3)在 Vue 组件中使用 Pinia
在 main.js 中注册 Pinia
1 | import { createApp } from 'vue'; |
在 Counter.vue 组件中使用 Pinia
1 | <script setup> |
📌 特点:
- 直接通过
counter.count访问状态。 - 通过
counter.increment()修改状态。
(4)使用 getters 计算属性
有时,我们希望基于 state 计算派生状态,可以使用 getters。
修改 store/index.js
1 | export const useCounterStore = defineStore('counter', { |
在 Counter.vue 中使用 getters
1 | <template> |
📌 特点:
doubleCount作为计算属性,无需手动更新,count变化时自动更新。
(5)Pinia 持久化存储
Pinia 默认状态存储在内存中,刷新后会丢失。我们可以使用 pinia-plugin-persistedstate 进行持久化存储。
安装插件
1 | yarn add pinia-plugin-persistedstate |
修改 store/index.js
1 | import { defineStore } from 'pinia'; |
📌 特点:
persist: true会自动将状态存储在localStorage中,页面刷新后状态不会丢失。
总结
| 方案 | 适用场景 | 主要 API |
|---|---|---|
Vue 3 reactive() / ref() |
适用于小型应用或简单状态管理 | reactive()、ref()、computed() |
| Pinia | 适用于中大型应用,推荐替代 Vuex | defineStore()、useStore()、actions、getters |
| Vuex(不推荐) | Vue 2 时代的状态管理库,Vue 3 已不推荐 | createStore() |
在 Vue 3 中,Pinia 是最推荐的状态管理方案,结合 Composition API 使得代码更加简洁和高效。🚀
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !