Vue3 :Pinia入门

news2025/4/25 17:37:29

Vue3 :Pinia入门

Date: May 11, 2023
Sum: Pinia概念、实现counter、getters、异步action、storeToRefs保持响应式解构


什么是Pinia

Pinia 是 Vue 的专属状态管理库,可以实现跨组件或页面共享状态,是 vuex 状态管理工具的替代品,和 Vuex相比,具备以下优势

  1. 提供更加简单的API (去掉了 mutation )
  2. 提供符合组合式API风格的API (和 Vue3 新语法统一)
  3. 去掉了modules的概念,每一个store都是一个独立的模块
  4. 搭配 TypeScript 一起使用提供可靠的类型推断

简单说,就是原本Vuex有 state mutations actions getters modules

现在Pinia简化成了 state actions getters

中文文档:https://pinia.vuejs.org/zh




创建空Vue项目并安装Pinia

1. 创建空Vue项目

npm init vue@latest

Untitled



2. 安装Pinia并注册

npm i pinia
import { createPinia } from 'pinia'

// 创建Pinia实例
const pinia = createPinia()

// 创建根实例
const app = createApp(App)

// 以插件的形式注册
app.use(pinia).mount('#app')



实现counter

核心步骤:

  1. 定义store
  2. 组件使用store

1- 定义store

counter.js

import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useCounterStore = defineStore('counter', ()=>{
  // 数据 (state)
  const count = ref(0)

  // 修改数据的方法 (action)由于这是组合式写法,所以普通函数就是action
  const increment = ()=>{ 
    count.value++
  }

  // 以对象形式返回
  return {
    count,
    increment
  }
})

理解:

定义仓库counter返回的是一个函数,这里采用useCounterStore接收

在定义store的时候,我们采取和组合式api一样的写法,不过需要return回需要的数据与方法。

2- 组件使用store

App.vue

<script setup>
  // 1. 导入use方法
  import { useCounterStore } from '@/stores/counter'
  // 2. 执行方法得到store实例对象  store里有数据和方法
  const counterStore = useCounterStore()
</script>

<template>
    <button @click="counterStore.increment">
    {{ counterStore.count }}
  </button>
</template>

案例:

counter.js

// 导入一个方法 defineStore
import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useCounterStore =  defineStore('counter' , () => {
   // 定义数据(state)
   const count = ref(0)

   // 定义修改数据的方法(action 同步+异步)
   const increment = () => {
    count.value++
   }

   // 以对象的方式return供组件使用
   return {
    count,
    increment
   }
})

App.vue

<template>
  <button @click="counterStore.increment">{{ counterStore.count }}</button>
</template>

<script setup>
// 1. 导入 use 打头的方法
import { useCounterStore } from '@/store/counter'
// 2. 执行方法得到store实例对象
const counterStore = useCounterStore()
console.log(counterStore);
</script>

<style>

</style>

效果:实现一个计数器




实现getters

getters直接使用计算属性即可实现

实现:这里的doubleCount永远会随着count的变化而变化

// 数据(state)
const count = ref(0)
// getter (computed)
const doubleCount = computed(() => count.value * 2)



异步action

思想:action函数既支持同步也支持异步,和在组件中发送网络请求写法保持一致

步骤: 1. store中定义action 2. 组件中触发action

  • 接口地址:http://geek.itheima.net/v1_0/channels

  • 请求方式:get

  • 请求参数:无

    需求:在Pinia中获取频道列表数据并把数据渲染App组件的模板中

Untitled

1- store中定义action

const API_URL = 'http://geek.itheima.net/v1_0/channels'

export const useCounterStore = defineStore('counter', ()=>{
  // 数据
  const list = ref([])
  // 异步action
  const loadList = async ()=>{
    const res = await axios.get(API_URL)
    list.value = res.data.data.channels
  }
  
  return {
    list,
    loadList
  }
})

2- 组件中调用action

<script setup>
	import { useCounterStore } from '@/stores/counter'
  const counterStore = useCounterStore()
  // 调用异步action
  counterStore.loadList()
</script>

<template>
	<ul>
    <li v-for="item in counterStore.list" :key="item.id">{{ item.name }}</li>
  </ul>
</template>



storeToRefs保持响应式解构

直接基于store进行解构赋值,响应式数据(state和getter)会丢失响应式特性,使用storeToRefs辅助保持响应式

问题

Untitled

原因

store是一个用reactive包装的对象

上面我们采用解构的方式从 counterStore 中取出 count msg

具体操作:

<script setup>
  import { storeToRefs } from 'pinia'
    import { useCounterStore } from '@/stores/counter'
  const counterStore = useCounterStore()
  // 使用它storeToRefs包裹之后解构保持响应式
  const { count } = storeToRefs(counterStore)

  const { increment } = counterStore

</script>

<template>
    <button @click="increment">
    {{ count }}
  </button>
</template>

理解:数据和方法如何解构赋值

数据解构赋值:

采用解构赋值,并采用方法包裹

方法解构赋值:

直接解构赋值即可

App.vue

<template>
  <button @click="increment">{{ count }}</button>
  <p>{{ doubleCount }}</p>
  <ul>
    <li v-for="item in counterStore.getList" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

<script setup>
	// 1. 导入 use 打头的方法
	import { useCounterStore } from '@/stores/counter'
	import { onMounted } from 'vue'
	import { storeToRefs } from 'pinia'
	// 2. 执行方法得到store实例对象
	const counterStore = useCounterStore()
	
	// 数据解构:
	// 直接解构赋值(会造成响应式丢失)
	  // 这里采用方法包裹(可以保持响应式的更新)
	const { count, doubleCount } = storeToRefs(counterStore)
	
	// 方法解构:
	  // 注: 方法解构直接从counterStore中解构赋值即可
	const { increment } = counterStore
	
	onMounted(() => {
	  counterStore.getList()
	})
</script>

效果:

Untitled

注意:

如图所示,直接解构赋值,则只会传值回来。而采用解构赋值,并采用方法包裹,则传回对象。

总结:

  1. pinia是用来做什么的?

    集中状态管理工具,新一代的vuex

  2. Pinia中还需要mutation吗?

    不需要,action既支持同步也支持异步
    Pinia如何实现getter?
    computed计算属性函数

  3. Pinia产生的Store如何解构赋值数据保持响应式?

storeToRefs




Pinia的调试

Vue官方的 dev-tools 调试工具 对 Pinia直接支持,可以直接进行调试

Untitled




Pinia持久化插件

官方文档:https://prazdevs.github.io/pinia-plugin-persistedstate/zh/

  1. 安装插件 pinia-plugin-persistedstate
npm i pinia-plugin-persistedstate
  1. 使用 main.js
import persist from 'pinia-plugin-persistedstate'
...
app.use(createPinia().use(persist))

main.js 完整配置

import { createPinia } from 'pinia'
import { createApp } from 'vue'
import App from './App.vue'
import persist from 'pinia-plugin-persistedstate'

const pinia = createPinia()
const app = createApp(App)

app.use(pinia.use(persist)).mount('#app')
  1. 配置 store/counter.js 开启当前模块的持久化
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'

export const useCounterStore = defineStore('counter', () => {
  ...
  return {
    count,
    doubleCount,
    increment
  }
}, {
  persist: true
})
  1. 其他配置,看官网文档即可
persist: {
	key: 'name'  // 修改本地存储的唯一标识
	paths: ['count']  // 存储的是哪些数据
}

补充:查看浏览器存储信息

在 Application 中查看存储信息

Untitled

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/863447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

晨控CK-GW06-E01与汇川H5U系列PLC通讯手册

晨控CK-GW06-E01与汇川H5U系列PLC通讯手册 晨控CK-GW06-E01是一款支持标准工业通讯协议 EtherNet IP 的网关控制器,方便用户集成到PLC等控制系统中。本控制器提供了网络 POE 供电和直流电源供电两种方式&#xff0c;确保用户在使用无 POE 供电功能的交换机时可采用外接电源供电…

18 | 淘宝用户行为分析

分析目的 本报告以淘宝app的用户消费行为数据为数据集,通过行业的指标对淘宝用户行为进行分析,从而探索淘宝用户的行为模式,具体指标包括: 日PV和日UV分析,付费率分析,复购行为分析,漏斗流失分析和用户价值RFM分析。为用户运营更好地解析和管理用户(例如对高价值用户的维…

SpringBoot+Vue3打造企业级一体化PaaS系统

目录 一、前言 二、PaaS的概念 三、PaaS中包含什么&#xff1f; 四、使用PaaS的优势 五、SpringBootVue3打造企业级PaaS系统 六、小结 一、前言 云计算的三种模型是PaaS&#xff0c;SaaS&#xff08;软件即服务&#xff09;和IaaS&#xff08;基础架构即服务&#xff09;。 Iaa…

陪跑多年,Postgres终崛起封王!(译)

Postgres开源数据库刚刚度过了它的25岁生日。遗憾的是&#xff0c;它既没有凭借数百万美元的风险投资脱颖而出&#xff0c;也没有获得技术布道师DevRel团队的支持&#xff0c;只处于起步阶段&#xff0c;但却一直在更新。 几个月之后&#xff0c;Postgres 16正式版可能会闪亮登…

Active Directory安全和风险状况管理

风险评估和管理 风险评估和管理是主动安全性和合规性管理不可或缺的一部分。 发现关键基础设施组件中的风险行为和配置对于阻止网络入侵和预防网络攻击至关重要。帐户泄露和配置错误漏洞是用于破坏网络的常见技术。当评估、监控和降低 Active Directory 基础架构的风险时&…

阿里云SMS开通流程

No1&#xff1a;登录阿里云首页&#xff1a;选择 产品——>企业服务与云通信——>云通信——>短信服务 No2:选择 免费开通 No3&#xff1a;之后根据提示操作即可。 No4&#xff1a;开通之后效果如图&#xff1a; 至此短信服务已经开通。购买短信包之后便可使用

python异步IO完全指南

原地址&#xff1a;https://flyingbyte.cc/post/async_io/ python异步IO完全指南 做为一种并行编程的範式&#xff0c;异步IO在Python中非常受重视&#xff0c;从Python3.4到3.7快速演进。 我们已经有多线程&#xff0c;多进程&#xff0c;并发&#xff08;concurrency&#x…

cesium学习记录05-加载数据(矢量、影像、地形、3D模型)

1. 矢量数据&#xff1a; 1.1. GeoJSON 定义&#xff1a; 一个基于JSON的地理数据格式&#xff0c;Cesium支持GeoJSON的直接加载。 例子&#xff1a; 加载一个简易故宫建筑的GeoJSON数据。 代码&#xff1a; /*** 添加故宫geojson数据*/AddGuGong() {var viewer this.v…

提取有像素的掩码和原图

有些数据集给的掩码是全黑图片&#xff0c;需要将全黑的掩码剔除&#xff0c;保留有标签的掩码。 DDR-dataset 眼底图像处理 from PIL import Image import cv2 import osdef extract_mask_and_original(mask_path, original_path, output_folder):# 读取黑白掩码图片和同名原…

UDP 的报文结构和注意事项

目录 一. UDP的特点 二. UDP协议 1. UDP协议端格式 2.UDP的报文结构 3. 基于UDP的应用层协议 三. (高频面试题) 一. UDP的特点 无连接&#xff1a;知道对端的IP和端口号就直接进行传输&#xff0c;不需要建立连接。不可靠&#xff1a;即使因为网络故障等原因无法将数据报发送…

重磅!软考或全部改为机考?

最近&#xff0c;有同学分享了一张署名为“工业和信息化部教育与考试中心”的文件截图。 注&#xff1a;该截图来源于网络&#xff0c;而非官方 以下为该截图文件全文&#xff1a; 关于2023年下半年计算机软件资格考试有关工作调整的通知 各省、自治区、直辖市及计划单列市…

医疗PACS源码,支持三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜

C/S架构的PACS系统源码&#xff0c;PACS主要进行病人信息和影像的获取、处理、存储、调阅、检索、管理&#xff0c;并通过网络向全院提供病人检查影像及诊断报告&#xff1b;各影像科室之间共享不同设备的病人检查影像及诊断报告;在诊断工作站上&#xff0c;调阅HIS中病人的其它…

ThreadLocal的内存泄漏是怎么发生的

前言 在分析ThreadLocal导致的内存泄露前&#xff0c;需要普及了解一下内存泄露、强引用与弱引用以及GC回收机制&#xff0c;这样才能更好的分析为什么ThreadLocal会导致内存泄露呢&#xff1f;更重要的是知道该如何避免这样情况发生&#xff0c;增强系统的健壮性。 内存泄露 …

元宇宙核能发电VR模拟仿真实训教学为建设新型电力系统提供重要支撑

随着“碳达峰、碳中和”目标与建设新型能源体系的提出&#xff0c;在元宇宙环境下建设电力系统是未来发展的趋势。以物联网、区块链、数字孪生、混合现实等技术为主要代表的元宇宙技术体系及其在电力和能源系统中的应用&#xff0c;将会促进智能电网的发展&#xff0c;为建设新…

Win10启动Jmeter报错提示jmeter.log拒绝访问问题

jmeter版本&#xff1a;5.4.1 查看版本 在dos命令窗口中进入jmeter安装目录下的bin目录中&#xff1a;执行jmeter - v命令 我启动的方式是&#xff1a;进入jmeter安装目录下的bin目录中双击jmeter.bat启动的。结果报错&#xff0c;但是不影响使用。 报错日志如下&#xff1a; …

ip地址修改器软件哪个好 ip地址切换器有哪些

IP地址修改器是一种常用的网络工具&#xff0c;用于修改计算机或网络设备的IP地址。在网络连接中&#xff0c;IP地址被用于标识每个设备的唯一地址&#xff0c;通过它来实现设备之间的通信和数据传输。然而&#xff0c;有时候我们需要修改IP地址以解决一些网络问题或实现特定的…

网络基础知识:Trunk、Bond、mode4

【背景】 近期项目涉及到硬件服务器的交付&#xff0c;组网涉及到Trunk、Bond、mode4&#xff0c;做一个学习笔记。 【为什么要做mode4 &#xff1f;】 硬件都有故障率&#xff0c;为了做到硬件冗余高可用&#xff0c;通过软件配置将两个或多个&#xff08;一般是两个&#xf…

恒运资本:申购新股不买可以吗?

跟着商场改变&#xff0c;现在申购新股已成为许多出资者的热门论题。可是&#xff0c;许多人对于申购新股后不购买的处理方式存在疑惑。在现实中&#xff0c;申购新股后不购买的状况是常常发生的&#xff0c;本文将深入探讨这个论题并从不同的视点进行剖析。 首先&#xff0c;从…

ASEMI快恢复二极管APT80DQ40BG封装尺寸

编辑-Z APT80DQ40BG参数描述&#xff1a; 型号&#xff1a;APT80DQ40BG 最大峰值反向电压(VRRM)&#xff1a;400V 最大直流阻断电压VR(DC)&#xff1a;400V 平均整流正向电流(IF)&#xff1a;80A 非重复峰值浪涌电流(IFSM)&#xff1a;600A 工作接点温度和储存温度(TJ, …

新华三超融合态势感知标准版

产品概述&#xff1a; H3C SecCenter CSAP-XS 超融合态势感知一体机产品集合了态势感知和安全流量分析探针设备能无需复杂配置&#xff1b;态势感知平台具备强大的安全分析和可视化呈现功能&#xff1b;同时具备远程专家会诊功能&#xff0c;通过云端协同实现外部安全服务资源的…