vue中的pinia使用和持久化 - 粘贴即用

news2025/1/20 10:56:06

学习关键语句:
pinia怎么用

写在前面

pinia 作为 vuex 的替代品好像变得不得不学习了,学起来一用发现 vuex 是什么麻烦的东西,我不认识

这篇文章一共包含的内容有:

  • 安装 pinia
  • 读取数据
  • 修改数据
  • 数据持久化

其中,修改数据只会演示比较常用的两种方式,数据持久化的方法来自满神的这篇文章

文章末尾会有此文章的使用文件链接

开始

安装 pinia

首先我们先创建一个空项目,这里我使用 vite 创建,各位用什么创建都可以

npm create vite

在这里插入图片描述
根据提示打开项目后,我们先将 App.vue 页面清空

App.vue

<template>
  <div>
    123
  </div>
</template>
<script setup lang='ts'>
</script>
<style scoped>
</style>

接下来我们来安装 pinia

npm i pinia

写这篇文章时间的时候 pinia 的版本为 2.0.34 ,不能保证后续版本兼容 注意
在这里插入图片描述

安装完成后,我们在 src 下新建文件夹叫 store,在 store 文件夹下新建文件 index.ts 和 仓库文件 test.ts

在这里插入图片描述

我们将在 index.ts 文件中创建 pinia 实例

index.ts

import { createPinia } from 'pinia'

export const store = createPinia()

我们在 main.ts 中去引入并使用,这里弄得这么麻烦的原因是接下来还要进行持久化操作

main.ts
第 4 行和第 6 行

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import { store } from './store'

createApp(App).use(store).mount('#app')

接下来我们来制作我们的第一个仓库,喔我早就创建好文件了,这个仓库就叫 test 好了

注意 !在这里我遇到一个问题,导致仓库中的响应式对象只能通过 ref 设置而不能使用 reactive ,使用 reactive 声明的对象在持久化后数据会复原,但我找不到原因,希望有大佬能积极在评论区指点我

我们准备一些数据

test.ts

import { ref } from 'vue'
import { defineStore } from 'pinia'

// defineStore 第一个参数是仓库名,第二个仓库类似于 setup
export const useTestStore = defineStore('test', () => {
    const num = ref<number>(0)
    const name = ref<string>('shaoyahu')
    const user = ref<{ name: string, age: number }>({
        name: '名字叫:',
        age: 18
    })
    const hobby = ref<string[]>(['sing', 'dance'])
    // 修改值的第一种方式 使用仓库的方法
    function addnum() {
        num.value++
    }
    function addhobby() {
        hobby.value.push('rap')
    }

    return {
        num,
        name,
        user,
        hobby,
        addnum,
        addhobby
    }
})

好了,到目前为止,我们的仓库已经准备好了,现在我们去读取数据吧

读取数据

我们将在刚才清空的 App.vue 页面中读取数据

App.vue

<template>
  <div>
    test.num:{{ test.num }}
    <hr>
    test.name:{{ test.name }}
    <hr>
    test.user:{{ test.user }}
    <hr>
    test.hobby:{{ test.hobby }}
    <hr>
    <button @click="test.addnum">num加一</button>
    <button @click="test.addhobby">hobby加一个</button>
  </div>
</template>

<script setup lang='ts'>
import { useTestStore } from './store/test'

const test = useTestStore()
</script>

<style scoped></style>

我们打开浏览器的 vue 工具,里面可以看到 pinia 中的数据
在这里插入图片描述
我们通过对比页面上的数据和 pinia 中的数据,就知道数据已经被我们正常读取到了,接下来我们来试试修改数据

修改数据

修改数据常用的有两种方式,一种是使用仓库中的修改数据的方法,一种是我们直接修改仓库中的数据

使用方法

直接使用仓库中的方法,在上面的文件中,我们点击那两个按钮就可以修改数据了,我们来看一看

在这里插入图片描述

创建函数修改

我们自己创建函数来修改仓库中的数据

App.vue

<template>
  <div>
    test.num:{{ test.num }}
    <hr>
    test.name:{{ test.name }}
    <hr>
    test.user:{{ test.user }}
    <hr>
    test.hobby:{{ test.hobby }}
    <hr>
    <button @click="test.addnum">num加一</button>
    <button @click="test.addhobby">hobby加一个</button>
    <button @click="editname">当场改名</button>
    <button @click="change">给user加个名字</button>
    <button @click="delhobby">删除一个hobby</button>
  </div>
</template>

<script setup lang='ts'>
import { useTestStore } from './store/test'

const test = useTestStore()
const editname = () => {
  test.name = '邵雅虎'
}
const change = () => {
  test.user.name += test.name
}
const delhobby = () => {
  test.hobby.pop()
}
</script>

<style scoped></style>

我们加了三个按钮用来修改数据
在这里插入图片描述

ok 这样我们修改数据也获得大成功,不过有一个问题,那就是这样修改的数据在浏览器刷新后就会恢复,所以我们接下来做数据持久化

数据持久化

想想为什么可以做到数据持久化,前端能把数据放哪呢,不就是放在浏览器里嘛,我们将数据存进浏览器的 localStorage 中

我们先在 src 目录下新建文件夹 utils ,并在文件夹下新建文件 storage.ts,我们封装两个方法来存取storage数据

storage.ts

//存缓存中
export const setStorage = (key: string, value: any) => {
    localStorage.setItem(key, JSON.stringify(value))
}
//缓存中读取
export const getStorage = (key: string) => {
    return (localStorage.getItem(key) ? JSON.parse(localStorage.getItem(key) as string) : {})
}

接下来我们回到 store 下的 index.ts 文件中,进行数据持久化修改

index.ts

import { toRaw } from 'vue'
import { createPinia, type PiniaPluginContext } from 'pinia'
import { getStorage, setStorage } from '../utils/storage'

export const store = createPinia()

// 定义一个默认的保存在 localstroge 中的名字
const __piniaKey__: string = 'piniaDefault'
// 制作一个 pinia 插件
const piniaPlugin = (options?: any) => {
  return (context: PiniaPluginContext) => {
    const { store } = context
    // 读取上回存到的数据
    const data = getStorage(`${options?.key ?? __piniaKey__}-${store.$id}`)
    // 仓库中的数据发生改变时触发 $subscribe
    store.$subscribe(() => {
      let o = toRaw(store.$state)
      let obj: any = {}
      for (const key in o) {
        obj[key] = o[key].value
      }
      // 存入最新的数据
      setStorage(`${options?.key ?? __piniaKey__}-${store.$id}`, obj)
    })
    return {
      ...data
    }
  }
}
// 使用插件,不给 key 时则使用默认名字
store.use(piniaPlugin({
  key: 'pinia'
}))

大致的逻辑就是每次数据更新后将新数据存入 localstroge ,每次刷新页面时都会从 localstroge 中读取数据

注意 ! 这里面有一个问题我没解决,就是在仓库中使用 reactive 定义的响应式对象的数据无法持久化,我试了好久,没有改出来,求求大佬捞一捞

结束

这样子一来,pinia 的使用也就非常清楚了,目前来看,确实要比 vuex 要清晰简洁上不少,如果你有什么疑问或者质疑,请在评论区告诉我

文件链接

这个项目我就放在这里了,点击下载就可以尝试了,不需要积分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码不熟没关系,让AI替你写

程序员早已不是一个陌生的群体&#xff0c;但程序、代码相对普通人而言&#xff0c;看着还是比较深奥难懂&#xff0c;但自从有了ChatGPT&#xff0c;不少对此有兴趣的外行人士&#xff0c;也能轻松写出代码了&#xff0c;比如让ChatGPT写一个贪吃蛇游戏&#xff0c;按它给出的…

C++入门(2)

C入门1.缺省参数1.1. 缺省参数举例和概念1.2. 函数的传参是从左到右给参数的1.3.缺省参数分类1.4. 缺省参数的函数声明与定义2.函数重载2.1.函数重载的概念2.2. 函数重载的情况2.3.剖析C语言不能函数重载而C却可以的原因2.3.1. 编译链接过程2.3.2. 函数名修饰规则3.引用3.1. 引…

Java并行流:一次解决多线程编程难题,让你的程序飞起来

前言 在日常的工作中&#xff0c;为了提高程序的处理速度&#xff0c;充分利用多核处理器的性能&#xff0c;我们需要手动编写多线程代码。但是多线程编程非常复杂&#xff0c;容易出现死锁、竞态条件等问题&#xff0c;给我们带来了很大的困扰。而 Java 并行流则提供了一种更加…

python机器学习和深度学习在气象中的应用

查看原文>>> Python人工智能在气象中的实践技术应用 Python 是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得 Python 在气象、海洋、地理、…

14:24面试,14:32就出来了 ,问的实在是太...

从外包出来&#xff0c;没想到算法死在另一家厂子&#xff0c;自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有…

PythonFlash+MySQL实现简单管理系统的增删改查

今天简单分享一下用Python的flash框架结合MySQL来实现信息管理系统的增删改查&#xff01; ps&#xff1a;该博客只完成了信息的添加和查看&#xff0c;删除和修改按照该方法下推即可&#xff01; 实现功能之前我们先在数据库里设置数据&#xff0c;例如&#xff1a; 我们创…

日常记录:天梯赛练习集L1-046 整除光棍

题目&#xff1a; 这里所谓的“光棍”&#xff0c;并不是指单身汪啦~ 说的是全部由1组成的数字&#xff0c;比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如&#xff0c;111111就可以被13整除。 现在&#xff0c;你的程序要读入一个整数x&#x…

Mac环境下nvm的安装与环境配置

目录 1.nvm简介 2.nvm安装 3.配置nvm环境 1.nvm简介 nvm全称 Node Version Manager &#xff0c;意思为node版本控制&#xff1b;它是一个命令行应用&#xff0c;可以快速地更新、安装、使用、卸载本机的全局 node.js 版本。他可以在同一台电脑上进行多个node版本之间的切换…

redis基础(6.0)数据结构、事务、常用组件等

1 概述 1.1 redis介绍 Redis 是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是「Remote Dictionary Service」的首字母缩写&#xff0c;也就是「远程字典服务」。Redis 以其超高的性能、完美的文档、 简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评。…

华为手表开发:WATCH 3 Pro(16)传感器订阅气压

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;16&#xff09;传感器订阅气压初环境与设备气压传感器介绍与说明鸿蒙开发文件夹&#xff1a;文件新增展示的文本标记index.hmlindex.cssindex.js初 希望能写一些简单的教程和案例分享给需要的人 鸿蒙可穿戴开发 环境与设备 …

【目标检测】YOLOv5:修改自己的网络结构

前言 YOLOv5就像一座金矿&#xff0c;里面有无数可以学习的东西。之前的博文一直将YOLOv5当作一个黑盒使用&#xff0c;只考虑模型的输入和输出&#xff0c;以此来对模型进行二次开发。 本篇博文将更近一层&#xff0c;深入到“金矿”内部&#xff0c;来尝试对模型结构进行替换…

高并发浅析

什么是高并发 高并发指通过设计保证系统能够同时并行处理很多请求&#xff0c;是分布式系统非常重要的概念 评价分布式系统性能的指标有&#xff1a; 响应时间&#xff1a;系统对请求做出响应的时间。吞吐量&#xff1a;单位时间内处理的请求数量。QPS&#xff08;和吞吐量基…

C++标准库 -- 顺序容器 (Primer C++ 第五版 · 阅读笔记)

C标准库 -- 顺序容器(Primer C 第五版 阅读笔记&#xff09;第9章 顺序容器------(持续更新)9.1、顺序容器概述9.2、容器库概览9.2.1 、迭代器9.2.2 、容器类型成员9.2.3 、begin 和 end 成员9.2.4 、容器定义和初始化9.2.5 、赋值和 swap9.2.6 、容器大小操作9.2.7 、关系运算…

电脑0x0000001A蓝屏错误怎么U盘重装系统教学

电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug&#xff0c;只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢&#xff1f;来看看以下的详细操作方法教学吧。 准备工作&…

ThinkPad-L480电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板ThinkPad-L480 处理器Intel Core i7-8550U已驱动 内存16GB DDR4 2400Mhz已驱动 硬盘Intel 760p 512GB已驱动 显卡Intel UHD 620已驱动 声卡瑞昱…

【探花交友】day06—即时通信

目录 1、即时通信 1.1、什么是即时通信&#xff1f;​编辑 1.2、功能说明 1.3、技术方案 2、环信 2.1、开发简介 2.2、环信Console 2.3、接口说明 3、抽取环信组件 3.1、编写HuanXinTemplate 3.2、编写Properties对象 3.3、配置 3.4、测试 4、用户体系集成 4.1、…

力扣刷题第一天:剑指 Offer 18. 删除链表的节点、LC206.反转链表

目录 零、前言 剑指 Offer 18. 删除链表的节点 一、题目描述 二、解题思路 三、完整代码 LC206.反转链表 一、题目描述 二、解题思路 三、完整代码 零、前言 这篇文章主要讲解两道链表相关的题目&#xff0c;分别是剑指 Offer 18和LC206。链表作为数据结构中重要的一…

Vue学习——【第五弹】

前言 上一篇文章 Vue学习——【第四弹】 中学到了数据代理&#xff0c;这篇文章接着学习 Vue中的事件处理。 事件处理 我们在学习JavaScript时就经常接触事件处理&#xff0c;比如在进行表单、按钮、列表折叠等操作时&#xff0c;我们就经常用到 click&#xff08;点击&…

Redis源码之Hash表实现

通常我们如果要设计一个 Hash 表&#xff0c;那么我们需要考虑这几个问题&#xff1a; 有没有并发操作Hash冲突如何解决以什么样的方式扩容对 Redis 来说&#xff0c;首先它是单线程的工作模式&#xff0c;所以不需要考虑并发问题。 想实现一个性能优异的 Hash 表&#xff0c…

ubuntu快速安装VMware Tools(全屏用的)

VMware Tools实现主机和虚拟机的文件共享。 第一步 打开VMware Workstation,启动ubuntu系统。 点击主界面的&#xff08;虚拟机&#xff09;——点击&#xff08;安装VMware Tools&#xff09;。 弹出提示框点击是——等待自动下载完成。 第二步 将安装包复制到桌面&#x…