Vue 进阶系列丨Pinia 的基本使用

Vue3 状态管理 - Pinia Pinia 是 Vue 专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品。 阅读详情

e0d9fc6e5ca7278e2983a6897bbe04e5.png

Vue 进阶系列教程将在本号持续发布,一起查漏补缺学个痛快!若您有遇到其它相关问题,非常欢迎在评论中留言讨论,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!


2013年7月28日,尤雨溪第一次在 GItHub 上为 Vue.js 提交代码;2015年10月26日,Vue.js 1.0.0版本发布;2016年10月1日,Vue.js 2.0发布。

最早的 Vue.js 只做视图层,没有路由, 没有状态管理,也没有官方的构建工具,只有一个库,放到网页里就可以直接用了。

后来,Vue.js 慢慢开始加入了一些官方的辅助工具,比如路由(Router)、状态管理方案(Vuex)和构建工具(Vue-cli)等。此时,Vue.js 的定位是:The Progressive Framework。翻译成中文,就是渐进式框架。

Vue.js2.0 引入了很多特性,比如虚拟 DOM,支持 JSX 和 TypeScript,支持流式服务端渲染,提供了跨平台的能力等。Vue.js 在国内的用户有阿里巴巴、百度、腾讯、新浪、网易、滴滴出行、360、美团等等。

Vue 已是一名前端工程师必备的技能,现在就让我们开始深入学习 Vue.js 内部的核心技术原理吧!


什么是 Pinia

Pinia 是 vue 官方成员在2019年11月重新设计的一个状态存储库,它允许你跨组件/页面共享状态,并且是响应式的,类似于 vuex。现在 vuex 已经更新到4.x版本了,你可以认为 pinia 是作为 vuex@5.x 的一种存在。

与vuex相比,有以下几点不同:

  • 没有 mutations,只有 actions。

  • 完美支持TS,相比于vuex,支持 ts 还需要做一些额外的工作,具体内容请移步Vue 进阶系列丨Vuex+TS 代码提示

  • 没有命名空间模块,pinia的store是扁平化结构,你创建的多个store都是相互隔离的,没有嵌套关系。

  • 不再需要注入、导入函数。


创建项目

npm init vite@latest

引入 pinia

npm install pinia
// main.ts
import { createPinia } from 'pinia'


app.use(createPinia())

定义一个store

通过 defineStore 来定义 store,它需要一个唯一的名称,作为第一个参数传入:

// @/store/firstStore.js


import { defineStore } from 'pinia'


// 定义并导出容器,第一个参数是容器id,必须唯一,用来将所有的容器
// 挂载到根容器上
export const useFirstStore = defineStore('myStore',{
  // 定义state,用来存储状态的
  state:()=>{
    return {}
  },
  // 定义getters,类似于computed,具有缓存g功能
  getters:{},
  // 定义actions,类似于methods,用来修改state,做一些业务逻辑
  actions:{}
})

使用刚刚定义的 store:

import { useFirstStore } from '@/store/firstStore.js'


<script setup lang='ts'>
  // 拿到store
  const firstStore = useFirstStore()
</script>

state

定义 state:

import { defineStore } from 'pinia'


// 挂载到根容器上
export const useFirstStore = defineStore('myStore',{
  // 定义state,用来存储状态的
  state:()=>{
    return {
      count:0,
      arr:[1,2,3]
    }
  },
  // 定义getters,类似于computed,具有缓存g功能
  getters:{},
  // 定义actions,类似于methods,用来修改state,做一些业务逻辑
  actions:{}
})

使用 state:

import { useFirstStore } from '@/store/firstStore.js'


<template>
  {{firstStore.count}}
</template>
<script setup lang='ts'>
  // 拿到store
  const firstStore = useFirstStore()
  console.log(firstStore.count) // 0
</script>

注意,将 store 解构之后,就不是响应式的了,如果想要解构,则需要使用 storeToRefs 函数包裹。

原因很简单,store 其实就是一个 reactive 对象,当我们解构的时候,就不是响应式数据了,就像 vue3 中一样,需要使用 toRefs 函数。

import { useFirstStore } from '@/store/firstStore.js'
import { storeToRefs } from 'pinia
<template>
  {{count}}
  {{arr}}
</template>
<script setup lang='ts'>
  // 拿到store
  const firstStore = useFirstStore()
  // 这样就不是响应式的了,当我们修改count的值的时候,页面不会响应式变化
  const { count,arr } = firstStore  // 错误的做法
  const { count,arr } = storeToRefs(firstStore) // 正确的做法
</script>

修改 state:

import { useFirstStore } from '@/store/firstStore.js'


<template>
  {{count}}
</template>
<script setup lang='ts'>
  // 拿到store
  const firstStore = useFirstStore()


  // 方式一,直接修改
  firstStore.count += 1
  // 方式二,如果修改多个数据,可以使用$patch批量修改
  firstStore.$patch({
    count:firstStore.count + 1,
    arr:[...firstStore.arr,4]
  })
  // 方式三: $patch一个函数
  firstStore.$patch(state=>{
    state.count++
    state.arr.push(4)
  })
  // 方式四,调用actions
  firstStore.changeCount()
  // 方式五,替换整个state
  firstStore.$state={
    count:2,
    arr:[1,2,3,4]
  }
  // 方式六:重置state
  firstStore.$reset()
</script>

Getters

定义 getters:

import { defineStore } from 'pinia'


// 挂载到根容器上
export const useFirstStore = defineStore('myStore',{
  // 定义state,用来存储状态的
  state:()=>{
    return {
      count:0,
      arr:[1,2,3]
    }
  },
  // 定义getters,类似于computed,具有缓存g功能
  getters:{
    // 依赖state
    doubleCount(state){
      return state.count *2
    },
    // 依赖其他的getters, :number 是指定返回值类型为number类型
    otherCount():number{
      return this.doubleCount + 1
    }
  },
  // 定义actions,类似于methods,用来修改state,做一些业务逻辑
  actions:{}
})

获取 getters:

import { useFirstStore } from '@/store/firstStore.js'


<template>
  {{firstStore.doubleCount}}
  {{firstStore.otherCount}}
</template>
<script setup lang='ts'>
  // 拿到store
  const firstStore = useFirstStore()
  console.log(firstStore.doubleCount)
  console.log(firstStore.otherCount)
</script>

Actions

定义 actions:

import { defineStore } from 'pinia'


// 挂载到根容器上
export const useFirstStore = defineStore('myStore',{
  // 定义state,用来存储状态的
  state:()=>{
    return {
      count:0,
      arr:[1,2,3]
    }
  },
  // 定义getters,类似于computed,具有缓存g功能
  getters:{
    // 依赖state
    doubleCount(state){
      return state.count *2
    },
    // 依赖其他的getters, :number 是指定返回值类型为number类型
    otherCount():number{
      return this.doubleCount + 1
    }
  },
  // 定义actions,类似于methods,用来修改state,做一些业务逻辑
  actions:{
    // 接收一个参数num,参数的类型是number类型
    addCount(num:number){
      // 通过this获取state中的数据,就像vue2的optionsApi一样
      this.count+=num  
    }
  }
})

调用 actions:

import { useFirstStore } from '@/store/firstStore.js'


<template>
  {{firstStore.count}}
</template>
<script setup lang='ts'>
  // 拿到store
  const firstStore = useFirstStore()
  firstStore.addCount(10)
</script>

至此,pinia 在 vue3 中的简单使用到此就结束了,还是很推荐大家去使用pinia 的,尤其是在TS项目里。现在pinia已经被官方接管了,而且它也是 vue官方成员开发的。这里是 pinia 官网:https://pinia.vuejs.org/ ,大家也可以去官网深入学习。


Vue 进阶系列教程将在本号持续发布,一起查漏补缺学个痛快!若您有遇到其它相关问题,非常欢迎在评论中留言讨论,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!

69ac1f10bbf1e77967d2fd572bf4d096.png

叶阳辉

HFun 前端攻城狮

往期精彩:

vue3 Pinia详解使用详解 通过创建数据仓库vuex 中的 state 在 pinia 中可以引用ref和reactive创建响应式数据vuex 中的getters在 pinia 中可以引用computed创建计算属性vuex 中的mutations和actions在 pinia 中就是普通函数, 同步异步都可以。 阅读详情

相关推荐

Pinia使用方法及持久化存储

Pinia是Vue的专属状态管理库,它允许你跨组件或页面共享状态。它跟Vuex有一定的相似度,但还是有很大的区别。愿意看这篇博客的人,想必已经看过了官方文档,官方文档很详细,包含各种使用情景和理论,因此本文不说理论,只说具体的使用方法,想深入研究的建议去看官方文档,本文适合拿来即用。Pinia 官方文档。

前端学习笔记 2万+

Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)

1、在stores文件夹下创建一个store ,名为user.js ,命名是尽量是见名知意的。2、定义user.jsStore 是使用定义的,并且它需要一个唯一名称,作为第一个参数传递这个name,也称为id,是必要的,Pinia 使用它来将 store 连接到 devtools。将返回的函数命名为use...是跨可组合项的约定// defineStore('userInfo',{}) userInfo就是这个仓库的名称nameusername: '赫赫',age: 30,hobby: [

H524268015wsw的博客 6万+

Vue3中的pinia使用(收藏版)

pinia官方文档Pinia 的优点更多查看文档… 在main.js中引入pinia并创建容器挂载到根实例上 创建stores文件夹和index.js文件(这个文件以后基本不用管了) 在stores文件夹下创建counter.js文件。这个文件就是存有关counter相关的数据。(类似vuex的模块化) defineStore 是需要传参数的, 然后再组件中使用: 运行效果: 可以用vue3的调试工具看pinia案例需求,点击按钮加一: 一个不解构,一个不解构看看区别。 运行结

weixin_57677300的博客 2万+

vue使用pinia (vue2/vue3)

​inia是什么?Pinia 是 Vue.js 的轻量级状态管理库 官方网站:Pinia 中文文档: 介绍 | Pinia 中文文档 pinia与vuex4 相同 是vue 官方 状态管理工具(作者是 Vue 核心团队成员) 是vue开发者工具支持pinia 不同 pinia相比vuex4,对于vue3的 兼容性 更好 pinia相比vuex4,具备完善的 类型推荐 => 对 TS 支持很友好 Pinia 的 API 设计非常接近 Vuex 5 的提案。 vuex只能有一个根级别的状态,

^_^ 8188

前端|Vue Vue3中使用Pinia,保姆级教程

在状态管理中,"store"是一个全局对象,用来保存和管理应用的状态。在Pinia中,store是响应式的,这意味着当store中的状态改变时,依赖这些状态的组件会自动更新。每个Pinia store都是一个独立的实体,包含其自己的状态、getters和actions。在store中定义state,可以将它看作是组件的data选项。return {count: 0getters是store的计算属性,用来派生出一些状态。

weixin_47192158的博客 1万+

pinia的基本使用

Pinia 是 Vue.js 的轻量级状态管理库,专为 Vue 3 设计,同时兼容 Vue 2。它提供了一种简单、直观的方式来管理应用程序的状态,取代了 Vuex 在部分场景下的使用。

m0_43519765的博客 919

Vue3 小菠萝 Pinia使用

Pinia是Vue的存储库,它允许您跨组件/页面共享状态。Pinia的成功可以归功于他管理存储数据的独特功能,例如可扩展性、存储模块组织、状态变化分组、多存储创建等。

“跟他人学,和自己比” 1万+

Vue3 & pinia 的使用

随意建个文件并以 use 开头作为文件名,例如:useCounter.js,示例代码如下:useXXX 仅作为一种声明规范,看你心情定义。count: 0,}),getters: {},actions: {})state当作声明 Vue2dataor Vue3里的响应式数据。getters当作 Vue2/3 里的computed属性。actions当作 Vue2/3 定义methods函数。

Thinking anywhere anytime. 1282

Vue3-Pinia的基本使用

Pinia的使用

meiy_h的博客 2万+

PCIe 6.0实战指南:从链路训练到信号完整性的避坑手册

本文是一份针对PCIe 6.0硬件工程师的实战避坑指南。文章深入解析了从NRZ到PAM4调制带来的信号完整性挑战,详细拆解了链路训练(LTSSM)的复杂过程与调试方法,并提供了从信道仿真到实验室实测(如使用Keysight示波器进行眼图与误码率分析)的完整信号完整性闭环验证策略,帮助工程师解决高速率下的链路不稳定与降速问题。

weixin_29306875的博客 343

WSL2迁移后用户名不见了?一招教你快速恢复Ubuntu22.04默认用户

本文针对WSL2迁移后Ubuntu 22.04默认用户名丢失的常见问题,提供了详细的诊断与修复方案。通过分析迁移底层逻辑,指导用户使用`ubuntu2204.exe config --default-user`命令或配置`/etc/wsl.conf`文件快速恢复用户身份,并涵盖权限修复、冲突解决及自动化迁移脚本等进阶内容,确保子系统迁移后环境完整可用。

web39explorer的博客 558

Pinia的基本使用

(官网解释)一个 Store (如 Pinia)是一个实体,它持有未绑定到您的组件树的状态和业务逻辑。换句话说,它托管全局状态。它有点像一个始终存在并且每个人都可以读取和写入的组件。它有三个概念,state、getters 和 actions 并且可以安全地假设这些概念等同于组件中的“数据”、“计算”和“方法”。我们可以把这三个概念理解为vue组件中的“数据”data、“计算”computed和“方法”methods。store简单来说就是数据仓库的意思,我们数据都放在store里面。

qq_44505797的博客 1万+

Skill的嵌套

Skill的嵌套就很简单,直接引用其他的Skill就好了。在一个 Skill 的 SKILL.md 中,可以明确指示 Claude 去读取另一个 Skill 的文档。

Criss@陈磊 963

【VUE】Vue3项目中Pinia状态管理工具的使用

官网介绍说:Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。的方式是经过优化的,会加快修改速度,对程序的性能有很大的好处。虽然可以直接修改,但是出于代码结构来说, 全局的状态管理还是不要直接在各个组件处随意修改状态,应放于。方法的第二个参数:配置对象,放置state,getters,actions。属性: 修改state全局状态数据,可以是异步也可以是同步。方法的第一个参数:容器的名字,名字必须唯一,不能重复。属性: 用来监视或者说是计算状态的变化的,有缓存的功能。

编码世界 7224

JavaScript实现边缘检测Canny(附完整源码)

JavaScript实现边缘检测Canny(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 708

【项目实战】DevOps制品管理之JFrog Artifactory介绍

JFrog Artifactory是一款领先的二进制软件制品仓库管理工具,由JFrog公司开发。

奶爸的编程之路,也就一周冷个三天 1356

Vue3基本使用Pinia,Pinia和vuex的区别 pinia的基本使用 Pinia状态持久化 pinia-plugin-persistedstate的使用 详细说明!!!

我们都已经有 Vuex 了为什么还要用 Pinia 呢 Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子,结合了 Vuex 5 核心团队讨论中的许多想法; 最终,团队意识到Pinia已经实现了Vuex5中大部分内容,所以最终决定用Pinia来代替Vuex; 与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的仪式,提供了 Composition-API 风格的 API; 【vue3 Pinia使用与讲解】vue3新一代的Store应用工具

akkigg的博客 9429

初识数据之特征选择

【代码】初识数据之特征选择。

M_inherit的博客 1136

Vue3中使用Pinia详解

详细介绍了Vue3中使用Pinia做全局状态管理的使用

九仞山的专栏 2万+

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

* 开启所有数字部分 */#define TLV320AIC3204_REG_LEFT_HEADPHONE_OUT_VOLUME 0x0C /* 左声道耳机输出音量 */#define TLV320AIC3204_REG_DIGITAL_AUDIO_PATH_CONTROL 0x05 /* 数字音频路径控制 */#define TLV320AIC3204_REG_ANALOG_HP_FILTER_CONTROL 0x34 /* 模拟耳机滤波器控制 *//* 最大音量 */

corlin6688的博客 522

LVGL(lv_table)

LVGL中的lv_table是一个轻量级表格控件,用于显示行列式文本数据。它支持设置单元格内容/样式、行列调整、事件响应等基础功能,适用于参数配置、数据展示等场景。通过API可快速创建表格,设置行列数、填充数据,并自定义对齐方式与样式。但需注意默认无滚动条、行数限制等问题。该控件适合简单表格需求,复杂交互需结合自定义事件处理。

m0_49476241的博客 1265

Vue3 状态管理之 Pinia 的使用

Vue3 新的发展方向(来源于尤大知乎) Vue 3 将在 2022 年 2 月 7 日 成为新的默认版本 基于 Vite 的极速构建工具链 <script setup> 带来的开发体验更丝滑的组合式 API 语法 Volar 提供的单文件组件 TypeScript IDE 支持 vue-tsc 提供的针对单文件组件的命令行类型检查和生成 Pinia 提供的更简洁的状态管理 新的开发者工具扩展,同时支持 Vue 2/Vue 3,并且提供一个插件系统来允许社区库自行..

FOR.GET 3万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Vue3】走进Pinia,学习Pinia,使用Pinia

Pinia是一个专为Vue 3设计的集中式状态(数据)管理库,它提供了一种简单而强大的方式来管理应用程序的状态。Pinia的设计理念是尽可能地与Vue的响应式系统集成,以提供最佳的性能和开发体验Pinia是一个强大而灵活的Vue状态管理库,它提供了一种简单而优雅的方式来管理应用程序的状态。通过利用Pinia,我们可以更好地组织和管理我们的Vue应用程序,并确保其具有良好的性能和可维护性。如果您正在寻找一种新的状态管理库,不妨试试Pinia,相信它会给您带来惊喜!

null18的博客 1448

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

vue3中如何使用pinia -- pinia使用教程(一)

pinia 是一个 Vue3 的状态管理库,它的 API 设计和 Vuex 有很大的相似之处,但是它的实现方式和 Vuex 完全不同,它是基于 Vue3 的新特性。这种方案,也不好,要是组件挂载多次,就会创建多个 store,这个 store 也不会被销毁,但是可以手动销毁的 API。上面的 useCounter 使用选项式 api 创建,pinia 也支持组合式 api, 这和 vue3 的组合式函数非常贴近,使用上更加简单。使用一个工厂函数,组件每次挂载,都会执行工厂函数,返回一个新的 store。

JackZhouMine 2014

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Vue3 store+pinia 基本使用

Vue3+pinia 基本使用

m0_62758542的博客 5442

Vue最新状态管理工具Pinia——Pinia的安装与使用

一篇文章带你学会pinia的基本安装和使用

XSL_HR的博客 3899
上一篇: Vue 进阶系列丨自定义指令实现按钮权限功能
下一篇: Webpack 入门系列丨初识 Webpack
HFun TM
博客等级 码龄5年 98粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值