位置: 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地址使用)

  • 苹果微信分身怎么弄(苹果微信分身怎么整)

    苹果微信分身怎么弄(苹果微信分身怎么整)

  • 荣耀30pro尺寸是多少(荣耀30pro尺寸长宽高多少厘米)

    荣耀30pro尺寸是多少(荣耀30pro尺寸长宽高多少厘米)

  • 支付宝怎么给手机充话费(支付宝怎么给手表充钱)

    支付宝怎么给手机充话费(支付宝怎么给手表充钱)

  • 群活跃头衔怎么升级(群活跃头衔名)

    群活跃头衔怎么升级(群活跃头衔名)

  • 抖音申诉没有通过怎么办(抖音申诉没有通过)

    抖音申诉没有通过怎么办(抖音申诉没有通过)

  • 腾讯视频14206.0是怎么回事(腾讯视频14206错误)

    腾讯视频14206.0是怎么回事(腾讯视频14206错误)

  • 小米钱包怎么下载(小米钱包在哪下载软件)

    小米钱包怎么下载(小米钱包在哪下载软件)

  • 苹果平板不用id怎么下载东西(苹果平板不用id密码可以下载吗)

    苹果平板不用id怎么下载东西(苹果平板不用id密码可以下载吗)

  • 手机屏幕60和90赫兹区别多大(手机屏幕60和144赫兹区别多大)

    手机屏幕60和90赫兹区别多大(手机屏幕60和144赫兹区别多大)

  • 微视可以发多长的视频到朋友圈(微视可以发多长的朋友圈)

    微视可以发多长的视频到朋友圈(微视可以发多长的朋友圈)

  • 电池放时间长了充不进电怎么办(电池放时间长了内阻增加)

    电池放时间长了充不进电怎么办(电池放时间长了内阻增加)

  • word文档怎么排版目录(word文档怎么排版整齐)

    word文档怎么排版目录(word文档怎么排版整齐)

  • 微信语音断断续续怎么办(微信语音断断续续怎么解决)

    微信语音断断续续怎么办(微信语音断断续续怎么解决)

  • 文档内带分数怎样输入(文档里分数)

    文档内带分数怎样输入(文档里分数)

  • 抖音钻卡到底有没有(抖音钻卡有什么用)

    抖音钻卡到底有没有(抖音钻卡有什么用)

  • 华为mate30怎么打开后台锁定(华为mate30怎么打开5g网络)

    华为mate30怎么打开后台锁定(华为mate30怎么打开5g网络)

  • word2019邮件合并(word2019邮件合并为什么用不了)

    word2019邮件合并(word2019邮件合并为什么用不了)

  • 苹果x录屏功能怎么打开(苹果x录屏功能在哪里)

    苹果x录屏功能怎么打开(苹果x录屏功能在哪里)

  • 怎么解绑爱奇艺手机号(怎么解绑爱奇艺绑定的微信)

    怎么解绑爱奇艺手机号(怎么解绑爱奇艺绑定的微信)

  • 苹果电脑delete是哪个键(苹果电脑笔记本delete)

    苹果电脑delete是哪个键(苹果电脑笔记本delete)

  • 天猫精灵如何连接小米电视(天猫精灵如何连接电视)

    天猫精灵如何连接小米电视(天猫精灵如何连接电视)

  • 如何4k对齐(如何4K对齐固态硬盘)

    如何4k对齐(如何4K对齐固态硬盘)

  • 三星s9相册回收站在哪(三星s9照片回收怎么找回)

    三星s9相册回收站在哪(三星s9照片回收怎么找回)

  • 车载蓝牙录小视频没声音(汽车连蓝牙录视频怎么能听到音乐)

    车载蓝牙录小视频没声音(汽车连蓝牙录视频怎么能听到音乐)

  • Xpath元素定位之同级节点,父节点,子节点

    Xpath元素定位之同级节点,父节点,子节点

  • 小规模纳税人申请一般纳税人条件
  • 按份共同保证和连带共同保证
  • 其他综合收益属于当期损益吗
  • 报销差旅费的进项税怎么申报
  • 劳务报酬需要补税吗
  • 电子发票作废了还能恢复吗
  • 金税盘全额抵扣申报流程
  • 企业之间无偿借款
  • 收益法评估的基本思路
  • 福利企业发放职工集资利息是不是要交个人所得税
  • 合并报表投资收益为什么要抵消
  • 事业单位为职工代扣代缴个人所得税
  • 股权转让时资本怎么算
  • 收到的财政补贴如何做账
  • 国税局可以开增值税专用发票吗
  • 业务招待费怎么调整应纳税所得额
  • 发票有问题找谁
  • 小规模纳税人取得专票如何处理
  • 公司与股东的往来款现金流量表
  • 为什么有的发票没有发票章
  • 虚拟股权分红怎么做账
  • 国内企业给国外企业开发票
  • 个体工商户年检怎么办
  • 如何使用腾讯手机管家
  • linux禁用root用户
  • 如何增强无线网卡的接收能力
  • 定额备用金的核算可分为哪几类
  • 出售短期债券投资发生的净损失计入哪里
  • win10系统安装详细步骤
  • 当地街道
  • Python之ImportError: DLL load failed: 找不到指定的模块解决方案
  • 控股公司的账务处理
  • thinkphp try catch
  • 总分类账的登记依据和方法取决于企业所采用的
  • 其他综合收益要交企业所得税吗
  • 华为od机试无法测用例
  • php登录流程
  • 农药普通发票可以抵扣
  • 销售后返现怎么算
  • 债券发行费用计入科目
  • SQLServer中Partition By及row_number 函数使用详解
  • 净资产小于注册资本
  • 所得税的应税所得额
  • Windows7下Microsoft SQL Server 2008安装图解和注意事项
  • 社保由税局代收马上开始
  • 个体工商户生产经营所得税税率表
  • 通行费抵扣进项税怎么做账
  • 固定资产大修理和更新改造的区别
  • 账本登错账怎么修改
  • 上年度多提财务费用
  • 固定资产资本化后续支出
  • 单位定期存单利息如何记账
  • 年终奖财务是以工资形势发放,个税怎么单独计税
  • 单位结算卡和回单卡
  • 所有者权益增加额怎么计算
  • 记账凭证的填制与审核
  • apache系统服务启动不了
  • 电脑系统信息怎么关闭
  • welcome.exe - welcome进程是什么意思
  • 怎么彻底删除win11安全中心
  • 把mac屏幕切换到桌面desktop
  • 果粉必修课 盘点Mac OS X系统发展史
  • macbookair2015安装win7 单系统
  • linux怎么查网络走向
  • Win7如何卸载dualmonitor
  • Android游戏开发读后感
  • javascript继承原理
  • node.js在网页制作中的作用
  • Node.js中的事件循环是什么
  • Android 摄像头预览卡顿
  • Unity Enemy behaviour
  • android 高德地图收费
  • python写邮箱
  • 深入开展税务文化
  • 房屋维修是什么职业
  • 税票开户银行怎么填写?
  • 河南地税申报表怎么填
  • 考上如皋地税局好吗
  • 地税公职律师招聘
  • 专家咨询费包括哪些内容
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设