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

  • tinfoil使用教程

    tinfoil使用教程

  • wifi重置密码方法(wifi重置密码方法192.168.10.1)

    wifi重置密码方法(wifi重置密码方法192.168.10.1)

  • 手机恢复出厂设置后怎么还原数据(手机恢复出厂设置)(手机恢复出厂设置后系统会降级吗)

    手机恢复出厂设置后怎么还原数据(手机恢复出厂设置)(手机恢复出厂设置后系统会降级吗)

  • iqoo8pro怎么关闭热点资讯(iqoo8pro怎么关闭5g网络)

    iqoo8pro怎么关闭热点资讯(iqoo8pro怎么关闭5g网络)

  • 网易云背景为什么换不了(网易云背景为什么变成灰色的了)

    网易云背景为什么换不了(网易云背景为什么变成灰色的了)

  • 华为录视频的功能在哪(华为录视频功能手势)

    华为录视频的功能在哪(华为录视频功能手势)

  • 抖音直播点赞有什么用(抖音直播点赞有限制次数吗)

    抖音直播点赞有什么用(抖音直播点赞有限制次数吗)

  • 一个路由器的路由表通常包含(一个路由器的路由表中具有如下的cidr条目)

    一个路由器的路由表通常包含(一个路由器的路由表中具有如下的cidr条目)

  • oppo手机的降温功能在哪里面(oppo手机的降温功能在哪里)

    oppo手机的降温功能在哪里面(oppo手机的降温功能在哪里)

  • 手机屏幕红斑怎么消除(手机屏幕红斑怎么去除)

    手机屏幕红斑怎么消除(手机屏幕红斑怎么去除)

  • 米8ud什么型号(米8的参数)

    米8ud什么型号(米8的参数)

  • oppoa11x带不带闪充(oppoa11x支持闪充吗)

    oppoa11x带不带闪充(oppoa11x支持闪充吗)

  • id暂时禁止免费获取app怎么办(id暂时禁止免费获取app要多久)

    id暂时禁止免费获取app怎么办(id暂时禁止免费获取app要多久)

  • 早期计算机用来干什么(早期计算机主要用来)

    早期计算机用来干什么(早期计算机主要用来)

  • 为什么苹果短信上面有个感叹号(为什么苹果短信收不到)

    为什么苹果短信上面有个感叹号(为什么苹果短信收不到)

  • 苹果手机媒体声音在哪设置(苹果手机媒体声音突然变小是怎么回事)

    苹果手机媒体声音在哪设置(苹果手机媒体声音突然变小是怎么回事)

  • 小米9pro输入法怎么设置(小米9pro输入法复制粘贴板)

    小米9pro输入法怎么设置(小米9pro输入法复制粘贴板)

  • ipadair3可以做ppt吗(ipad3可以做ppt吗)

    ipadair3可以做ppt吗(ipad3可以做ppt吗)

  • 怎么看是不是原装屏(怎么看是不是原装充电器)

    怎么看是不是原装屏(怎么看是不是原装充电器)

  • 微信订票怎么改签不了(微信订票怎么改签不了日期)

    微信订票怎么改签不了(微信订票怎么改签不了日期)

  • 手机回车键是什么意思(手机回车键是什么样的符号)

    手机回车键是什么意思(手机回车键是什么样的符号)

  • 嘀嗒拼车怎么评价(嘀嗒拼车怎么拼单)

    嘀嗒拼车怎么评价(嘀嗒拼车怎么拼单)

  • 怎么给电脑装系统(怎么给电脑装系统和驱动)

    怎么给电脑装系统(怎么给电脑装系统和驱动)

  • 苹果8打字音量怎调大(苹果打字音量小)

    苹果8打字音量怎调大(苹果打字音量小)

  • 税务局防范税收风险的措施
  • 税务行政复议包括必须复议自由复议和选择复议三种类型
  • 用友t3核算管理模块怎么结账
  • 福利费计提多了如何处理
  • 环保税申报表怎么填制
  • 管理费用当月可以有余额吗
  • 天猫的费用一共17个分别是什么
  • 企业所得税申报表在哪里打印
  • 本金加收入减支出等于的是利润吗
  • 外购无形资产的相关税费包括增值税吗
  • 增值税采用零税率政策的内容
  • 施工企业预算怎么编制
  • 股权内部转让交增值税吗
  • 销售货物物流公司丢件赔偿会计分录
  • 金税四期上线对高净值人士的影响
  • 企业如何实现资源共享
  • 蓝字发票是什么
  • 金蝶增加银行存款账户,期间不对
  • 企业的其他业务收入有
  • 农贸市场可以收什么的费
  • mac终端更新系统
  • 应付职工薪酬年底怎么结转
  • 网络唤醒的原理
  • 100%控股有什么风险
  • 非盈利组织捐赠现金支需要什么资料
  • 工会经费,职工福利费,教育经费的扣除标准
  • PHP:oci_set_client_info()的用法_Oracle函数
  • 简要说明php web的工作流程
  • php可以连接access吗
  • 如何自定义win10开机音乐
  • thinkphp错误日志目录
  • PHP:shell_exec()的用法_命令行函数
  • php怎么写数据库
  • 常用的php操作mysql的函数有哪些
  • h5支付功能
  • php require函数
  • 企业会计准则季度怎么填
  • 织梦好用吗
  • 研发支出资本化支出属于什么科目
  • 外贸企业出口免税政策
  • Python支持向量能干什么
  • centos安装MySQL数据库
  • 企业资本包括
  • 会计信息采集每年都要采集吗
  • 小规模纳税人通行费可以抵扣吗
  • 累计净值是怎么计算的
  • 代理费属于
  • 请培训老师的费用怎么处理
  • 公司年度汇算清缴费用多少
  • 缴纳残保金会计分录怎么做
  • 产品出口认证
  • 关于外币折算会计处理的表述中
  • 诉讼代理费计入成本吗
  • 小规模如何申报1个点
  • 企业所得税季度交还要年交吗
  • 新会计准则应用
  • mysql深度解析
  • mysqlgroupby用法解析详细
  • win10 更新 蓝屏
  • windows8文件夹怎么加密
  • 系统占用90g怎么删
  • 如何显示文件后缀win10
  • 进程mmc.exe
  • pavsrv51.exe - pavsrv51是什么进程 有什么用
  • pdoors.exe
  • win10怎么用ios上网
  • windows7老是死机
  • vsftpd的配置文件
  • win8.1删除所有内容并重新安装
  • jquery图片轮播视频
  • jquery中odd是什么意思
  • python灰度变换
  • python模拟登陆并抓取
  • python版本怎么选
  • 浅析2种JavaScript继承方式
  • 广西地方税务网站官网
  • 税务部门的扣款协议
  • 如果快递没有按时发货东西变质怎么办
  • 太原公安分局有几个
  • 18个税种已立法数量
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设