vue3中数据的pinia的使用

一、安装pinia

npm i pinia

二、全局注册

import { createApp } from 'vue'

import { createPinia } from 'pinia'

import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

import './style.css'

import App from './App.vue'

const pinia = createPinia()

pinia.use(piniaPluginPersistedstate)

const app = createApp(App)

app.use(pinia)

app.mount('#app')

三、定义仓库

import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', {

// 定义状态

state: () => ({

count: 0,

name: 'Eduardo',

field1: 'some data',

field2: 'other data'

}),

// 持久化配置

persist: {

key: 'counter-data',

storage: localStorage,

},

// 计算属性

getters: {

doubleCount: (state) => state.count * 2,

doubleCountPlus: (state) => state.count * 2 + 10

},

// 方法

actions: {

increment() {

this.count++

},

decrement() {

this.count--

},

incrementByAmount(amount) {

this.count += amount

},

// 添加一个重置方法用于测试

reset() {

this.count = 0

this.name = 'Eduardo'

this.field1 = 'some data'

this.field2 = 'other data'

}

},

})

四、使用

<template>

<div style="padding: 20px; border: 1px solid blue;">

<h2>计数器测试 (CounterTest)</h2>

<p>计数值: {{ counterStore.count }}</p>

<p>双倍计数: {{ counterStore.doubleCount }}</p>

<p>名称: {{ counterStore.name }}</p>

<div style="margin: 10px 0;">

<button @click="counterStore.increment()">+1</button>

<button @click="counterStore.decrement()">-1</button>

<button @click="counterStore.incrementByAmount(5)">+5</button>

<button @click="updateName">更新名称</button>

</div>

<div>

<input v-model="counterStore.count" type="number" placeholder="直接编辑计数" />

</div>

<div style="margin-top: 20px;">

<h3>本地存储检查</h3>

<p>localStorage中的值: {{ localStorageValue }}</p>

<p>Store的持久化配置: {{ persistConfig }}</p>

<button @click="refreshPage">刷新页面测试持久化</button>

</div>

</div>

</template>

<script setup>

import { useCounterStore } from '../stores/counter.js'

import { ref, onMounted, computed } from 'vue'

const counterStore = useCounterStore()

const localStorageValue = ref('')

const persistConfig = ref('')

const updateName = () => {

counterStore.name = `访客${Math.floor(Math.random() * 100)}`

}

const refreshPage = () => {

window.location.reload()

}

onMounted(() => {

// 读取localStorage中的值以检查是否正确保存

const storedValue = localStorage.getItem('counter-data')

localStorageValue.value = storedValue ? JSON.parse(storedValue).state : '未找到'

// 检查store的持久化配置

persistConfig.value = counterStore.$persist ? '已配置' : '未配置'

// 打印整个store状态

console.log('Store State:', counterStore.$state)

console.log('Persist Info:', counterStore.$persist)

})

</script>

相关推荐
子兮曰3 小时前
async/await高级模式:async迭代器、错误边界与并发控制
前端·javascript·github
恋猫de小郭3 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
GIS之路5 小时前
ArcGIS Pro 中的 Notebooks 入门
前端
IT_陈寒6 小时前
React状态管理终极对决:Redux vs Context API谁更胜一筹?
前端·人工智能·后端
NineData7 小时前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
Kagol7 小时前
TinyVue 支持 Skills 啦!现在你可以让 AI 使用 TinyVue 组件搭建项目
前端·agent·ai编程
柳杉8 小时前
从零打造 AI 全球趋势监测大屏
前端·javascript·aigc
simple_lau8 小时前
Cursor配置MasterGo MCP:一键读取设计稿生成高还原度前端代码
前端·javascript·vue.js
睡不着先生8 小时前
如何设计一个真正可扩展的表单生成器?
前端·javascript·vue.js
天蓝色的鱼鱼8 小时前
模块化与组件化:90%的前端开发者都没搞懂的本质区别
前端·架构·代码规范