Vue中的狀態管理器Vuex被Pinia所替代-上手使用指南

Pinia.js 是新一代的狀態管理器,由 Vue.js團隊中成員所開發的,因此也被認為是下一代的 Vuex,即 Vuex5.x,在 Vue3.0 的項目中使用也是備受推崇

Pinia.js 有如下特點:

  • 完整的 typescript 的支持;
  • 足夠輕量,壓縮后的體積只有1.6kb;
  • 去除 mutations,只有 state,getters,actions(這是我最喜歡的一個特點);
  • actions 支持同步和異步;
  • 沒有模塊嵌套,只有 store 的概念,store 之間可以自由使用,更好的代碼分割;
  • 無需手動添加 store,store 一旦創建便會自動添加;

安裝

npm install pinia --save

創建 Store

新建 src/store 目錄并在其下面創建 index.ts,導出 store

// src/store/index.tsimport { createPinia } from 'pinia'const store = createPinia()export default store

?main.ts 中引入并使用

// src/main.tsimport { createApp } from 'vue'
import App from './App.vue'
import store from './store'const app = createApp(App)
app.use(store)

State

定義State

在 src/store 下面創建一個user.ts

//src/store/user.tsimport { defineStore } from 'pinia'export const useUserStore = defineStore({id: 'user', // id必填,且需要唯一state: () => {return {name: '張三'}}
})

獲取 state

<template><div>{{ userStore.name }}</div>
</template><script lang="ts" setup>
import { useUserStore } from '@/store/user'const userStore = useUserStore()
</script>

也可以結合 computed 獲取。

const name = computed(() => userStore.name)

state 也可以使用解構,但使用解構會使其失去響應式,這時候可以用 pinia 的?storeToRefs

import { storeToRefs } from 'pinia'
const { name } = storeToRefs(userStore)

修改 state

可以像下面這樣直接修改 state

userStore.name = '李四'

但一般不建議這么做,建議通過 actions 去修改 state,action 里可以直接通過 this 訪問。

export const useUserStore = defineStore({id: 'user',state: () => {return {name: '張三'}},actions: {updateName(name) {this.name = name}}
})
<script lang="ts" setup>
import { useUserStore } from '@/store/user'const userStore = useUserStore()
userStore.updateName('李四')
</script>

Getters

export const useUserStore = defineStore({id: 'user',state: () => {return {name: '張三'}},getters: {fullName: (state) => {return state.name + '豐'}}
})
userStore.fullName // 張三豐

Actions

異步 action

action 可以像寫一個簡單的函數一樣支持 async/await 的語法,讓你愉快的應付異步處理的場景。

export const useUserStore = defineStore({id: 'user',actions: {async login(account, pwd) {const { data } = await api.login(account, pwd)return data}}
})

action 間相互調用

action 間的相互調用,直接用 this 訪問即可。

 export const useUserStore = defineStore({id: 'user',actions: {async login(account, pwd) {const { data } = await api.login(account, pwd)this.setData(data) // 調用另一個 action 的方法return data},setData(data) {console.log(data)}}
})

在 action 里調用其他 store 里的 action 也比較簡單,引入對應的 store 后即可訪問其內部的方法了。

// src/store/user.tsimport { useAppStore } from './app'
export const useUserStore = defineStore({id: 'user',actions: {async login(account, pwd) {const { data } = await api.login(account, pwd)const appStore = useAppStore()appStore.setData(data) // 調用 app store 里的 action 方法return data}}
})
// src/store/app.tsexport const useAppStore = defineStore({id: 'app',actions: {setData(data) {console.log(data)}}
})

數據持久化

插件 pinia-plugin-persist 可以輔助實現數據持久化功能。

安裝

npm i pinia-plugin-persist --save

使用

// src/store/index.tsimport { createPinia } from 'pinia'
import piniaPluginPersist from 'pinia-plugin-persist'const store = createPinia()
store.use(piniaPluginPersist)export default store

接著在對應的 store 里開啟 persist 即可。

export const useUserStore = defineStore({id: 'user',state: () => {return {name: '張三'}},// 開啟數據緩存persist: {enabled: true}
})

數據默認存在 sessionStorage 里,并且會以 store 的 id 作為 key。

自定義 key

你也可以在 strategies 里自定義 key 值,并將存放位置由 sessionStorage 改為 localStorage。

persist: {enabled: true,strategies: [{key: 'my_user',storage: localStorage,}]
}
復制代碼

持久化部分 state

默認所有 state 都會進行緩存,你可以通過 paths 指定要持久化的字段,其他的則不會進行持久化。

state: () => {return {name: '張三',age: 18,gender: '男'}  
},persist: {enabled: true,strategies: [{storage: localStorage,paths: ['name', 'age']}]
}

上面我們只持久化 name 和 age,并將其改為localStorage, 而 gender 不會被持久化,如果其狀態發送更改,頁面刷新時將會丟失,重新回到初始狀態,而 name 和 age 則不會。

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

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

相關文章

向量數據庫學習筆記(1) —— 基礎概念

一、 嵌入模型 Embedding Models 嵌入模型是將復雜數據&#xff08;如文本、圖像、音頻等&#xff09;轉換為向量表示的機器學習模型 1. 核心概念 嵌入(Embedding)&#xff1a;將高維、非結構化的數據映射到低維、稠密的向量空間 向量表示&#xff1a;輸出固定長度的數值向量…

[NO-WX179]基于springboot+微信小程序的在線選課系統

[NO-WX179]基于springboot微信小程序的在線選課系統 1、管理員角色&#xff08;web端&#xff09;&#xff1a;2、教師角色&#xff08;web端&#xff09;&#xff1a;3、用戶角色&#xff08;小程序或web端&#xff09;&#xff1a;4、部分運行截圖管理端--教師管理管理端--學…

2025年滲透測試面試題總結-某 長亭(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 長亭 一、Spring SpEL表達式注入漏洞 1. 技術原理 2. 利用條件 3. 攻擊方法 4. 防御策略 二、Jav…

conda環境下解決gitk亂碼模糊

關鍵詞 conda、git、gitk、git gui、模糊、linux、亂碼 現象 操作系統&#xff1a;ubuntu24.04 conda版本&#xff1a;25.1.1 正常的終端里gitk顯示不會模糊 但是在conda創建的python虛擬環境中使用gitk&#xff0c;字體開始變得模糊不清 分析 根據deepseek的原因原因分析…

【C++項目實戰】:基于正倒排索引的Boost搜索引擎(1)

1. 項目的相關背景與目標 針對boost網站沒有搜索導航功能&#xff0c;為boost網站文檔的查找提供搜索功能 站內搜索&#xff1a;搜索的數據更垂直&#xff0c;數據量小 類似于cplusplus.com的搜索 2.搜索引擎的相關宏觀原理 3.技術棧和項目環境 技術棧&#xff1a;C/C&am…

汽車高級駕駛輔助系統應用存儲MRAM

高級駕駛輔助系統和先進的互連航空電子技術等應用要求元件能夠承受惡劣的環境條件&#xff0c;并具有較高的耐用性。閃存雖然在某些條件下性能可靠&#xff0c;但在耐用性方面存在局限性&#xff0c;因此無法滿足這些嚴格的要求。 在實時傳感器數據處理或高可靠性通信等對時間…

藍橋-班級活動

問題描述 小明的老師準備組織一次班級活動。班上一共有 n 名 (n 為偶數) 同學&#xff0c;老師想把所有的同學進行分組&#xff0c;每兩名同學一組。為了公平&#xff0c;老師給每名同學隨機分配了一個 n 以內的正整數作為 id&#xff0c;第 i 名同學的 id 為 ai?。 老師希望…

MongoDB 的索引是提高查詢性能的核心機制,類似于傳統關系型數據庫的索引。以下是對 MongoDB 索引的詳細說明:

MongoDB 的索引是提高查詢性能的核心機制&#xff0c;類似于傳統關系型數據庫的索引。以下是對 MongoDB 索引的詳細說明&#xff1a; 一、索引基礎 1. 索引的作用 加速查詢&#xff1a;通過索引快速定位數據&#xff0c;避免全集合掃描&#xff08;COLLSCAN&#xff09;。 排…

深入理解指針(1)(C語言版)

文章目錄 前言一、內存和地址1.1 內存1.2 究竟該如何理解編址 二、指針變量和地址2.1 取地址操作符&2.2 指針變量和解引用操作符*2.2.1 指針變量2.2.2 如何拆解指針類型2.2.3 解引用操作符 2.3 指針變量的大小 三、指針變量類型的意義3.1 指針的解引用3.2 指針-整數3.3 voi…

【視頻】m3u8相關操作

【視頻】郭老二博文之:圖像視頻匯總 1、視頻文件轉m3u8 1.1 常用命令 1)默認只保留 5 個ts文件 ffmpeg -i input.mp4 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls stream1.m3u82)去掉音頻 -an,保留全部ts文件 ffmpeg -i input.mp4 -vf scale=640:480 -an -…

AWS CloudWatch 實戰:構建智能監控與自動化運維體系

摘要&#xff1a;本文通過實際案例&#xff0c;詳細講解如何利用AWS CloudWatch實現云端資源的實時監控、日志分析與自動化運維&#xff0c;助力企業提升系統穩定性與運維效率 一、場景痛點分析 某電商平臺遷移至AWS后面臨三大挑戰&#xff1a; 故障響應滯后&#xff1a;服務器…

第一天學爬蟲

閱讀提示&#xff1a;我今天才開始嘗試爬蟲&#xff0c;寫的不好請見諒。 一、準備工具 requests庫&#xff1a;發送HTTP請求并獲取網頁內容。BeautifulSoup庫&#xff1a;解析HTML頁面并提取數據。pandas庫&#xff1a;保存抓取到的數據到CSV文件中。 二、爬取步驟 發送請求…

網絡編程和計算機網絡五層模型的關系

計算機網絡的五層模型&#xff08;應用層、傳輸層、網絡層、鏈路層和物理層&#xff09;為網絡編程提供了基礎框架和通信機制。網絡編程就是在這些層次上實現應用程序之間的通信。 計算機網絡五層模型 &#xff08;1&#xff09;應用層&#xff1a; 作用&#xff1a;應用層是…

知識篇 | Oracle的 TEMP表空間管理和優化

Oracle臨時表空間&#xff08;TEMP&#xff09;是數據庫中用于存儲會話級臨時數據的核心組件&#xff0c;主要用于支持需要中間結果集的操作&#xff08;如排序、哈希連接&#xff09;。其數據在事務結束或會話終止后自動釋放&#xff0c;不持久化存儲。 核心特點&#xff1a;…

重學Java基礎篇—線程池參數優化指南

一、核心參數解析 線程池&#xff08;ThreadPoolExecutor&#xff09;的性能取決于以下關鍵參數&#xff1a; 參數說明corePoolSize核心線程數&#xff0c;即使空閑也不會被回收maximumPoolSize最大線程數&#xff0c;當隊列滿且核心線程忙時創建新線程workQueue任務隊列&…

記一次線上環境JAR沖突導致程序報錯org.springframework.web.util.NestedServletException

一、問題描述 有個文件導入功能&#xff0c;用到了Hutool 的加密解密功能&#xff0c;本地運行完全可以&#xff0c;但是線上報錯&#xff1a;“org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFou…

怎么快速部署Sock5代理到ubuntu云服務器

使用 Dante (推薦) 1. 安裝 Dante bash Copy sudo apt update sudo apt install dante-server -y 2. 配置 Dante 編輯配置文件 /etc/danted.conf&#xff1a; bash Copy sudo nano /etc/danted.conf 替換為以下內容&#xff08;按需修改端口和認證&#xff09;&#…

華為OD機試2025A卷 - 游戲分組/王者榮耀(Java Python JS C++ C )

最新華為OD機試 真題目錄:點擊查看目錄 華為OD面試真題精選:點擊立即查看 題目描述 2020年題: 英雄聯盟是一款十分火熱的對戰類游戲。每一場對戰有10位玩家參與,分為兩組,每組5人。每位玩家都有一個戰斗力,代表著這位玩家的厲害程度。為了對戰盡可能精彩,我們需要…

OpenRAND可重復的隨機數生成庫

OpenRAND 是一個 C++ 庫,旨在通過提供強大且可復制的隨機數生成解決方案來促進可重復的科學研究。它是一個簡單的僅頭文件庫,性能可移植,統計穩健,并且易于集成到任何 HPC 計算項目中。 特征 跨平臺支持:OpenRAND 旨在跨各種平臺無縫工作,包括 CPU 和 GPU。其僅標題庫設計…

接口/UI自動化面試題

一、UI自動化 1.1、接口和UI自動化有多少用例&#xff1f; 回答策略&#xff1a;根據接口設定用例&#xff0c;100個接口&#xff0c;自動化case在1500-2000左右。結合自身的項目&#xff0c;回答覆蓋的主功能流程。 示例&#xff1a; 接口自動化的測試case一般需要根據接口數…