【VUE基础】VUE3第九节—Pinia使用

news2024/11/14 23:12:03

Pinia使用

  • Pinia简介
  • 安装Pinia
  • 存储数据和读取数据
    • State
      • 读取数据
      • 重置 state
      • 修改state值
      • storeToRefs
      • 监听state
    • Getter
      • 读取数据
    • Action

Pinia简介

Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。

安装Pinia

yarn add pinia
# 或者使用 npm
npm install pinia

在这里插入图片描述
创建一个 pinia 实例 (根 store) 并将其传递给应用:

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

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

app.use(pinia)
app.mount('#app')

显示下图证明使用pinia成功
在这里插入图片描述

存储数据和读取数据

Store (如 Pinia) 是一个保存状态和业务逻辑的实体,它并不与你的组件树绑定。换句话说,它承载着全局状态。它有点像一个永远存在的组件,每个组件都可以读取和写入它。它有三个概念,state、getter 和 action,我们可以假设这些概念相当于组件中的 data、 computed 和 methods。

Store 是用 defineStore() 定义的,它的第一个参数要求是一个独一无二的名字:

import { defineStore } from 'pinia'

// 你可以任意命名 `defineStore()` 的返回值,但最好使用 store 的名字,同时以 `use` 开头且以 `Store` 结尾。
// (比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const useAlertsStore = defineStore('alerts', {
  // 其他配置...
})

有两种写法
选项式Store

export const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  getters: {
    double: (state) => state.count * 2,
  },
  actions: {
    increment() {
      this.count++
    },
  },
})

组合式Store

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  const doubleCount = computed(() => count.value * 2)
  function increment() {
    count.value++
  }

  return { count, doubleCount, increment }
})

在 Setup Store 中:

  • ref() 就是 state 属性
  • computed() 就是 getters
  • function() 就是 actions

State

在 Pinia 中,state 被定义为一个返回初始状态的函数

import { defineStore } from 'pinia'

export const useUserStore = defineStore("user",{
    state(){
        return{
            username : "xiaoc",  //属性都将自动推断出它们的类型
            age : 25,
            poclist:[{ id: "dasdasdad01", title: "禅道 12.4.2 后台任意文件上传漏洞", content: "禅道 <= 12.4.2版本" },
            { id: "dasdasdad02", title: "Rails sprockets 任意文件读取漏洞", content: "Sprockets < 3.7.1" },
            { id: "dasdasdad03", title: "Rails sprockets 任意文件读取漏洞", content: "Sprockets < 3.7.1" },
            { id: "dasdasdad04", title: "HiKVISION 综合安防管理平台 report 任意文件上传漏洞", content: "HiKVISION 综合安防管理平台" }]
        }
    }
})

在这里插入图片描述

在这里插入图片描述

读取数据

默认情况下,你可以通过 store 实例访问 state,直接对其进行读写。

import {useUserStore} from '@/store/user'

const userStore =useUserStore()
console.log(userStore)

在这里插入图片描述

重置 state

使用选项式 API 时,你可以通过调用 store 的 $reset() 方法将 state 重置为初始值。

userStore.$reset()
console.log(userStore)

在 Setup Stores 中,您需要创建自己的 $reset() 方法:

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)

  function $reset() {
    count.value = 0
  }

  return { count, $reset }
})

修改state值

直接修改

userStore.username = "xiaohei"

在这里插入图片描述

批量修改

const userStore =useUserStore()
userStore.$patch({
  username:'xiaoc123456',
  age:100,
})

在这里插入图片描述

借助action修改(action中可以编写一些业务逻辑)

import { defineStore } from 'pinia'

export const useUserStore = defineStore("user",{
    state(){
        return{
            username : "xiaoc",  //属性都将自动推断出它们的类型
            age : 25,
            poclist:[{ id: "dasdasdad01", title: "禅道 12.4.2 后台任意文件上传漏洞", content: "禅道 <= 12.4.2版本" },
            { id: "dasdasdad02", title: "Rails sprockets 任意文件读取漏洞", content: "Sprockets < 3.7.1" },
            { id: "dasdasdad03", title: "Rails sprockets 任意文件读取漏洞", content: "Sprockets < 3.7.1" },
            { id: "dasdasdad04", title: "HiKVISION 综合安防管理平台 report 任意文件上传漏洞", content: "HiKVISION 综合安防管理平台" }]
        }
    },
    actions:{
        updateusername(){
            this.username ="这是通过action修改的名字"
        }
    }

组件中调用action即可

// 使用countStore
const countStore = useCountStore()

// 调用对应action
countStore.incrementOdd(n.value)

在这里插入图片描述
在这里插入图片描述

storeToRefs

通过解构获取数据,会提示获取到的数据是常数,而不是响应式数据

const {username,age,poclist} =userStore

function changeUsername(){
 ager += 1
}

在这里插入图片描述
需要使用storeToRefs

const {username,age,poclist} =storeToRefs(userStore)

function changeUsername(){
 age.value += 1
}

监听state

类似于 Vuex 的 subscribe 方法,你可以通过 store 的 $subscribe() 方法侦听 state 及其变化。比起普通的 watch(),使用 $subscribe() 的好处是 subscriptions 在 patch 后只触发一次 (例如,当使用上面的函数版本时)。

cartStore.$subscribe((mutation, state) => {
  // import { MutationType } from 'pinia'
  mutation.type // 'direct' | 'patch object' | 'patch function'
  // 和 cartStore.$id 一样
  mutation.storeId // 'cart'
  // 只有 mutation.type === 'patch object'的情况下才可用
  mutation.payload // 传递给 cartStore.$patch() 的补丁对象。

  // 每当状态发生变化时,将整个 state 持久化到本地存储。
  localStorage.setItem('cart', JSON.stringify(state))
})
userStore.$subscribe((mutation,state)=>{
  console.log(mutation,state);
  
})

在这里插入图片描述

存储本地会话

function changename(){
  userStore.updateusername()
  localStorage.setItem('poclist',JSON.stringify(userStore.poclist))
}

在这里插入图片描述

Getter

Getter 完全等同于 store 的 state 的计算值。可以通过 defineStore() 中的 getters 属性来定义它们。推荐使用箭头函数,并且它将接收 state 作为第一个参数:

import { defineStore } from 'pinia'

export const useUserStore = defineStore("user",{
    state(){
        return{
            username : "xiaoc",  //属性都将自动推断出它们的类型
            age : 25,
            poclist:[{ id: "dasdasdad01", title: "禅道 12.4.2 后台任意文件上传漏洞", content: "禅道 <= 12.4.2版本" },
            { id: "dasdasdad02", title: "Rails sprockets 任意文件读取漏洞", content: "Sprockets < 3.7.1" },
            { id: "dasdasdad03", title: "Rails sprockets 任意文件读取漏洞", content: "Sprockets < 3.7.1" },
            { id: "dasdasdad04", title: "HiKVISION 综合安防管理平台 report 任意文件上传漏洞", content: "HiKVISION 综合安防管理平台" }]
        }
    },
    getters:{
        doubleAge:(state)=>state.age*2
    },
    actions:{
        updateusername(){
            this.username ="这是通过action修改的名字"
        }
    }
})

使用其他 getter
我们也可以通过 this 访问到整个 store 实例,但(在 TypeScript 中)必须定义返回类型。这是为了避免 TypeScript 的已知缺陷,不过这不影响用箭头函数定义的 getter,也不会影响不使用 this 的 getter。

读取数据

可以直接访问 store 实例上的 getter

getters:{
    doubleAge:(state)=>state.age*2,
    changeDoubleAge():number{
        return this.doubleAge*4
    }
},

在这里插入图片描述

Action

Action 相当于组件中的 method。它们可以通过 defineStore() 中的 actions 属性来定义,并且它们也是定义业务逻辑的完美选择。

export const useCounterStore = defineStore('main', {
  state: () => ({
    count: 0,
  }),
  actions: {
    increment() {
      this.count++
    },
    randomizeCounter() {
      this.count = Math.round(100 * Math.random())
    },
  },
})

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

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

相关文章

24年,计算机仍然是最热门的专业?!

大家好&#xff0c;我是程序员鱼皮。最近很多高考完的朋友开始进入了填志愿选专业的时期。出于好奇&#xff0c;我也在网上了解了一下今年的热门专业和就业情况&#xff0c;结果并没有出乎我的意料&#xff0c;对于很多省份&#xff0c;计算机科学与技术依然是最热门的专业&…

视频汇聚平台EasyCVR设备录像回看请求播放时间和实际时间对不上,是何原因?

安防监控EasyCVR视频汇聚平台可提供多协议&#xff08;RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK&#xff09;的设备接入、音视频采集、视频转码、处理、分发等服务&#xff0c;系统具备实时监控、云端录像、回看、告警、平台级联以及多视频流格式分发等视…

spring的bean注册

bean注册 第三方jar包的类想添加到ioc中&#xff0c;加不了Component该怎么办呢。 可以使用Bean和Import引入jar包&#xff0c;可以使用maven安装到本地仓库。 修改bean的名字&#xff1a;Bean("aaa")使用ioc的已经存在的bean对象&#xff0c;如Country&#xff1a;p…

HTML实现图片查看与隐藏

你好呀&#xff0c;我是小邹。 在网页设计中&#xff0c;提供一个直观且用户友好的图片查看功能是提升用户体验的重要一环。本文将详细介绍如何使用HTML、CSS和JavaScript来实现图片的查看与隐藏功能。通过本教程&#xff0c;你将学会如何让页面上的图片在点击时放大显示&…

产线级MES系统在装配行业的具体应用

在装配行业中&#xff0c;产线级MES系统能够帮助企业优化生产流程&#xff0c;提高产品质量&#xff0c;增强生产效率。以下是产线级MES系统在装配行业中的一些具体应用场景。 了解慧都产线级MES系统>> 产线级MES系统应用场景 1. 生产过程监控与管理 MES系统可以实时…

基石Apollo国际化整合及配置上线规范治理

背景 随着公司站点的增多和国际化业务的发展&#xff0c;Apollo配置平台也呈现出多国家、多环境部署、各环境配置孤立操作、配置上下线无规范流程的情况。基于当前的情况&#xff0c;主要的痛点问题如下&#xff1a; 国际化apollo未与主营apollo统一, 导致国际化Apollo生产配…

react umi把将file文件数据转成二进制流数据格式

后端要求文件上传传递二进制文件&#xff1f;&#xff1f;&#xff1f; 参考 umi-request上传FormData类型问题_umi-request formdata-CSDN博客 import request from /utils/request; // 批量下发(此接口使用from表单接收) export async function issuance_audit_create(param…

第33讲:K8S集群StorageClass使用Ceph CSI供应商与Cephfs文件系统集成

文章目录 1.Ceph CSI供应商简介2.创建Cephfs文件系统为StorageCLass提供底层存储端2.1.创建Cephfs文件系统2.2.在Cephfs文件系统中为Storageclass创建子目录2.3.在Cephfs文件系统中创建一个子卷 3.在K8S集群中部署Cephfs-CSI供应商客户端3.1.下载Cephfs-CSI客户端的资源编排文件…

计算机网络——网络层(概念及IP地址)

网络层概念 网络层向上层提供的两种服务 在计算机网络领域&#xff0c;网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接”&#xff09;曾引起了长期的争论。 争论焦点的实质就是:在计算机通信中&#xff0c;可靠交付应当由谁来负责?是网络还是端系统&#xff1f…

rfid资产管理系统解决方案 rfid固定资产管理系统建设方案

在现代化的仓库储备中&#xff0c;仅仅完成对货物进出的简单批次处理已经不再足够&#xff0c;对库内货品的种类、数量、生产属性、垛位等信息的清晰记录变得至关重要。然而&#xff0c;传统的资产管理方式如条形码在长期使用中逐渐暴露出不耐脏、数据存储量小、读取间隔短、不…

js吸顶导航

吸顶导航 当我们浏览页面篇幅较大&#xff0c;浏览过半的时候想回到导航位置&#xff0c;只能通过往回滚动或通过”回到顶部”重新滚动到导航位置&#xff0c;这样的操作显得繁琐与不便。于是便有了吸顶式导航的交互方式&#xff0c;吸顶条导航最大的好处是将最常用或者设计者最…

WAIC | 穿越千年!华院计算AIGC技术实现刘徽、祖冲之和毕达哥拉斯跨时空对话

祖冲之利用刘徽的割圆术&#xff0c;将圆周率π的近似计算精确到小数点后七位&#xff0c;这不仅是数学史上的一项重要突破&#xff0c;也是对无理数逼近问题的早期探索。在现代人工智能中同样能观察到数值逼近的思想&#xff0c;例如模型的训练通常依赖随机优化算法等数值方法…

2.贪心算法.基础

2.贪心算法.基础 基础知识题目1.分发饼干2.摆动序列3.最大子序和4.买股票的最佳时机24.2.买股票的最佳时机5.跳跃游戏5.1.跳跃游戏26.K次取反后最大化的数组和7.加油站8.分发糖果 基础知识 什么是贪心? 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪…

Studying-代码随想录训练营day33| 动态规划理论基础、509.斐波那契函数、70.爬楼梯、746.使用最小花费爬楼梯

第33天&#xff0c;动态规划开始&#xff0c;新的算法&#x1f4aa;(ง •_•)ง&#xff0c;编程语言&#xff1a;C 目录 动态规划理论基础 动态规划的解题步骤 动态规划包含的问题 动态规划如何debug 509.斐波那契函数 70.爬楼梯 746.使用最小花费爬楼梯 总结 动态…

MSPM0G3507——时钟配置(与32关系)

先将32端时钟配置分为1&#xff0c;2&#xff0c;3如图 1是PSC左边未经分频的时钟源&#xff08;HZ&#xff09; 2是经过PSC分频的时钟信号&#xff08;HZ&#xff09; 3是最终的输出信号&#xff08;HZ&#xff09; 3输出的是一个定时器周期的HZ&#xff0c;可以转换成时间 …

哨兵系统:一套实时灵活可配置化的业务指标监控系统

简介: 在KOO分期的线下业务中&#xff0c;需要对很多关键业务指标进行实时监控&#xff0c;并需要根据一定的数据格式&#xff0c;通过企微机器人发往对应的企微群&#xff0c;因此KOO分期技术团队在KOO业务指标库之上&#xff0c;搭建了一套KOO分期业务指标监控系统&#xff…

ppt接单渠道大公开‼️

PPT 接单主要分两种&#xff1a;PPT 模板投稿和PPT 定制接单&#xff0c;我们先从简单的 PPT 模板投稿说起。 PPT 模板投稿 利用业余时间&#xff0c;做一些 PPT 模板上传到平台&#xff0c;只要有人下载你的模板&#xff0c;你就有收入。如果模板质量高&#xff0c;简直就是一…

Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析

章节内容 上一节我们完成了内容&#xff1a; Flume 启动测试Flume Conf编写Flume 测试发送和接收数据 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0c;但…

高德API接入安卓相关问题说明

高德API接入安卓相关问题说明 我们都在怀念过去&#xff0c;失去后我们才懂得珍惜&#xff0c;有些人或事早已经远去&#xff0c;可是还是会想起曾经拥有的岁月&#xff0c;会是一种喜悦&#xff0c;会是一种遗憾…… 目前Android开发已经普遍使用Android Studio&#xff0c;开…

优思学院|当今的丰田精益生产模式落伍了吗?

丰田曾经是全球销量最大的汽车制造商&#xff0c;不过现在却被挖苦为可能会成为下一个汽车界的“诺基亚”。 丰田的前CEO丰田章男对于电动汽车的前景持极度怀疑态度&#xff0c;今年4月他下台&#xff0c;由年轻14岁的佐藤恒治接任。这一变动反映了丰田对电动汽车态度的180度大…