釘釘小程序框架:Pinia 狀態管理與持久化存儲封裝

?上一篇文章完成了 Pinia 在釘釘小程序中的引入與基礎配置

文章地址:釘釘小程序框架引入 Pinia 狀態管理-CSDN博客

本文將深入探討如何通過Pinia 結合持久化存儲 實現用戶狀態

在上一章節中,我們已經完成了 Pinia 在釘釘小程序中的引入與基礎配置。本章將進一步深入探討如何通過 Pinia 結合持久化存儲 實現用戶狀態、應用設置等關鍵數據的持久保存,并結合實際場景封裝一個通用的 持久化工具類

我們將使用 uni.setStorageSyncuni.getStorageSync 這兩個釘釘小程序兼容的 API 來實現本地存儲,同時借助 Pinia 的 store 模塊機制進行統一的狀態管理。

一、為什么需要持久化 Pinia Store

在開發釘釘小程序時,有些數據是需要跨頁面甚至跨會話保留的,例如:

  • 用戶登錄信息(token、用戶ID)
  • 應用主題設置
  • 緩存數據(如歷史記錄、最近訪問內容)

如果不做持久化處理,當用戶關閉小程序后再次打開時,這些狀態將會丟失。

二、Pinia + 持久化方案設計

1. 持久化策略概述

我們采用如下策略:

  • 在 Pinia 的 store 初始化時從本地緩存讀取初始值;
  • 在每次狀態變更時自動寫入本地緩存;
  • 提供一個可復用的工具類來統一管理存儲邏輯。
2. 技術選型說明
技術點選擇理由
PiniaVue3 推薦的狀態管理庫,類型友好,模塊化清晰
TypeScript強類型支持,提升代碼健壯性
UniApp API使用?uni.setStorageSync?等 API 兼容多端

三、封裝持久化工具類

1. 我們可以創建一個 utils/storage.ts 工具類用于封裝常用的本地存儲方法。

/*** 存儲工具類* @author: 歸夢工作室*/
const STORAGE_PREFIX = 'gm_';export const setStorage = <T>(key: string, value: T): void => {try {uni.setStorageSync(`${STORAGE_PREFIX}${key}`, value);} catch (e) {console.error(`[Storage] Set failed for key ${key}`, e);}
};export const getStorage = <T>(key: string, defaultValue: T | null = null): T | null => {try {const value = uni.getStorageSync(`${STORAGE_PREFIX}${key}`);return value !== undefined ? (value as T) : defaultValue;} catch (e) {console.error(`[Storage] Get failed for key ${key}`, e);return defaultValue;}
};export const removeStorage = (key: string): void => {uni.removeStorageSync(`${STORAGE_PREFIX}${key}`);
};export const clearStorage = (): void => {uni.clearStorageSync();
};

五、Pinia Store 中集成持久化邏輯

1. 創建一個帶持久化的 Store 示例

userStore 為例:

文件位置:src/store/user.ts

import { defineStore } from 'pinia';
import { getStorage, setStorage } from '@/utils/storage';interface UserState {token: string | null;userInfo: Record<string, any> | null;
}export const useUserStore = defineStore('user', {state: (): UserState => ({token: getStorage<string>('token', null),userInfo: getStorage<Record<string, any>>('userInfo', null),}),actions: {setToken(token: string | null) {this.token = token;if (token) {setStorage('token', token);} else {uni.removeStorageSync('token');}},setUserInfo(userInfo: Record<string, any> | null) {this.userInfo = userInfo;if (userInfo) {setStorage('userInfo', userInfo);} else {uni.removeStorageSync('userInfo');}},},
});

2. 測試持久化存儲

<template><view class="content"><view>測試pinia持久化</view><view>vuex: {{ userData }}</view><view>storage: {{ getStorage('userInfo') }}</view></view><view><ant-button @tap="savaToken">存儲 token</ant-button><ant-button @tap="savaUserInfo">存儲 userInfo</ant-button><ant-button @tap="getUserInfo">獲取 userInfo</ant-button><ant-button @tap="clearStorage">清空 storage</ant-button></view>
</template><script setup lang="ts">
import {ref} from 'vue'
import {useUserStore} from "@/store/user";
import { getStorage, clearStorage } from '@/utils/storage';const userStore = useUserStore()const userData = ref({})const userInfo = ref({name: '張三',age: 18
})const token = ref('123456')const savaToken = () => {userStore.setToken(token.value)
}
const savaUserInfo = () => {userStore.setUserInfo(userInfo.value)
}
const getUserInfo = () => {userData.value = userStore.getUserInfo()
}</script><style>
.content {display: flex;flex-direction: column;align-items: center;justify-content: center;
}.logo {height: 200rpx;width: 200rpx;margin-top: 200rpx;margin-left: auto;margin-right: auto;margin-bottom: 50rpx;
}.text-area {display: flex;justify-content: center;
}.title {font-size: 36rpx;color: #8f8f94;
}
</style>

點擊存儲token和存儲userInfo

點擊清空storage

最后點擊獲取userInfo

測試完成!!!一切順利!!!

最后附上代碼地址:

GitCode - 全球開發者的開源社區,開源代碼托管平臺

分支:storage

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

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

相關文章

云計算產業鏈

一、云計算定義與分類體系 本質特征 按需服務模式&#xff1a;以網絡化方式提供可配置的計算資源共享池&#xff08;網絡/服務器/存儲/應用&#xff09;。核心能力&#xff1a;快速彈性擴容、資源池化共享、按使用量付費、低管理開銷。技術原理&#xff1a;通過分布式計算將大型…

git使用詳解和示例

什么是 Git&#xff1f; Git 是一個 分布式版本控制系統&#xff08;DVCS&#xff09;&#xff0c;用于跟蹤文件的變化&#xff0c;協調多人協作開發。由 Linus Torvalds 開發&#xff0c;用于管理 Linux 內核代碼。 Git 的核心概念 名稱說明工作區 (Working Directory)你看到…

深度學習的引出

雖然我們的神經?絡給出了令?印象深刻的表現&#xff0c;但這樣的表現帶有?分神秘 ?絡中的權重和偏置是被?動發現的。這意味著我們不能?即解釋?絡怎么做的、做了什么。我們能否找 到?些?法來理解我們的?絡通過什么原理分類?寫數字&#xff1f;并且&#xff0c;在知道…

GEO(生成式引擎優化)—— 內容創作者與企業的生死新戰場

在搜索引擎優化&#xff08;SEO&#xff09;定義了互聯網信息獲取規則數十年后&#xff0c;一場由生成式人工智能&#xff08;AIGC&#xff09;驅動的風暴正悄然重塑整個格局。當ChatGPT、Claude、Gemini等AI助手能夠直接生成整合后的答案&#xff0c;而非僅僅提供鏈接列表時&a…

混合密度模型GMM的似然函數(二)

設 Θ { π k , θ k } k 1 K \varTheta \{ \pi_k, \boldsymbol {\theta}_k \}_{k1}^{K} Θ{πk?,θk?}k1K?為參數向量&#xff0c; X { x 1 , ? , x n } \mathcal {X} \{ {\bm x}_1, \cdots, {\bm x}_n \} X{x1?,?,xn?}為觀測數據&#xff0c;給定數據點的獨立性&a…

selenium元素定位

當我們可以打開瀏覽器后我們如果想要進行web測試我們自然要對網頁的一些功能進行單獨拿出來進行測試&#xff0c;但是我們要怎么才能拿到我們想要的元素&#xff0c;并且對其進行操作呢。 我們就以百度主頁的輸入框為例&#xff0c;如果我們想要王輸入框中輸入一些內容我們就需…

2025第十五屆上海生物發酵展:江蘇健達干燥盛裝赴會

2025 年 8 月 7 - 9 日&#xff0c;上海新國際博覽中心將迎來一場生物發酵行業的盛會 —— 第 15 屆上海國際生物發酵產品與技術裝備展覽會&#xff08;BIOCHINA 2025&#xff09;。作為國內干燥設備領域的領軍企業&#xff0c;江蘇健達干燥工程有限公司受邀盛裝參展&#xff0…

【效率工具】單機游戲修改方案:輕量管理器+全能平臺組合

大家好&#xff01;今天我要給大家介紹兩款超級實用的軟件&#xff0c;專門為喜歡玩單機游戲的小伙伴們準備。 一、風靈月影管理器 不想滿網翻修改器&#xff1f;這個 27M 的小工具直接幫你一鍵搞定&#xff0c;這款軟件是由B站UP鴉無量 開發。 收錄上千款游戲補丁&#xff0c;…

七天學會SpringCloud分布式微服務——01——基礎概念

重點是復習體系&#xff0c;從今天6.24開始&#xff0c;確保轉化為自己的東西心平氣和&#xff0c;腳踏實地學習的是尚硅谷微服務 1、從單體架構到集群架構再到分布式架構 單體架構 就是 所有的功能&#xff08;服務&#xff09;模塊 都部署在同一臺服務器&#xff08;一臺服…

三分鐘學會利用deepseek將復雜信息轉換成可視化圖表

數據可視化是傳達復雜信息的重要手段。通過將數據轉化為直觀的圖表、圖形和交互式界面,我們可以更高效地理解信息、發現趨勢并做出決策。對于普通人來說,要將數據可視化可謂千難萬難。但在AI工具飛速發展的今天,這個過程將會變得非常簡單。今天分享的內容就是如何使用生成式…

PDF處理控件Spire.PDF系列教程:Python中快速提取PDF文本、表格、圖像及文檔信息

在 Python 中讀取 PDF 文檔是實現文檔自動化、內容分析和數據提取的基礎操作之一。無論你處理的是合同、報告、發票&#xff0c;還是科研論文&#xff0c;能夠通過代碼訪問 PDF 內容&#xff0c;不僅能節省時間&#xff0c;還能帶來更高效的處理流程。 要在 Python 中準確提取…

微軟人工智能證書AI-102 | 如何快速通過?

微軟 AI-102 考試&#xff0c;全稱 “Designing and Implementing a Microsoft Azure AI Solution”&#xff0c;是微軟推出的用于驗證考生在 Azure 平臺上設計和實施 AI 解決方案核心能力的認證考試。以下是具體介紹&#xff1a; 考試描述&#xff1a; 考試主要衡量考生實施計…

github使用指南

1、生成SSH密鑰對 ssh-keygen -t ed25519 -C "你的github郵箱"然后根據提示保存路徑&#xff0c;設置密碼 2、將公鑰添加到github cat ~/.ssh/id_ed25519.pub復制輸出內容。 在gihub中點擊New SSH Key&#xff0c;添加密鑰 3、配置git使用SSH地址 git remote se…

AD22以上的基礎操作

1.檢測創建的原理圖器件庫 2.原理圖頁加大 Size&#xff1a;常規和自定義 推薦可視化柵格100mil 快捷鍵VG 3.原理圖器件器件號排序 自動排序&#xff1a;快捷鍵TAA 先解鎖 4.BOM(Bill of Material)物料表導出 description描述&#xff1a;類似精度。 導出各種類型bom表 5…

FastAPI技術深度解析與實戰指南

導讀&#xff1a;在Python Web開發領域經歷了Django和Flask多年統治后&#xff0c;FastAPI的崛起正在重新定義API開發的技術標準。這篇深度技術解析將為開發者揭示FastAPI如何通過獨特的架構設計解決傳統框架的核心痛點。 傳統Python Web框架在面對高并發場景時暴露出明顯的性能…

Python 可迭代的對象、迭代器 和生成器(何時使用生成器表達式)

何時使用生成器表達式 在示例 10-16 中&#xff0c;為了實現 Vector 類&#xff0c;我用了幾個生成器表達 式&#xff0c;eq、hash、abs、angle、angles、format、add 和 __mul__ 方法中各有一個生成器表達式。在這些方法中使用列表推 導也行&#xff0c;不過立即返回的列表要…

復習和預習(C++)答案解析

填空題答案及解釋 在 for 循環實現累加時&#xff0c;通常在循環上方初始化累加器變量&#xff0c;如 int m ______。 答案&#xff1a;0 解釋&#xff1a;累加器需從 0 開始&#xff0c;才能正確累積后續值的總和。 switch 語句根據表達式的值與各個______后的常量表達式進行…

uniapp處理后端返回的html字符串

前言&#xff1a;采用v-html方法處理 1.處理前 <html><head><meta http‐equiv"Content‐Type" content"text/html; charsetUTF-8"></head><body><form ?<input type"submit" value"立刻提交"…

如何在 Ubuntu 上通過終端或在 VirtualBox 中安裝 GCC

無論你是正在編譯 C 程序,還是在 Linux 上從源代碼構建軟件,GNU 編譯器集合(GCC)都是每位 Linux 開發者需要的工具之一,因為它能夠編譯 C、C++,甚至 Fortran、Ada 等其他語言。但如果你想知道如何在 Ubuntu 上安裝 GCC 并設置它來編譯代碼,別擔心——你來對地方了。 本…

Mac python3.12 執行pip/pip3異常externally-managed-environment

環境&#xff1a;Mac、Python3.12.x版本&#xff08;3.12.5&#xff09; 問題&#xff1a;執行pip install xyz 后出現異常&#xff1a; error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide,…