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

  • 年底了,公关营销人内心的独白……(做公关的那几年)

    年底了,公关营销人内心的独白……(做公关的那几年)

  • 华为手机怎么隔空截屏(华为手机怎么隔空刷视频)

    华为手机怎么隔空截屏(华为手机怎么隔空刷视频)

  • 新浪邮箱有实名认证吗(新浪邮箱实名认证解除)

    新浪邮箱有实名认证吗(新浪邮箱实名认证解除)

  • 红米note11pro有耳机孔吗(红米note11pro有耳机设置吗)

    红米note11pro有耳机孔吗(红米note11pro有耳机设置吗)

  • qq请勿打扰的自动回复句子怎么设置(qq请勿打扰的自动回复原句)

    qq请勿打扰的自动回复句子怎么设置(qq请勿打扰的自动回复原句)

  • 钢化膜没贴好可以重贴几次(钢化膜没贴好可以用吹风机吹嘛)

    钢化膜没贴好可以重贴几次(钢化膜没贴好可以用吹风机吹嘛)

  • 表格字体大小怎么设置(表格字体大小怎么调最大)

    表格字体大小怎么设置(表格字体大小怎么调最大)

  • win7启动卡在徽标进不了系统(win7启动卡在徽标很久才能进去)

    win7启动卡在徽标进不了系统(win7启动卡在徽标很久才能进去)

  • hub和交换机区别(hub跟交换机的区别)

    hub和交换机区别(hub跟交换机的区别)

  • win10微信视频无法使用摄像头(win10微信视频没有图像)

    win10微信视频无法使用摄像头(win10微信视频没有图像)

  • 手机卡激活了不用会怎样(手机卡激活了不用)

    手机卡激活了不用会怎样(手机卡激活了不用)

  • 不属于internet应用的是什么(不属于internet应用缩写有哪些)

    不属于internet应用的是什么(不属于internet应用缩写有哪些)

  • 输入设备是指(输入设备是指向计算机输入程序)

    输入设备是指(输入设备是指向计算机输入程序)

  • iphone外观设置在哪里(苹果手机外观设计)

    iphone外观设置在哪里(苹果手机外观设计)

  • 荣耀7x双卡怎么安装(华为荣耀7x双卡双待怎么设置)

    荣耀7x双卡怎么安装(华为荣耀7x双卡双待怎么设置)

  • 苹果xsmax屏幕算2k吗

    苹果xsmax屏幕算2k吗

  • 华为合约机和非合约机的区别(华为合约机是啥意思)

    华为合约机和非合约机的区别(华为合约机是啥意思)

  • iphone锁屏密码忘了怎么办(iphone锁屏密码忘记了怎样才能打开手机)

    iphone锁屏密码忘了怎么办(iphone锁屏密码忘记了怎样才能打开手机)

  • iqoo是什么屏幕(iqoo是什么屏幕LCD吗)

    iqoo是什么屏幕(iqoo是什么屏幕LCD吗)

  • flyme8体验版推送时间(flyme8体验版什么时候更新)

    flyme8体验版推送时间(flyme8体验版什么时候更新)

  • XP系统设定从系统休眠恢复时需要密码的方法(xp从做系统)

    XP系统设定从系统休眠恢复时需要密码的方法(xp从做系统)

  • Bert 得到中文词向量(bert获取中文词向量)

    Bert 得到中文词向量(bert获取中文词向量)

  • 车道线检测CLRNet算法复现在Tusimple数据集测试demo(车道线检测模型)

    车道线检测CLRNet算法复现在Tusimple数据集测试demo(车道线检测模型)

  • 【前端进阶】-TypeScript高级类型 | 交叉类型、索引签名类型、映射类型(前端技巧)

    【前端进阶】-TypeScript高级类型 | 交叉类型、索引签名类型、映射类型(前端技巧)

  • 火车票全额抵减增值税可以吗
  • 10万以内免征增值税怎么做账
  • 一般计税方法和简易计税方法的计算公式
  • 管理费用中的办公费占比是多少
  • 砖厂开票员的工作流程
  • 借款当月算利息吗
  • 粗纤维测定仪使用方法
  • 资产减值损失在利润表怎么填列
  • 小微企业增值税优惠政策最新2023
  • 去年发生的成本怎么算
  • 股权增值转让的财税处理
  • 预借差旅费凭证填写
  • 工业企业购进货物进项税额抵扣的时限
  • 少数股东权益如何保障
  • 预付房租收到发票后如何做账
  • 小企业汇算清缴所得税分录
  • 净利润为负数还要交所得税吗
  • 银行理财产品赎回
  • 审工资的流程
  • 发票限额是多少
  • 24个问题
  • 买东西退税退的是什么税
  • 应收账款坏账收回会计处理
  • 空调维修详情介绍
  • 内外账合并步骤
  • 工厂产品研发代码是多少
  • 在windows7的
  • 固定资产的专票可以抵扣吗
  • linux i
  • 房地产企业如何结转成本
  • dev beta 发布预览
  • 今天端午节?
  • 债务人以固定资产债务重组
  • 个人合伙企业如何计算个人所得税
  • 收到固定资产的记账凭证
  • 巴塞罗那城市布局
  • vue面试题及答案2021
  • add files to archive
  • flex布局教程实例篇
  • uniapp自定义导航栏渐变
  • CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇
  • php getcwd与dirname(__FILE__)区别详解
  • fdisk cfdisk
  • 免税农产品的范围有哪些
  • ps魔棒工具选择图像时在容差数值较大的是
  • 织梦使用教程
  • discuz管理中心登陆
  • 股东投钱一般怎么投
  • 财务人员办理会计事项必须复制或取得原始凭证
  • 研发项目会计分录
  • 暂估回冲方式
  • 工业企业新产品收入的调研报告
  • 已收款未开票未发货能确认收入吗
  • 已抵扣进项怎么转出
  • 计提商业承兑汇票会计分录怎么写
  • 两个其他应收款的区别
  • 收到投资款现金流量放到哪里
  • 计提本月应交增值税
  • 公司销售二手车怎么开票
  • 接受捐赠可以确认为收入吗
  • 投资收益的账务怎么处理
  • 餐饮打包盒 标准
  • 捐赠利得的会计科目
  • 会计调账情况模板
  • 企业所有者权益是指什么
  • iis设置mime
  • 如何解决win10系统用户名有中文
  • xp系统一直在启动界面怎么办
  • windows xp的电脑
  • os x 10.10 yosemite自动纠正怎么关?os x yosemite自动纠正功能关闭教程
  • windows使用linux软件
  • win10升级最新版
  • Win10 Mobile 10586.164中文版升级截图曝光
  • certutil - decode/encode BASE64/HEX strings.Print symbols by HEX code
  • 一个简单的小实验
  • shell脚本中执行echo卡住
  • 超酷风格
  • 变量赋值的含义
  • 深入php面向对象、模式与实践第5版 电子书
  • 删除的照片怎么还原
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设