vue3 封装使用 pinia (可直接使用,包含数据持久化)

2023/11/30 9:13:09

一、概述

Pinia是 Vue 的存储库,它允许您跨组件/页面共享状态,与vuex功能一样。

(1)为什么不在用vuex了呢?

官网解释:Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子,结合了 Vuex 5 核心团队讨论中的许多想法。最终,我们意识到 Pinia 已经实现了我们在 Vuex 5 中想要的大部分内容,并决定实现它 取而代之的是新的建议。

与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的规范,提供了 Composition-API 风格的 API,最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持。

(2)与 Vuex 3.x/4.x 的比较

Pinia API 与 Vuex ≤4 有很大不同,即:

  • mutations 不再存在。他们经常被认为是 非常 冗长。他们最初带来了 devtools 集成,但这不再是问题。
  • 无需创建自定义复杂包装器来支持 TypeScript,所有内容都是类型化的,并且 API 的设计方式尽可能利用 TS 类型推断。
  • 不再需要注入、导入函数、调用函数、享受自动完成功能!
  • 无需动态添加 Store,默认情况下它们都是动态的,您甚至都不会注意到。请注意,您仍然可以随时手动使用 Store 进行注册,但因为它是自动的,您无需担心。
  • 不再有 modules 的嵌套结构。您仍然可以通过在另一个 Store 中导入和 使用 来隐式嵌套 Store,但 Pinia 通过设计提供平面结构,同时仍然支持 Store 之间的交叉组合方式。 您甚至可以拥有 Store 的循环依赖关系
  • 没有 命名空间模块。鉴于 Store 的扁平架构,“命名空间” Store 是其定义方式所固有的,您可以说所有 Store 都是命名空间的。

二、基本使用

1.安装pinia

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

2. store/counter.ts

语法: defineStore(仓库id,( )=>{
        const x = 1
}) 

import { ref, computed } from "vue";
import { defineStore } from "pinia";

export const useCounterStore = defineStore("counter", () => {
  const count = ref(0);
  const doubleCount = computed(() => count.value * 2);
  function increment() {
    count.value++;
  }

  return { count, doubleCount, increment };
});

可以在方法内定义变量、方法(包括异步同步),书写起来和Composition API几乎一样,如果页面要使用记得return出变量或方法,如果你不熟悉Composition API 可参考 vue使用pinia (vue2/vue3) 其他使用方式

由于 pinia不再有modules 如果想定义其他仓库,可新建相同文件格式,注意要更换仓库id 

3.main.ts

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate'  //持久化插件
const app = createApp(App)
app.use(createPinia().use(persist))

这也是vite构建工具提供给我们的例子

如果你要持久化 需要安装插件 若不需要则不需引入

pnpm i pinia-plugin-persistedstate
# or
npm i pinia-plugin-persistedstate
# or
yarn add pinia-plugin-persistedstate

三、封装pinia

1.store/index.ts

概述 main.ts里的createPinia 直接在store里面做,包括引入持久化插件 省去main.ts的冗余  (它能做的我也能做)

import { createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate' //导入持久化插件

// 创建pinia实例
const pinia = createPinia()
// 使用pinia插件
pinia.use(persist)
// 导出pinia实例,给main使用
export default pinia
export * from './user'  //多个模块同理导出

2.store/user.ts

单纯举个模板例子

import type { User } from '@/types/user'
import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useUserStore = defineStore('cp-user', () => {
  // 用户信息
  const user = ref<User>()
  // 设置用户,登录后使用
  const setUser = (u: User) => {
    user.value = u
  }
  // 清空用户,退出后使用
  const delUser = () => {
    user.value = undefined
  }
  return { user, setUser, delUser }
}, {
  persist:true // 开启持久化
})

3.main.ts

import { createApp } from 'vue'
import pinia from './stores'
import App from './App.vue'
app.use(pinia)
app.mount('#app')

4. 使用

import { useUserStore } from '@/stores'
const store = useUserStore()

调用出来的 store 就是当前仓库的数据啦,直接store.变量/方法 即用


http://www.jnnr.cn/a/124962.html

相关文章

【javaEE初阶】文件操作和IO

目录前言一、文件操作1. 文件2. 路径3. 补充二、文件操作相关类/方法1.File类三、文件内容的读写&#xff1a;流&#xff08;stream&#xff09;1. InputStream2. OutputStream3. 字符流文件的操作四、小程序练习THINK前言 今天不学习&#xff0c;明天变垃圾&#xff01; 本文…

PyTorch环境配置

我自己的开发环境&#xff0c;可按照自己的环境进行配置&#xff1a; Python 3.7 Anaconda 22.9.0 CUDA 11.7 一、Anaconda安装 在官网下载 Anaconda | The Worlds Most Popular Data Science Platform 记得安装的时候勾选环境变量 然后我们在命令行中输入 conda list 可以…

[附源码]java毕业设计大学新生军训管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

小程序使用分包

分包 支持分包的小程序目录结构如下: ├── app.js ├── app.json ├── app.wxss ├── packageA │ └── pages │ ├── cat │ └── dog ├── packageB │ └── pages │ ├── apple │ └── banana ├── pages │ ├…

高斯过程回归(Gaussian process regression)原理详解及python代码实战

GPR tutorial1. 高斯过程回归原理1.1 高斯过程1.2 高斯过程回归2. python实现高斯过程回归2.1 参数详解2.2 核函数cookbook2.2 代码模版附录-数学基础知识A1 高斯分布的基本性质A2 贝叶斯框架A3 后验预测分布参考资料1. 高斯过程回归原理 高斯过程回归(Gaussian process regre…

长话短说:学习网络安全自学好还是报培训班?

无论你是大学生还是在职人员&#xff0c;想学网络安全时&#xff0c;都会面临两个选择&#xff0c;自学或者报班。报班通常太费钱&#xff0c;时间又不自由&#xff1b;自学又不知道如何下手&#xff0c;担心自己坚持不下来。怎么办&#xff1f; 我们先分析一下自学和培训班的…

Allegro中导入中文或者logo操作指导

Allegro中导入中文或者logo操作指导 新建一个word文档,输入文字(或者其它东西)如下图: 然后截图,储存为.bmp格式的图片,如下图 打开allegro,新建一个空白的package symbol 指下module path的库,指到刚才的package symbol同一个路径下面 导入123.bmp 效果如下图

8、Bean的循环依赖问题

8.2 singleton下的set注入产生的循环依赖(解决) A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 Husband Data public class …

yolov5数据集

如果想跳过步骤直接获取YOLOv5格式的kitti数据集评论获取阿里云盘提取码 我们再yolov5/dataset下创建文件夹kitti 再kiiti中放入我们的数据 数据集结构框架 |——kitti ├── imgages │ ├── val │ │ └── 000000.png ├── ....... …

详探XSS PayIoad

详探XSS PayIoad1.Cookie劫持2.构造GET与POST请求3.XSS钓鱼4.识别用户浏览器1.Cookie劫持 一个最常见的XSS Payload&#xff0c;就是通过读取浏览器的Cookie对象&#xff0c;从而发起“Cookie劫持”攻击 Cookie中一般加密保存了当前用户的登录凭证。Cookie如果丢失&#xff0…

【面试常考的网络编程之Socket、短连接与长连接、客户端与服务端网络通讯流程、Java网络编程之BIO、JDK网络编程BIO案例实战演练】

一.知识回顾 【0.IO在开发中有着举足轻重的地位&#xff0c;所以我们非常有必要学习。IO性能基石专栏都整理好了&#xff0c;可根据需要进行学习&#xff01;】 【1.性能基石之IO~~~Linux操作系统相关知识体系补充&虚拟文件系统&文件描述符&PageCache内核缓存页】 …

web框架之路由列表及SQL语句查询数据库数据替换模板变量

续接&#xff1a;使用web框架程序处理客户端的动态资源请求代码实现 一、路由列表功能代码实现 路由&#xff1a;是将请求路径Url到处理函数的映射&#xff0c;即提前将请求路径与要处理的函数进行关联 路由列表&#xff1a;对路由进行管理&#xff0c;用来保存各个设置好的…

精品springboot的二手车管理系统vue

《springboot的二手车管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows 8 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a…

【数据结构】带头双向循环链表的实现(C语言)

目录 前言 初始化 增删及打印 查找 指定位置后插入 删除指定位置 销毁 尾言 前言 之前我们讲了单链表的实现&#xff0c;带头双向循环链表就是在单链表的基础之上增加了一些功能使结构更加完善。可以直接用两个字来形容它&#xff0c;就是无敌。 增加了头结点使得在插…

​草莓熊python turtle绘图代码(玫瑰花版)附源代码

​草莓熊python turtle绘图代码&#xff08;玫瑰花版&#xff09;附源代码 目录 一、前言 二、草莓熊手持玫瑰花成品效果图 三、代码演示方法和代码命令解释 四、草莓熊手持的玫瑰花源代码 五、相关资源图片 六、我的“草莓熊python turtle绘图&#xff08;玫瑰花版&…

LabVIEW什么时候需要使用DLL封装 Calling External APIs

LabVIEW什么时候需要使用DLL封装 所谓封装就是指为另一种软件提供兼容性接口的程序。由于第三方DLL的开发设计通常是为了从C语言&#xff08;或者其它类似的底层语言&#xff09;中调用&#xff0c;而不从是LabVIEW中调用&#xff0c;因此当使用LabVIEW进行应用程序开发时&…

CentOS7 硬盘扩容

文章目录CentOS7 硬盘扩容查看分区信息创建新分区创建物理卷查看物理卷lsblk命令再次查看创建新的物理卷查看物理卷新分区添加到根目录分区中增加容量刷新磁盘容量查看容量参考文章CentOS7 硬盘扩容 云平台先分配50G后又配置为200G所导致的下面一系列操作 查看分区信息 lsbl…

NUT UI 虚拟列表高度设置

NutUI - 移动端 Vue2、Vue3、小程序 组件库 (jd.com)https://nutui.jd.com/#/zh-CN/component/list虚拟列表可以作为一个触底加载的组件&#xff1b; 在正常的列表展示以及上拉加载中&#xff0c;我们通常使用 NutUI 提供的 滚动加载 组件&#xff0c;那如果我们加载的数据量非…

软件测试 - Linux的远程连接

Linux的远程连接一、基本知识二、使用命令连接服务器三、使用finalshell工具连接服务器一、基本知识 说明&#xff1a;使用远程连接工具连接到服务器 提交&#xff1a;1.有网络 2.服务器的IP地址 3.服务器的账号密码 常见的远程连接工具 finalshell&#xff08;推荐&#xff0c…

Attention 机制是什么?

Attention 机制 文章目录 Attention 的本质是什么Attention 的3大优点Attention 的原理Attention 的 N 种类型Attention 正在被越来越广泛的得到应用。尤其是 BERT 火爆了之后。 Attention 到底有什么特别之处&#xff1f;他的原理和本质是什么&#xff1f;Attention都有哪些…
最新文章