Vue3 狀態管理 - Pinia

1. 什么是Pinia

Pinia 是 Vue 的專屬的最新狀態管理庫 ,是 Vuex 狀態管理工具的替代品

  1. 提供更加簡單的APl(去掉了mutation,Pinia 中對state數據的修改可以直接通過action,Vuex中則是通過mutation)
  2. 提供符合組合式風格的API(和Vue3新語法統一)
  3. 去掉了modules的概念,每一個store都是一個獨立的模塊
  4. 配合TypeScript更加友好,提供可靠的類型推斷

2. 手動添加Pinia到Vue項目

后面在實際開發項目的時候,Pinia可以在項目創建時自動添加,現在我們初次學習,從零開始:

  1. 使用 Vite 創建一個空的 Vue3項目
npm init vite@latest
  1. 安裝pinia
npm install pinia
  1. 使用pinia
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'const pinia = createPinia()
const app = createApp(App)app.use(pinia)
app.mount('#app')

3. Pinia基礎使用

  1. 定義store
  2. 組件使用store

定義store(state+action)store/counter.js

store/counter.js

import { defineStore } from "pinia";
import { computed, ref } from 'vue'export const useCounterStore = defineStore('counter', () => {//數據 (state)const count = ref(0)//修改數據的方法 (action)const increment = () => {count.value++}const sub = () => {count.value--}// getter,用computed實現const doubleCount = computed(() => count.value * 2 )// 以對象形式返回return { count, increment, sub, doubleCount}
})

Son1.vue

<script setup>defineOptions({name: 'Son1Index'})// 1. 導入`useCounterStore`方法import { useCounterStore } from '@/stores/counter'// 2. 執行方法得到counterStore對象const counterStore = useCounterStore()
</script><template><div>我是Son1.vue {{ counterStore.count }}  <button @click="counterStore.increment">+</button></div>
</template><style></style>

4. getters實現

Pinia中的 getters 直接使用 computed函數 進行模擬, 組件中需要使用需要把 getters return出去

const count = ref(0)
//getter
const doubleCount = computed(() => count.value *2)

5. action異步實現

方式:異步action函數的寫法和組件中獲取異步數據的寫法完全一致

  • 接口地址:http://geek.itheima.net/v1_0/channels

  • 請求方式:get

  • 請求參數:無

//異步action
const getList = async () => {const res = await axios.request<接口數據類型>({})
}

6. storeToRefs工具函數

使用storeToRefs函數可以輔助保持數據(state + getter)的響應式解構

//響應式丟失,視圖不再更新
const { count, doubleCount } = counterStore//保持數據響應式
const { count, doubleCount } = storeToRefs(counterStore)

數據的解構需要通過storeToRefs()才可以保持數據響應式,如果直接解構則是拷貝一份給解構后的數據,如果是方法的解構則直接解構即可,不需要加上storeToRefs()

7. Pinia的調試

Vue官方的 dev-tools 調試工具 對 Pinia直接支持,可以直接進行調試

8. Pinia持久化插件

官方文檔:https://prazdevs.github.io/pinia-plugin-persistedstate/zh/
pinia持久化作用等同于localstore

  1. 安裝插件 pinia-plugin-persistedstate
npm i pinia-plugin-persistedstate
  1. 使用 main.js
// 導入持久化插件,該插件是給pinia使用的
import persist from 'pinia-plugin-persistedstate'
...
app.use(createPinia().use(persist))
  1. 配置 store/counter.js
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'export const useCounterStore = defineStore('counter', () => {...return {count,doubleCount,increment}
}, {persist: true
})
  1. 其他配置,看官網文檔即可

    如果不打算持久化整個counter,可以指定具體的屬性,

    persist:{paths: ['count','doubleCount']
    }
    

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

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

相關文章

筆記轉移:https://www.yuque.com/u32968635/lbk

語雀&#xff1a;https://www.yuque.com/u32968635/lbk

視頻剪輯技巧:如何高效批量轉碼MP4視頻為MOV格式

在視頻剪輯的過程中&#xff0c;經常會遇到將MP4視頻轉碼為MOV格式的情況。這不僅可以更好地編輯視頻&#xff0c;還可以提升視頻的播放質量和兼容性。對于大量視頻文件的轉碼操作&#xff0c;如何高效地完成批量轉碼呢&#xff1f;現在一起來看看云炫AI智剪如何智能轉碼&#…

Servlte+JSP企業內容管理系統

企業內容管理系統的設計與實現 1&#xff0e;系統概述: 隨著企事業單位信息化的建設&#xff0c;內聯網和外聯網之間的信息交互越來越多,優秀的內容管理系統對企業內部來說&#xff0c;能夠很好地做到信息的收集和重復利用及信息的增值利用。對于外聯網來說,內容管理系統可使…

6 Go的切片

概述 在上一節的內容中&#xff0c;我們介紹了Go的數組&#xff0c;包括&#xff1a;聲明數組、初始化數組、訪問數組元素等。在本節中&#xff0c;我們將介紹Go的切片。在Go語言中&#xff0c;數組的長度是固定的&#xff0c;不能改變&#xff0c;這在某些場景下使用不太方便。…

【C++】一文簡練總結【多態】及其底層原理&具體應用(21)

前言 大家好吖&#xff0c;歡迎來到 YY 滴C系列 &#xff0c;熱烈歡迎&#xff01; 本章主要內容面向接觸過C的老鐵 主要內容含&#xff1a; 歡迎訂閱 YY滴C專欄&#xff01;更多干貨持續更新&#xff01;以下是傳送門&#xff01; 目錄 一.多態的概念二.多態的實現1&#xff…

【C++】:拷貝構造函數與賦值運算符重載的實例應用之日期類的實現

C實現日期類 ├─屬性&#xff1a; │ ├─年份 │ ├─月份 │ └─日期 ├─方法&#xff1a; │ ├─構造函數 │ ├─拷貝構造函數 │ ├─析構函數 │ ├─設置年份 │ ├─設置月份 │ ├─設置日期 │ ├─獲取年份 │ ├─獲取月份 │ ├─獲取日期 │ ├…

websocket和mqtt

WebSocket是一種通信協議&#xff0c;它允許在瀏覽器和服務器之間建立持久連接&#xff0c;并允許雙向傳遞數據。MQTT則是一種輕量級的發布/訂閱消息傳輸協議&#xff0c;常用于物聯網(IoT)設備之間的通信。 &#xff08;1&#xff09;js能直接實現mqtt嗎&#xff0c;還是需…

已解決java.lang.IllegalStateException: Duplicate key

已解決java.lang.IllegalStateException: Duplicate key 文章目錄 報錯問題解決思路解決方法交流 報錯問題 java.lang.IllegalStateException: Duplicate key 解決思路 java.lang.IllegalStateException: Duplicate key 是由于在使用 Map 或 Set 時&#xff0c;試圖將一個已經…

十、sdl顯示yuv圖片

前言 SDL中內置加載BMP的API&#xff0c;使用起來會更加簡單&#xff0c;便于初學者學習使用SDL 如果需要加載JPG、PNG等其他格式的圖片&#xff0c;可以使用第三方庫&#xff1a;SDL_image 測試環境&#xff1a; ffmpeg的4.3.2自行編譯版本windows環境qt5.12sdl2.0.22&…

redis的性能管理和雪崩

redis的性能管理 redis的數據是緩存在內存當中的 系統巡檢&#xff1a; 硬件巡檢、數據庫、nginx、redis、docker、k8s 運維人員必須要關注的redis指標 在日常巡檢中需要經常查看這些指標使用情況 info memory #查看redis使用內存的指標 used_memory:11285512 #數據占用的…

最簡單的簡歷練習

代碼&#xff1a; <!DOCTYPE html> <html> <head> <title>我的簡歷</title> <style> body { background-image: url(https://picsum.photos/id/1018/1000/1000); background-size: cover; …

已解決java.lang.RuntimeException: java.io.IOException: invalid constant type: 18異常的正確解決方法,親測有效!!!

已解決java.lang.RuntimeException: java.io.IOException: invalid constant type: 18異常的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 文章目錄 報錯問題解決方法交流 報錯問題 java.lang.RuntimeException: java.io.IOException: invalid cons…

完美解決ERROR: Command errored out with exit status 1: command: ‘f:\program files\python\python36\pyt

完美解決ERROR: Command errored out with exit status 1: command: f:\program files\python\python36\pyt 下滑查看解決方法 文章目錄 報錯問題解決思路解決方法交流 報錯問題 ERROR: Command errored out with exit status 1: command: ‘f:\program files\python\python3…

【華為OD】C卷真題 100%通過:攀登者1 C/C++源碼實現

【華為OD】C卷真題 100%通過&#xff1a;攀登者1 C/C源碼實現 目錄 題目描述&#xff1a; 示例1 代碼實現&#xff1a; 題目描述&#xff1a; 攀登者喜歡尋找各種地圖&#xff0c;并且嘗試攀登到最高的山峰。 地圖表示為一維數組&#xff0c;數組的索引代表水平位置&…

C++二分查找算法:有序矩陣中的第 k 個最小數組和

本文涉及的基礎知識點 二分查找算法合集 本題的簡化 C二分查找算法&#xff1a;查找和最小的 K 對數字 十分接近m恒等于2 題目 給你一個 m * n 的矩陣 mat&#xff0c;以及一個整數 k &#xff0c;矩陣中的每一行都以非遞減的順序排列。 你可以從每一行中選出 1 個元素形成…

哈希unordered_set,unordered_map的練習

349. 兩個數組的交集 給定兩個數組 nums1 和 nums2 &#xff0c;返回 它們的交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 輸出&#xff1a;[2]示例 2&#xff1a; 輸…

JSP過濾器和監聽器

什么是過濾器 Servlet過濾器與Servlet十分相似&#xff0c;但它具有攔截客戶端&#xff08;瀏覽器&#xff09;請求的功能&#xff0c;Servlet過濾器可以改變請求中的內容&#xff0c;來滿足實際開發中的需要。 對于程序開發人員而言&#xff0c;過濾器實質就是在Web應用服務器…

使用Wireshark提取流量中圖片方法

0.前言 記得一次CTF當中有一題是給了一個pcapng格式的流量包&#xff0c;flag好像在某個響應中的圖片里。比較簡單&#xff0c;后來也遇到過類似的情況&#xff0c;所以總結和記錄一下使用Wireshark提取圖片的方法。 提取的前提是HTTP協議&#xff0c;至于HTTPS的協議需要導入服…

【算法】摩爾投票算法

目錄 1.概述2.算法思想3.代碼實現3.1.t ?n / 2?3.2.t ?n / 3?3.3.t ?n / (m 1)? 4.應用 參考&#xff1a;LeetCode_多數元素 II 題解 1.概述 &#xff08;1&#xff09;摩爾投票法 (Boyer–Moore Majority Vote Algorithm) 是一種用來尋找一組元素中多數元素的常量級…

flutter,uni-app開發調試ios

一、申請ios開發者賬號 二、ios開發者配置 ios 開發者需要配置的地方 https://developer.apple.com/account/resources/certificates/list Certificates&#xff08;證書&#xff09;: 作用&#xff1a; 證書用于對應用程序和開發者進行身份驗證&#xff0c;確保安全性和可…