Vue狀態管理:Pinia 與 Vuex 的使用方法與對比【文章附有完整案例】

最近在接手vue項目的需求,因為之前一直在做react的需求,日常的vue練習也少了很多,導致現在接手vue項目,很多關于vue的知識點基本上忘得干干凈凈了。但是好在有基礎,重新學也會很快掌握。分享這個過程中的一些復習內容。

本篇分享【狀態管理】相關的內容。


一、狀態管理概述

狀態管理用于解決 Vue 應用中組件間的數據共享問題,尤其適合以下場景:

  • 多個組件需要共享同一數據
  • 不同組件需要修改同一份數據
  • 跨層級組件間的通信

Vuex 作為 Vue 官方推薦的狀態管理庫已有多年歷史,而 Pinia 則是 Vuex 團隊在 Vue 3 時代推出的新方案,目前已成為 Vue 3 項目的官方推薦。

二、Vuex 4.x 的使用方法

Vuex 4 專為 Vue 3 設計,保留了 Vuex 的核心概念,但做了適配 Composition API 的改進。

1. 安裝與配置

npm install vuex@4

創建 store/index.js:

import { createStore } from 'vuex'export default createStore({state() {return {count: 0,message: 'Hello from Vuex'}},mutations: {increment(state) {state.count++},updateMessage(state, newMessage) {state.message = newMessage}},actions: {async updateMessageAsync(context, newMessage) {// 模擬API請求await new Promise(resolve => setTimeout(resolve, 500))context.commit('updateMessage', newMessage)}},getters: {doubleCount(state) {return state.count * 2}}
})

在 main.js 中引入:

import { createApp } from 'vue'
import App from './App.vue'
import store from './store'createApp(App).use(store).mount('#app')

2. 核心概念

  • State:存儲應用狀態的數據源
  • Mutations:唯一可以修改 state 的同步函數
  • Actions:處理異步操作,通過 commit 調用 mutations
  • Getters:從 state 派生出的計算屬性

3. 組件中使用

src/component/VuexPage1.vue

<template><div class="vuex-page1"><h2>Vuex Page 1</h2><p>Count from store: {{ $store.state.count }}</p><p>Double Count: {{ $store.getters.doubleCount }}</p><p>Message: {{ $store.state.message }}</p><button @click="$store.commit('decrement')">Decrement</button><button @click="$store.dispatch('increment')">Increment (via action)</button><button @click="updateMessage">Change Message</button></div>
</template><script setup>
import { useStore } from 'vuex'// 獲取store實例
const store = useStore()// 組件方法
const updateMessage = () => {store.commit('updateMessage', 'Updated from Vuex Page 1')
}
</script><style scoped>
.vuex-page1 {padding: 20px;border: 1px solid #42b983;margin: 10px;background-color: #f0fdf4;
}button {margin: 0 5px;padding: 5px 10px;cursor: pointer;
}
</style>

src/component/VuexPage2.vue

<template><div class="vuex-page2"><h2>Vuex Page 2</h2><p>Count from store: {{ $store.state.count }}</p><p>Double Count: {{ $store.getters.doubleCount }}</p><p>Message: {{ $store.state.message }}</p><button @click="$store.commit('increment')">Increment</button><button @click="$store.commit('reset')">Reset Count</button><button @click="updateMessageAsync">Change Message (Async)</button></div>
</template><script setup>
import { useStore } from 'vuex'// 獲取store實例
const store = useStore()// 組件方法
const updateMessageAsync = () => {store.dispatch('updateMessageAsync', 'Updated from Vuex Page 2 (Async)')
}
</script><style scoped>
.vuex-page2 {padding: 20px;border: 1px solid #3498db;margin: 10px;background-color: #f0f7ff;
}button {margin: 0 5px;padding: 5px 10px;cursor: pointer;
}
</style>

App.vue

<template><div id="app"><h1>Vuex Store Test</h1><VuexPage1 /><VuexPage2 /></div>
</template><script setup>
import VuexPage1 from './components/VuexPage1.vue'
import VuexPage2 from './components/VuexPage2.vue'
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

?4.效果展示

三、Pinia 的使用方法

Pinia 是 Vuex 的繼任者,簡化了狀態管理的寫法,天然支持 TypeScript,更符合 Vue 3 的 Composition API 風格。

1. 安裝與配置

npm install pinia

創建 store/index.js:

import { createPinia } from 'pinia'
export default createPinia()

創建 store/counterStore.js:

import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', {state: () => ({count: 0,message: 'Hello from Pinia'}),actions: {increment() {this.count++},async updateMessageAsync(newMessage) {await new Promise(resolve => setTimeout(resolve, 500))this.message = newMessage}},getters: {doubleCount() {return this.count * 2}}
})

在 main.js 中引入:

import { createApp } from 'vue'
import App from './App.vue'
import store from './store'createApp(App).use(store).mount('#app')

2. 核心概念

  • Store:每個 store 都是一個獨立的模塊
  • State:存儲狀態的數據源
  • Actions:可以包含同步和異步操作,直接修改 state
  • Getters:計算屬性,基于 state 派生

3. 組件中使用

src/component/Page1.vue

<template><div class="page1"><h2>Page 1</h2><p>Count from store: {{ counterStore.count }}</p><p>Message: {{ counterStore.message }}</p><button @click="counterStore.increment">Increment</button><button @click="counterStore.decrement">Decrement</button><button @click="counterStore.changeMultiplier(5)">changeMultiplier</button><button @click="beMultiplier">beMultiplier</button><button @click="changeMessage">Change Message</button></div>
</template><script setup>
import { useCounterStore } from '../store/counterStore'// 獲取store實例
const counterStore = useCounterStore()// 組件方法
const changeMessage = () => {counterStore.updateMessage('Updated from Page 1')
}
const beMultiplier=()=>{counterStore.beMultipliedBy(4)
}
</script><style scoped>
.page1 {padding: 20px;border: 1px solid #ccc;margin: 10px;
}button {margin: 0 5px;padding: 5px 10px;
}
</style>

src/component/Page2.vue

<template><div class="page2"><h2>Page 2</h2><p>Count from store: {{ counterStore.count }}</p><p>Message: {{ counterStore.message }}</p><button @click="counterStore.increment">Increment</button><button @click="counterStore.reset">Reset Count</button><button @click="changeMessage">Change Message</button></div>
</template><script setup>
import { useCounterStore } from '../store/counterStore'// 獲取store實例
const counterStore = useCounterStore()// 組件方法
const changeMessage = () => {counterStore.updateMessage('Updated from Page 2')
}
</script><style scoped>
.page2 {padding: 20px;border: 1px solid #666;margin: 10px;background-color: #f5f5f5;
}button {margin: 0 5px;padding: 5px 10px;
}
</style>

App.vue


<template><div id="app"><h1>Pinia Store Test</h1><Page1 /><Page2 /></div>
</template><script setup>
import Page1 from './components/Page1.vue'
import Page2 from './components/Page2.vue'
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

4.?效果展示

?

四、Pinia 與 Vuex 的核心區別

特性Vuex 4Pinia
模塊化需要通過 modules 創建模塊每個 store 都是獨立模塊,天然支持模塊化
狀態修改必須通過 mutations直接在 actions 中修改,或直接修改 state
異步操作需要在 actions 中處理可以在 actions 中直接處理
TypeScript 支持有限,需要額外類型定義原生支持,類型推斷更友好
代碼簡潔性較繁瑣,需要 commit/dispatch 區分更簡潔,直接調用方法
開發者工具支持支持支持,且有更好的時間線追蹤
插件系統豐富兼容 Vuex 的插件,且有新的插件系統

五、如何選擇

  1. 新項目:優先選擇 Pinia,它是 Vue 官方推薦的最新方案,API 更簡潔,TypeScript 支持更好。

  2. 已有 Vuex 項目

    • 若項目穩定運行,無需急于遷移
    • 若進行重大重構,可考慮遷移到 Pinia
    • Vuex 4 仍會維護,但不會有新功能
  3. 團隊因素:如果團隊已熟悉 Vuex,且項目復雜度不高,繼續使用 Vuex 也是合理選擇。

六、總結

Pinia 和 Vuex 都是優秀的 Vue 狀態管理方案,它們解決的核心問題相同,但實現方式有所不同。

Vuex 作為成熟的狀態管理庫,有著完善的生態和社區支持,適合需要嚴格規范狀態修改流程的大型項目。而 Pinia 則代表了未來的發展方向,它簡化了狀態管理的寫法,提供了更好的開發體驗和 TypeScript 支持。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90197.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenMed 項目深度分析:推動醫療 NLP 領域的開源革命

摘要 醫療人工智能(AI)領域因高質量數據和模型的獲取受限而發展緩慢。OpenMed 項目通過開源超過380個醫療命名實體識別(NER)模型,顯著降低了研究與應用門檻。本文從項目背景、技術優勢、應用場景、實施挑戰及未來展望五個方面,系統分析 OpenMed 的核心價值與潛力,揭示其…

大模型開發

什么是Ai&#xff1f;AI的全拼是(Artificial Intelligence)人工智能&#xff0c;使機器能夠像人類一樣思考、學習和解決問題的技術。在AI的應用情況下我們更多的是學習自然語言處理。在自然語言處理(Natural Language Processing&#xff0c;NLP)中&#xff0c;有一項關鍵技術叫…

【正常配置了beast擴展,phpinfo信息也顯示了,但是就是不運行】

正常配置了beast擴展&#xff0c;phpinfo信息也顯示了&#xff0c;但是就是不運行場景原因解決排查過程擴展場景 項目中使用到了beast進行源碼保護&#xff0c;指定類存在&#xff0c;但是報錯信息提示類找不到&#xff0c;beast擴展添加到了正在運行的php版本下的ext文件夾下…

CRMEB 單商戶PRO多商戶通用去版權教程

CRMEB去版權教程&#xff0c;此教程可根據具體版本進行調整&#xff0c;基本適用次方法。 后端版權修改 修改后端管理底部版權及門店后端管理底部版權。 文件位置 \view\admin\src\components\copyright\index.vue 文件位置 \view\admin\src\router\routes.js 文件位置 \vi…

舊物回收小程序系統開發:重塑舊物回收產業新生態

在傳統觀念中&#xff0c;舊物回收往往給人一種臟亂差、效率低下的印象&#xff0c;回收過程繁瑣&#xff0c;回收渠道有限&#xff0c;導致許多可回收物被浪費。然而&#xff0c;隨著信息技術的飛速發展&#xff0c;舊物回收小程序系統的開發正為這一古老行業帶來前所未有的變…

SSE和WebSocket區別到底是什么

文章目錄SSE 與 WebSocket&#xff1a;深入剖析兩者核心差異核心差異&#xff1a;單向 vs. 雙向通信技術細節對比協議與連接數據格式錯誤處理與可靠性適用場景&#xff1a;何時選擇 SSE&#xff0c;何時選擇 WebSocket&#xff1f;總結SSE 與 WebSocket&#xff1a;深入剖析兩者…

西安電子科技大學金融學431考研經歷分享

考研數學是區分度最大的科目之一&#xff0c;如何高效備考&#xff1f;本文為你推薦多位名師和經典書籍&#xff0c;助你在每個階段都能穩步提升&#xff0c;最終沖刺成功。一、考研數學備考策略教師推薦① 高等數學&#xff1a;② 線性代數&#xff1a;③ 概率論與數理統計&am…

laravel RedisException: Connection refused優雅草PMS項目管理系統報錯解決-以及Redis 詳細指南-優雅草卓伊凡

laravel RedisException: Connection refused優雅草PMS項目管理系統報錯解決-以及Redis 詳細指南-優雅草卓伊凡今天來開始更新pms系統&#xff0c;因為我們ppt上面要做&#xff0c;才發現原來打不開&#xff0c;此前主要是事情太多&#xff0c;我們一直有很多東西擱置解決 Lara…

拉力覆冰在線監測裝置:電力線路安全運行的數字化守衛者

在極端天氣頻發的背景下&#xff0c;輸電線路覆冰災害已成為威脅電網穩定運行的關鍵因素。拉力覆冰在線監測裝置通過數字化技術構建起全天候監測體系&#xff0c;為電力運維提供精準數據支撐。本文從技術實現與實際應用價值角度&#xff0c;解析該裝置的核心功能與行業意義。核…

AI面試如何提升物流行業招聘效率?實戰案例解析

每年秋招季&#xff0c;物流行業都會迎來海量應屆生簡歷涌入。面對業務快速擴張與人才篩選壓力&#xff0c;傳統線下面試流程長、標準模糊、成本高昂等問題愈發凸顯。本文通過兩大物流頭部企業的實戰案例&#xff0c;解析AI面試如何破解招聘困局&#xff0c;實現效率與質量的雙…

【機器學習】組合優化問題combination-optimization概述

博主簡介&#xff1a;努力學習的22級計算機科學與技術本科生一枚&#x1f338;博主主頁&#xff1a; Yaoyao2024往期回顧&#xff1a;【二分圖算法】手把手教你學會&#xff1a;染色法&#xff08;判斷二分圖&#xff09;、匈牙利算法&#xff08;二分圖的最大匹配&#xff09;…

Linux網絡編程-osi、udp

網絡&#xff1a;不同主機&#xff0c;進程間通信達到不同主機之間的困難&#xff1a;解決主機之間的硬件層面的互聯互通解決主機之間的軟件層面的互聯互通廣域網&#xff1a;進行大范圍網絡數據交換IP地址&#xff1a;區分不同主機 唯一的&#xff08;軟件地址&#xff09;MAC…

刪除 XML 格式中雙引號內的空格

要使用 Shell 命令刪除 XML 格式中雙引號內的空格&#xff08;僅處理屬性值中的空格&#xff0c;保留標簽外的空格&#xff09;&#xff0c;可以使用以下 sed 命令&#xff1a; sed -i :loop; s/\("[^"]*\) \([^"]*"\)/\1\2/g; t loop filename.xml命令詳解…

電腦聲音修復?【圖文詳解】電腦沒有聲音?聲音異常

一、問題背景 在使用電腦的過程中&#xff0c;聲音異常是很常見的問題。比如明明打開了音頻文件&#xff0c;卻聽不到任何聲音&#xff1b;或者聲音忽大忽小、伴有雜音&#xff1b;或者更新了聲卡驅動后&#xff0c;電腦播放不了聲音了&#xff1b;還有可能是插入耳機后&#x…

【文獻筆記】ARS: Automatic Routing Solver with Large Language Models

ARS: Automatic Routing Solver with Large Language Models https://github.com/Ahalikai/ARS-Routbench/ ARS&#xff1a;基于大語言模型的自動路由求解器 1. 概述 1.1. 研究背景 車輛路徑問題&#xff08;VRP&#xff09;是一類經典的組合優化問題&#xff0c;廣泛應用于…

RK3568筆記九十:基于web顯示RTSP流

若該文為原創文章,轉載請注明原文出處。 在網上看到個方案,使用web顯示RTSP視頻流,思路是前端傳入RTSP地址,cgi通過FFMPEG接收RTSP流并保存成avi文件,在通過ffmpeg 命令把avi文件保存成mp4文件,前端在播放mp4文件。此方案需要先保存文件,在轉換文件,無法實時播放。 所以…

2025年Flutter開發主流技術棧

2025年Flutter開發主流技術棧 Flutter作為一種高效、跨平臺的移動應用開發框架&#xff0c;近年來在開發者社區中越來越受歡迎。以下是2025年Flutter開發的主流技術棧&#xff0c;涵蓋了從核心框架到開發工具、狀態管理、數據存儲等多個方面。 1. 核心框架 Flutter&#xff1a;…

Qt 常用控件 - 1

控件概述 編程講究的是 --- 站在巨人的肩膀上 --- 不是編寫一個圖形化界面上的內容 --- Qt 已經提供了很多控件了&#xff01;&#xff01;&#xff01;提高圖形化界面的開發效率&#xff01;&#xff01;&#xff01;重點變成我們怎么使用這些已有的控件&#xff01; Widge…

springdoc-openapi-ui的使用教程

<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.6.14</version> </dependency>springdoc-openapi-ui 是一個用于生成 OpenAPI 文檔的庫&#xff0c;它與 Swagger 的關…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-3,(運放/三極管)

目錄 1、題目 2、解答 【硬件-筆試面試題】硬件/電子工程師&#xff0c;筆試面試題-3&#xff0c;&#xff08;運放/三極管&#xff09; 這是一道大疆的筆試題 1、題目 2、解答