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>

相关推荐
Jyywww1212 小时前
Uniapp+Vue3 使用父传子方法实现自定义tabBar
javascript·vue.js·uni-app
李少兄2 小时前
CSS clip-path:前端开发中的裁剪技术
前端·css
JosieBook2 小时前
【数据库】2026国产时序数据库新格局与金仓的多模突围
数据库·时序数据库
zhengxianyi5152 小时前
使用码云gitee登录ruoyi-vue-pro——坑比较多
前端·vue.js·gitee·ruoyi-vue-pro优化·三方登陆
羑悻的小杀马特2 小时前
不做“孤岛”做“中枢”:拆解金仓时序库,看国产基础软件如何玩转“多模融合”
数据库·人工智能
小北方城市网2 小时前
SpringBoot 安全认证实战(Spring Security + JWT):打造无状态安全接口体系
数据库·spring boot·后端·安全·spring·mybatis·restful
bbq粉刷匠2 小时前
MySQL - 基础增删查改
数据库·mysql
光影少年2 小时前
React vs Next.js
前端·javascript·react.js
谢尔登2 小时前
Vue3 响应式系统——ref 和 reactive
前端·javascript·vue.js