位置: IT常识 - 正文

vue3+ts项目里如何使用状态管理pinia以及数据持久化(vue ts)

编辑:rootadmin
vue3+ts项目里如何使用状态管理pinia以及数据持久化

推荐整理分享vue3+ts项目里如何使用状态管理pinia以及数据持久化(vue ts),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue3+ts+vite,vue3 ts知乎专栏,vue3 + ts,vue3+ts+vite,vue3 + ts,vue3 ts element,vue3+ts+vite,vue3 ts element,内容如对您有帮助,希望把文章链接给更多的朋友!

我们都知道在vue2项目里搭配状态管理vuex3XX使用,效果极好的。

虽然在vue3项目里,vuex4XX仍能发挥余热,但由于缺乏对于ts的支持,使得类型推断陷入僵局。

所以在vue3+ts的项目里,vuex渐被舍弃,pinia取而代之。(尤雨溪亦力荐之)pinia官网

下面是在vue3 + ts 项目里如何使用 pinia 步骤

这里是如何从零开始由vite构建vue3+ts项目的流程介绍

1 下载 pinia 插件

npm i pinia

2 引入和使用插件

main.ts

import { createApp } from 'vue'import './style.css'import App from './App.vue'import router from './router'import elementPlus from 'element-plus'import 'element-plus/dist/index.css'// ① 引入createPinia方法从piniaimport { createPinia } from 'pinia'// ② 拿到pinia实例const pinia = createPinia()const app = createApp(App)//使用piniaapp.use(router).use(elementPlus).use(pinia).mount('#app')

3 创建store/home.ts状态管理文件来管理对应页面(home.vue)

store/home.ts

// 每个状态管理文件都要引入此方法import { defineStore } from 'pinia'// 官方建议取名遵从 useXXXStore 形式// 'home' 为当前store的唯一标识 类似ID // 取名建议与文件名称一致 便于记忆和管理// pinia舍弃了冗长的mutations属性 // 以下是pinia的一种写法 因与vuex相似 便于学习和记忆export const useHomeStore = defineStore('home',{ state:()=>{ return{ num:0 } }, //state也可写成这样 // state:()=>({ // num:0 // }), actions:{ changeNum(){ //这里可以使用this去拿到state里定义的变量 this.num ++ } }, getters:{ // 这里取名不可与state里的变量一致 所以取名getNum getNum:state=>state.num }})

4 在对应页面组件home.vue里使用状态管理文件home.ts

home.vue

<template> <div class="c">this is home page</div> <div class="c"> <p>使用pinia直接改变变量</p> <!-- 3 解构赋值后直接在template模板里调用变量和方法 --> <p>{{ num }}</p> <button @click="changeNum">点击递增</button> </div></template><script lang="ts" setup>import { toRefs } from 'vue'// 1 引入import { useHomeStore } from "../store/home";// 2 拿到实例const homeStore = useHomeStore();// 3 解构里面的变量和方法 toRefs作用是让解构出来的变量具有响应性 const { num,changeNum } = toRefs(homeStore);</script><style scoped>.c { width: 80%; padding: 20px; margin: 0 auto; border: 1px solid red;}.c>p>span{ color:coral;}</style>

静态展示效果:

点击按钮改变变量效果:

 如果像这样频繁改变变量 官方建议使用 $patch 方法 (官方优化加持)

具体操作如下

home.vue

<template> <div class="c">this is home page</div> <div class="c"> <p>使用pinia直接改变变量</p> <!-- 3 不解构赋值 在template模板里的写法 --> <p>{{ homeStore.num }}</p> <button @click="changeNum">点击递增</button> </div></template><script lang="ts" setup>// 1 引入import { useHomeStore } from "../store/home";// 2 拿到实例const homeStore = useHomeStore();// 频繁改变homeStore里面的变量 建议使用$patch方法// 一 $patch的对象式写法// const changeNum = ()=>{// homeStore.$patch({// num: ++ homeStore.num// })// }// 二 $patch的函数式写法const changeNum = ()=>{ // 这里的state就是home.ts里的state homeStore.$patch((state)=>{ state.num ++ })}</script><style scoped>.c { width: 80%; padding: 20px; margin: 0 auto; border: 1px solid red;}.c>p>span{ color:coral;}</style>

效果:

 除了以上定义变量后 让变量自身变化的外 我们也可以在actions里请求接口数据赋值变量

如下

vue3+ts项目里如何使用状态管理pinia以及数据持久化(vue ts)

home.ts

// 每个状态管理文件都要引入此方法import { defineStore } from 'pinia'//引入接口import { httpPost } from '../request/api'// 官方建议取名遵从 useXXXStore 形式// 'home' 为当前store的唯一标识 类似ID // 取名建议与文件名称一致 便于记忆和管理// pinia舍弃了冗长的mutations属性 // 以下是pinia的一种写法 因与vuex相似 便于学习和记忆export const useHomeStore = defineStore('home',{ state:()=>{ return{ num:0, token:'' } }, //state也可写成这样 // state:()=>({ // num:0 // }), actions:{ changeNum(){ //这里可以使用this去拿到state里定义的变量 下面同理 this.num ++ }, changeToken(){ // ts 实在学的不咋地 这里就先any了 httpPost().then((res:any)=>{ this.token = res.data.data.token }) } }, getters:{ // 这里取名不可与state里的变量一致 所以取名getNum //简写 getNum:state=>state.num, //全写 // getNum:(state)=>{ // return state.num // } getToken:state=>state.token, }})

相应组件页面使用

home.vue

<template> <div class="c">this is home page</div> <div class="c"> <p>使用pinia直接改变变量</p> <!-- 解构赋值后直接在template模板里调用变量和方法 --> <p>{{ num }}</p> <button @click="changeNum">点击递增</button> </div> <div class="c"> <button @click="changeToken">使用pinia请求数据接口赋值token</button> <p>token: <span>{{ token }}</span></p> </div></template><script lang="ts" setup>import { toRefs } from 'vue'// 1 引入import { useHomeStore } from "../store/home";// 2 拿到实例const homeStore = useHomeStore();// 3 解构里面的变量和方法 toRefs作用是让解构出来的变量具有响应性 const { num,changeNum,token,changeToken } = toRefs(homeStore);</script><style scoped>.c { width: 80%; padding: 20px; margin: 0 auto; border: 1px solid red;}.c>p>span{ color:coral;}</style>

效果:

 pinia 也存在和vuex一样的弊端 就是刷新页面后 数据丢失

我们可以使用 pinia-plugin-persistedstate 插件来完成数据持久化

数据持久化具体步骤

1 下载插件 pinia-plugin-persistedstate

npm i pinia-plugin-persistedstate

2 main.ts引入和使用插件

main.ts

import { createApp } from 'vue'import './style.css'import App from './App.vue'import router from './router'import elementPlus from 'element-plus'import 'element-plus/dist/index.css'// ① 引入createPinia方法从piniaimport { createPinia } from 'pinia'// ② 拿到pinia实例const pinia = createPinia()// 1 引入数据持久化插件import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'// 2 pinia使用数据持久化插件pinia.use(piniaPluginPersistedstate)const app = createApp(App)//使用piniaapp.use(router).use(elementPlus).use(pinia).mount('#app')

3 对应状态管理文件配置参数(这里以home.ts为例)

home.ts

// 每个状态管理文件都要引入此方法import { defineStore } from 'pinia'//引入接口import { httpPost } from '../request/api'// 官方建议取名遵从 useXXXStore 形式// 'home' 为当前store的唯一标识 类似ID // 取名建议与文件名称一致 便于记忆和管理// pinia舍弃了冗长的mutations属性 // 以下是pinia的一种写法 因与vuex相似 便于学习和记忆export const useHomeStore = defineStore('home',{ state:()=>{ return{ num:0, token:'' } }, //state也可写成这样 // state:()=>({ // num:0 // }), actions:{ changeNum(){ //这里可以使用this去拿到state里定义的变量 下面同理 this.num ++ }, changeToken(){ // ts 实在学的不咋地 这里就先any了 httpPost().then((res:any)=>{ this.token = res.data.data.token }) } }, getters:{ // 这里取名不可与state里的变量一致 所以取名getNum //简写 getNum:state=>state.num, //全写 // getNum:(state)=>{ // return state.num // } getToken:state=>state.token, }, //数据持久化配置 这里是当前所有变量都持久化 persist:true})

效果:

 在实际项目里 token持久化是我们所不希望的 那如何只让num这一变量持久化呢

进一步配置参数即可

home.ts

// 每个状态管理文件都要引入此方法import { defineStore } from 'pinia'//引入接口import { httpPost } from '../request/api'// 官方建议取名遵从 useXXXStore 形式// 'home' 为当前store的唯一标识 类似ID // 取名建议与文件名称一致 便于记忆和管理// pinia舍弃了冗长的mutations属性 // 以下是pinia的一种写法 因与vuex相似 便于学习和记忆export const useHomeStore = defineStore('home',{ state:()=>{ return{ num:0, token:'' } }, //state也可写成这样 // state:()=>({ // num:0 // }), actions:{ changeNum(){ //这里可以使用this去拿到state里定义的变量 下面同理 this.num ++ }, changeToken(){ // ts 实在学的不咋地 这里就先any了 httpPost().then((res:any)=>{ this.token = res.data.data.token }) } }, getters:{ // 这里取名不可与state里的变量一致 所以取名getNum //简写 getNum:state=>state.num, //全写 // getNum:(state)=>{ // return state.num // } getToken:state=>state.token, }, //数据持久化配置 这里是当前所有变量都持久化 // persist:true //按需配置数据持久化 这里指定变量num保持持久化 persist:{ //默认名称为当前store唯一标识 这里即home key:'homeNum', //默认localStorage 本地储存 //这里建议临时储存sessionStorage 也可写成window.sessionStorage storage:sessionStorage, //默认当前store里的所有变量都持久化 paths:['num'] }})

效果:

 最后总结一下pinia一些优点

① 舍弃了冗长的 mutations 属性

② 舍弃了模块化 modules 让状态管理更加扁平化

③ 对于 ts 的支持更加友好 支持数据推断

④ 你甚至可以让各个状态管理相互依赖、嵌套

以上就是我目前在学习 pinia 的一些分享了  也欢迎看到这里的你一起分享学习 共同进步!

本文链接地址:https://www.jiuchutong.com/zhishi/292391.html 转载请保留说明!

上一篇:HTML5期末大作业:我的家乡网站设计5(html5期末大作业智能家具)

下一篇:在windows server 2016安装Web服务器(IIS)(在Windowsserver2019环境下,配置IP地址使用)

  • 什么叫域名(什么叫域名年龄)

    什么叫域名(什么叫域名年龄)

  • 索尼7500f和8500f区别(索尼7500f和国产比)

    索尼7500f和8500f区别(索尼7500f和国产比)

  • 微信公积金人脸识别失败(微信公积金人脸识别失败怎么办)

    微信公积金人脸识别失败(微信公积金人脸识别失败怎么办)

  • 快手主播的竞猜为什么看不到(快手主播竞猜是什么意思)

    快手主播的竞猜为什么看不到(快手主播竞猜是什么意思)

  • 要关闭正在运行的程序窗口可以按什么组合键(要关闭正在运行的窗口可以按什么键)

    要关闭正在运行的程序窗口可以按什么组合键(要关闭正在运行的窗口可以按什么键)

  • h5链接是什么意思(h5链接格式)

    h5链接是什么意思(h5链接格式)

  • 抖音电脑和手机可以一起登录吗(抖音电脑和手机上传流量不一样?)

    抖音电脑和手机可以一起登录吗(抖音电脑和手机上传流量不一样?)

  • 摄像头6mm和8mm的区别(摄像头6mm和8mm的哪个清楚)

    摄像头6mm和8mm的区别(摄像头6mm和8mm的哪个清楚)

  • 苹果11能用几个小时(苹果11和苹果12的区别)

    苹果11能用几个小时(苹果11和苹果12的区别)

  • 表格怎么把相同的名称筛选到一起(表格怎么把相同名字的数据整理到一起)

    表格怎么把相同的名称筛选到一起(表格怎么把相同名字的数据整理到一起)

  • 手机充电一直显示1%(手机充电一直显示0%咋弄?)

    手机充电一直显示1%(手机充电一直显示0%咋弄?)

  • 怎样将应用放到桌面上(怎样将应用放到桌面)

    怎样将应用放到桌面上(怎样将应用放到桌面)

  • 双11开始时间和结束时间(双11什么时候开始2021)

    双11开始时间和结束时间(双11什么时候开始2021)

  • vcass如何标注线的长度(visio标注)

    vcass如何标注线的长度(visio标注)

  • nfc怎么录取门禁卡(如何用nfc录入门禁卡)

    nfc怎么录取门禁卡(如何用nfc录入门禁卡)

  • 电脑重置后怎么安装系统(电脑重置后怎么恢复成以前那样)

    电脑重置后怎么安装系统(电脑重置后怎么恢复成以前那样)

  • 三星s8bixby键怎么设置(三星s8屏的按键怎么变了,怎么设置)

    三星s8bixby键怎么设置(三星s8屏的按键怎么变了,怎么设置)

  • 双引号的作用-(双引号的作用及例句)

    双引号的作用-(双引号的作用及例句)

  • 苹果收到闪信是病毒吗(苹果手机收到闪信是中毒了吗)

    苹果收到闪信是病毒吗(苹果手机收到闪信是中毒了吗)

  • 苹果ipad怎么下载爱奇艺(苹果ipad怎么下载安卓软件)

    苹果ipad怎么下载爱奇艺(苹果ipad怎么下载安卓软件)

  • qq上的耳朵是什么(qq上的耳朵是什么意思)

    qq上的耳朵是什么(qq上的耳朵是什么意思)

  • 抖音小助手是什么功能(抖音小助手是什么功能,为什么要@抖音小助手|自媒体...)

    抖音小助手是什么功能(抖音小助手是什么功能,为什么要@抖音小助手|自媒体...)

  • 鸿蒙系统识别文字功能在哪? 鸿蒙提取图片文字的技巧(鸿蒙系统获取电脑文件)

    鸿蒙系统识别文字功能在哪? 鸿蒙提取图片文字的技巧(鸿蒙系统获取电脑文件)

  • 【JavaScript 进阶教程】数组新增遍历方法的说明与使用(js进阶视频教程)

    【JavaScript 进阶教程】数组新增遍历方法的说明与使用(js进阶视频教程)

  • 记录在Ubuntu删除用户和添加用户命令(ubuntu系统删除)

    记录在Ubuntu删除用户和添加用户命令(ubuntu系统删除)

  • 补提以前年度的盈余公积可以在本年任意月份提取吗
  • 增值税建筑服务税率变化时间
  • 小微企业税收新政
  • 税收缴款书现在还有吗
  • 融资利息进项税如何抵扣
  • 贷款利息收入如何开票
  • 接受资不抵债并账会计分录
  • 员工垫资报销记账
  • 物流辅助服务印花税税率
  • 公司转给法人备注怎么填
  • 转让不动产增值税纳税义务发生时间
  • 交印花税合同金额怎么算
  • 公司委托财务去银行办理业务
  • 发生成本支出发票未到
  • 火车车票怎么样
  • 怎么看增值税专用发票是进项还是销项
  • 建筑工程伙食费包括什么
  • 建筑行业增值税税率是多少
  • 总资产周转率计算公式用不用乘100%
  • 商品销售税金及附加科目现在改了吗
  • 百旺金赋服务费280元发票在哪里开
  • 兼职取酬案例剖析
  • 项目合作费包括
  • 清算期间企业所得税申报期限
  • 银行有流水但是没有开票怎么做账
  • 公司全额承担个税会计分录
  • 上期有留抵进项税额会计分录
  • macwifi连接频繁断开
  • 为员工租房租金怎么入账
  • php b/s
  • 借用资质(挂靠施工)的法律责任如何判断?
  • 被雪覆盖的山峰
  • 如何做好记账会计
  • 增值税检查后的调账方法
  • 免税企业税金及附加计算
  • 发票没有的位数怎么写
  • adan算法
  • 关于印花税免税的规定
  • 软件增值税即征即退文件
  • 普通发票不满8项怎么开明细
  • vue elementui table
  • 汽车4s店,厂家返修
  • 计提的费用收到增值税专票
  • 高新技术企业相关税收政策
  • 财务会计的主要目标和工作内容包括
  • PostgreSQL中调用存储过程并返回数据集实例
  • 人工费用计入
  • 农产品收购发票可以不抵扣吗
  • 划拨的土地出租
  • 广告业和一般服务性行业有何异同?
  • 支付稿费怎么做凭证
  • 跨年暂估收入,次年开票会计分录
  • 同一个客户有应收也有应付怎么办
  • 香港的收据可以作为报销凭证吗
  • 报销冲抵什么意思
  • 个人如何购买定增的股票
  • 公司收到赔偿款要交增值税吗
  • 误餐补助标准国家规定
  • 公司活动费用分录
  • 借别人的承兑后期还现钱可以吗?
  • linux系统配置ipv6地址
  • windows任务管理器怎么用
  • win7那些自启可以禁用
  • ghost 硬盘对考
  • macpro删除文件
  • mac使用磁盘工具的快捷键
  • win8查看内存
  • windows7如何安装net framework4.0
  • win8系统怎样
  • node.js的express
  • opengl es2.0
  • Node.js中的核心模块包括哪些内容?
  • Unity3D值Input Manager
  • 守护进程和普通进程
  • JavaScript中的数据类型分为两大类
  • jquery返回顶部
  • asynctask缺点
  • unity spine换装
  • 山西国家税务网官网
  • 发票挂失费用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设