pinia以及做持久化(页面刷新数据不丢失,pc端,uniapp,使用nuxt框架三种)

本文介绍了如何在Uniapp中使用Pinia进行状态管理和持久化,以及与PC项目(如使用pinia-plugin-persistedstate)和Nuxt.js框架中的不同方法。作者分享了安装步骤和配置示例,以及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很久没写文章了,提笔写下这篇也是因为做uniapp使用pinia做持久化踩了一下午坑......

1.先讲pinia在uniapp中做持久化吧

相信大家在做pc项目都用过pinia并且做过持久化,但是在uniapp里面的持久化与pc是不一样的,uniappp中使用的插件是pinia-plugin-unistorage

先安装pinia

yarn add pinia
# 或者使用 npm
npm install pinia

在uniapp项目中导入pinia持久化插件pinia-plugin-unistorage

https://ext.dcloud.net.cn/plugin?id=8081

在mian.js写入

//导入pinia
import * as Pinia from 'pinia'
import {
	createUnistorage
} from '@/uni_modules/pinia-plugin-unistorage'


import {
	createSSRApp
} from 'vue'
export function createApp() {
	const app = createSSRApp(App)
	// 创建Pinia实例  // 将pinia实例挂载到vue实例上 
	// app.use(Pinia.createPinia());  // 之前使用pinia但是没有做持久化,可以注释了,不然会报一个警告
	// 状态管理
	const store = Pinia.createPinia()
	// 持久化
	store.use(createUnistorage())
	app.use(store)
	return {
		app,
		Pinia, // 此处必须将 Pinia 返回	
	}
}

在项目中新建一个文件,里面建一个js文件

usePostsIdStore.js文件内容,主要一点:unistorage: true开启pinia持久化

// 导入定义仓库的方法
import { defineStore } from 'pinia';

// 导入响应式和计算
import {
	ref
} from 'vue'
const usePostsIdStore = defineStore('postsId', {
		unistorage: true,  // 开启持久化存储,这里一定要写
		state: () => {
			return {
				postsId: null
			}
		}
	}
)

export default usePostsIdStore;

2.常规pc端

下载插件

yarn add pinia-plugin-persistedstate
# 或者使用 npm
npm i pinia-plugin-persistedstate
# 或者使用 pnpm
pnpm i pinia-plugin-persistedstate

在usePostsIdStore.js中  persist: true开启持久化

import { defineStore } from 'pinia'

export const useStore = defineStore(
  'main',
  () => {
    const someState = ref('你好 pinia')
    return { someState }
  },
  {
    persist: true,
  },
)

在main.js中

import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

3.在nuxt框架中使用pinia持久化

 在nuxt中做pinia持久化相对于前两个会简单一些,因为没有main.js文件

下载pinia和pinia持久化插件

    npm install pinia @pinia/nuxt
    npm i -D @pinia-plugin-persistedstate/nuxt

在nuxt.config.ts中加入

export default defineNuxtConfig({
  modules: [
    "@pinia/nuxt",
    "@pinia-plugin-persistedstate/nuxt",
  ],
})

store的js文件

import { defineStore } from "pinia"; //引入pinia

//这里官网是单独导出  是可以写成默认导出的  官方的解释为大家一起约定仓库用use打头的单词 固定统一小仓库的名字不易混乱
export const useActiveInfo = defineStore("test", {
  state: () => {
    return {
      active: 0, // 菜单激活选项
    }; //为了避免出错,返回的值用()包起来
  },
  persist: true,
});

下面这个是在外面怎么使用pinia

import { useActiveInfo } from "@/store/index.js"; //pinia
const activeInfo = useActiveInfo();
const onSelectMenus = (index) => {
  activeInfo.active = index;
};

以上就是三种pinia持久化的方法

有任何问题请私信我或评论区留言!!!!!!!!

<think>好的,我现在需要帮助用户解决在UniApp中封装和使用Pinia状态管理的问题。首先,我要回忆一下UniAppPinia的基本知识。UniApp是一个使用Vue.js开发多应用的框架,而PiniaVue的官方状态管理库,适合在Vue 3中使用。用户可能已经对Vue有一定的了解,但需要具体的步骤和示例代码。 首先,我应该确定用户的需求是什么。用户请求的是封装教程、使用指南、示例代码和最佳实践。这意味着我需要分步骤讲解如何安装配置Pinia,如何创建store,如何封装,以及如何在UniApp使用,并提供代码示例。同时,还需要提到一些最佳实践,比如模块化、组合式API、持久化存储等。 接下来,我需要检查是否有潜在的配置问题。例如,UniApp可能有一些特定的配置需要处理,比如使用unocss-preset-weapp这样的工具时需要注意的配置,但用户提到的引用[1]可能是一个例子,需要确保Pinia的配置与UniApp兼容。可能需要提到在main.js或main.ts中正确安装Pinia实例。 然后,考虑代码的结构。用户可能需要一个简单的示例开始,然后逐步深入。例如,先创建一个基本的store,展示state、getters、actions的使用,然后演示如何在组件中使用这个store。接着,介绍如何封装更复杂的store,可能涉及模块化,按功能拆分store,使用setup语法等。 另外,需要提到一些常见的最佳实践,比如避免在store中处理过多的逻辑,使用TypeScript以获得更好的类型支持,以及如何处理持久化存储,可能需要使用插件如pinia-plugin-persistedstate。同时,要提醒用户注意UniApp的环境差异,比如某些浏览器API可能不可用,需要适配。 在生成相关问题部分,需要考虑用户可能进一步询问的内容,比如如何调试Pinia,如何处理异步操作,如何与UniApp的路由或API结合使用,或者如何优化性能。这些问题需要自然地从教程中延伸出来,帮助用户深入理解。 最后,确保整个回答结构清晰,步骤明确,代码示例正确,并且符合用户要求的格式,比如使用中文,数学表达式正确,引用标识等。需要避免技术错误,比如错误的配置步骤或代码语法问题,这可能需要参考官方文档或可靠的社区资源进行验证。</think># UniAppPinia状态管理的封装与使用指南 ## 一、环境配置 1. 安装必要依赖 ```bash npm install pinia @pinia/nuxt ``` 2. 修改`main.js`文件配置 ```javascript import { createSSRApp } from 'vue' import { createPinia } from 'pinia' export function createApp() { const app = createSSRApp(App) const pinia = createPinia() // 配置持久化插件(可选) pinia.use(piniaPluginPersistedstate) app.use(pinia) return { app } } ``` ## 二、基础Store封装 ### 用户模块示例 ```typescript // stores/user.ts export const useUserStore = defineStore('user', { state: () => ({ token: '', profile: { id: '', name: '游客' } }), actions: { async login(credentials: { mobile: string; code: string }) { const res = await uni.request({ url: '/api/login', method: 'POST', data: credentials }) this.token = res.data.token this.profile = res.data.profile } }, persist: { enabled: true // 启用持久化 } }) ``` ## 三、组件中使用 ```vue <script setup> import { useUserStore } from '@/stores/user' const userStore = useUserStore() const handleLogin = async () => { await userStore.login({ mobile: '13800138000', code: '123456' }) uni.showToast({ title: '登录成功' }) } </script> <template> <view class="container"> <text>{{ userStore.profile.name }}</text> <button @click="handleLogin">登录</button> </view> </template> ``` ## 四、最佳实践 1. **模块化拆分**:按业务功能划分store模块 2. **组合式API**:使用`setup()`语法更灵活地组合逻辑 3. **类型安全**:配合TypeScript使用接口定义 ```typescript interface UserProfile { id: string name: string avatar?: string } ``` 4. **持久化策略**:推荐使用`pinia-plugin-persistedstate`插件 ```javascript // 自定义存储策略 persist: { storage: { getItem(key) { return uni.getStorageSync(key) }, setItem(key, value) { uni.setStorageSync(key, value) } } } ``` ## 五、调试技巧 1. 使用Vue DevTools查看Store状态树 2. 通过`store.$subscribe`监听状态变化 ```typescript userStore.$subscribe((mutation, state) => { console.log('状态变更:', mutation.type) }) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

 冰紫露恋蝶玛丽红红秃头宝贝

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值