[Vue3] pinia状态管理

news2025/1/18 5:54:33

文章目录

      • 1.pinia的介绍
      • 2.pinia的配置
      • 3.state状态管理
        • 3.1 state的基本使用
        • 3.2 state的访问
      • 4.getters

1.pinia的介绍

Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。如果你熟悉组合式 API 的话,你可能会认为可以通过一行简单的 export const state = reactive({}) 来共享一个全局状态。

与 Vuex 相比,Pinia 不仅提供了一个更简单的 API,也提供了符合组合式 API 风格的 API,最重要的是,搭配 TypeScript 一起使用时有非常可靠的类型推断支持。

Vuex 3.x 只适配 Vue 2,而 Vuex 4.x 是适配 Vue 3 的。

  1. mutation 已被弃用。它们经常被认为是极其冗余的。它们初衷是带来 devtools 的集成方案,但这已不再是一个问题了。
  2. 无需要创建自定义的复杂包装器来支持 TypeScript,一切都可标注类型,API 的设计方式是尽可能地利用 TS 类型推理。
  3. 无过多的魔法字符串注入,只需要导入函数并调用它们,然后享受自动补全的乐趣就好。
  4. 无需要动态添加 Store,它们默认都是动态的,甚至你可能都不会注意到这点。注意,你仍然可以在任何时候手动使用一个 Store 来注册它,但因为它是自动的,所以你不需要担心它。
  5. 不再有嵌套结构的模块。你仍然可以通过导入和使用另一个 Store 来隐含地嵌套 stores 空间,虽然是 Pinia 从设计上提供的是一个扁平的结构,但仍然能够在 Store 之间进行交叉组合。你甚至可以让 Stores 有循环依赖关系。
  6. 不再有可命名的模块。考虑到 Store 的扁平架构,Store 的命名取决于它们的定义方式,你甚至可以说所有 Store 都应该命名。

2.pinia的配置

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

main.js

import { createApp } from 'vue'
import { createPinia } from 'pinia'  // 引入pinia
import App from './App.vue'
 
const pinia = createPinia()    // 创建实例
const app = createApp(App)
 
app.use(pinia)    // 安装插件
app.mount('#app')

在这里插入图片描述

在这里插入图片描述

3.state状态管理

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

3.1 state的基本使用

在这里插入图片描述

src/store/counter.js

1.Option Store:与 Vue 的选项式 API 类似,我们也可以传入一个带有 state、actions 与 getters 属性的 Option 对象

在这里插入图片描述

import { defineStore } from 'pinia'
 
// 你可以对 `defineStore()` 的返回值进行任意命名,但最好使用 store 的名字,
// 同时以 `use` 开头且以 `Store` 结尾。(比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const useStore = defineStore('main', {
  state: () => ({ count: 0 }),
  getters: {
    double: (state) => state.count * 2,
  },
  actions: {
    increment() {
      this.count++
    },
  },
})

2.Setup Store:也存在另一种定义 store 的可用语法。与 Vue 组合式 API 的 setup 函数 相似,我们可以传入一个函数,该函数定义了一些响应式属性和方法,并且返回一个带有我们想暴露出去的属性和方法的对象。

在这里插入图片描述

import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
 
export const useCounterStore = defineStore('counter', () => {
  // state
  const count = ref(0)
 
  // getters
  const double = computed(() => count.value * 2)
  
  // actions
  function increment () {
    count.value++
  }
 
  return { count, double, increment }
})

src/App.vue

<template>
  <div>
    <h1>我是app</h1>
    {{ counter.count }}
    {{ count }}
  </div>
</template>
 
<script setup>
import { useCounterStore } from '@/stores'
import { storeToRefs } from 'pinia'
const counter = useCounterStore()
 
// ❌ 这将无法生效,因为它破坏了响应性
// 这与从 `props` 中解构是一样的。
const { count, double } = counter
 
 
// `name` and `doubleCount` 都是响应式 refs
// 这也将为由插件添加的属性创建 refs
// 同时会跳过任何 action 或非响应式(非 ref/响应式)属性
const { count, double } = storeToRefs(counter)
// 名为 increment 的 action 可以直接提取
const { increment } = counter
 
</script>
3.2 state的访问

得到state的值。

import { useCounterStore } from './store/counter' // 导入创建好的counter.js
const counter = useCounterStore()    // 实例化
 
console.log(counter.count)    // 0import { useCounterStore } from './store/counter' // 导入创建好的counter.js
const counter = useCounterStore()    // 实例化
 
console.log(counter.count)    // 0

store 的 $reset() 方法将 state 重置为初始值。

import { useCounterStore } from './store/counter' // 导入创建好的counter.js
const counter = useCounterStore()    // 实例化
 
counter.$reset()    // store 的 $reset() 方法将 state 重置为初始值。

修改state的4种方法。

<script setup>
import { useCounterStore } from './store/counter'
const counter = useCounterStore()
 
// 方式1 
counter.count++
 
//以下两种方式可以一次性修改多个值
 
// 方式2: $patch 对象写法
counter.$patch({
  count: counter.count + 1,
})
 
// 方式3: $patch 函数写法
counter.$patch((state) => {
  // state 是 counter里的state
  state.count = state.count + 1
})
 
// 方式4: 通过 actions 创建的函数修改
counter.increment()
 
</script>

$subscribe对state的订阅。

<script setup>
import { useCounterStore } from './store/counter'
const counter = useCounterStore()
 
// 必须先订阅在修改才会触发
counter.$subscribe((mutation, state) => {
  console.log(mutation)
  console.log(state)
  /**
   * 其中 state 是 mainStore 实例,
   * 而 mutation mutation对象主要包含三个属性
        events : 是这次state改变的具体数据,包括改变前的值和改变后的值等等数据
        storeId :是当前store的id
        type:type表示这次变化是通过什么产生的,主要有三个分别是
          “direct” :通过 action 变化的
          ”patch object“ :通过 $patch 传递对象的方式改变的
          “patch function” :通过 $patch 传递函数的方式改变的
   */
 
  // 每当状态发生变化时,将整个 state 持久化到本地存储。
  localStorage.setItem('counter', JSON.stringify(state))
})
 
// 修改state值
counter.increment()
 
</script>

4.getters

export const useCounterStore = defineStore('Counter',{
  state: () => {
    return {
      name: '快乐超人',
    }
  },
  getters: {
    formatName: (state) => {
      return state.name + '00';
    },
  },
})
import { useCounterStore } from './store/counter'
const counter = useCounterStore()
 
counter.formatName    //快乐超人00import { useCounterStore } from './store/counter'
const counter = useCounterStore()
 
counter.formatName    //快乐超人00

getters传入参数。

export const useCounterStore = defineStore('Counter', {
  getters: {
    getUserById: (state) => {
      return (userId) => state.users.find((user) => user.id === userId)
    },
  },
})
import { useCounterStore } from './store/counter'
const counter = useCounterStore()
 
counter.getUserById(2)

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

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

相关文章

梦想编织者——Adobe Dreamweaver

今天&#xff0c;我们来谈谈一款在Adobe系列中推出的一款Adobe Dreamweaver&#xff0c;简称“DW”&#xff0c;中文名称 “梦想编织者”&#xff0c;是集网页制作和管理网站于一身的所见即所得网页代码编辑器。 利用对 HTML、CSS、JavaScript等内容的支持&#xff0c;设计人员…

QGIS003:【05高级数字化工具栏】-要素移动、修改、合并操作

摘要&#xff1a;QGIS地图导航工具栏包括激活高级数字化工具、移动要素、旋转要素、缩放要素、简化要素、添加环、添加部件、填充环、删除环、删除部件、重塑要素、偏移曲线、反转线、裁剪/扩展要素、分割要素、分割部件、合并所选要素、合并所选要素的属性、旋转点符号等选项&…

配电房智能监控系统

配电房智能监控系统是一种集成了互联网、物联网、大数据、人工智能等技术的系统&#xff0c;专门用于对配电房进行全方位、实时的监控和管理。主要是在高压柜、变压器及低压柜智能化的基础上&#xff0c;通过分布在配电室内的各类传感器、采集与通信设备&#xff0c;将各种设备…

【产品应用】一体化伺服电机在系留无人机中的应用

一体化伺服电机是一种将电机、驱动器、编码器结合在一起的伺服系统&#xff0c;具有高精度控制、快速响应和高效运行等优点。系留无人机则是一种通过绳索或链条与地面设施连接的无人机&#xff0c;能够实现长时间的稳定悬停和空中作业。 01.设备简介 电源线牵引装置&#xff1…

人工智能发展前景

随着人工智能的快速发展&#xff0c;这个行业对人才的需求也在不断增长。越来越多的有志之士开始关注人工智能&#xff0c;希望通过自学获得相关技能&#xff0c;进而在人工智能领域找到心仪的职业。本文将探讨人工智能职业发展的前景&#xff0c;并为大家提供自学人工智能的途…

紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板

这是一套紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板&#xff0c;共33页&#xff1b; PPT模板封面&#xff0c;使用了蓝天白云、城市剪影、奔跑人物剪影背景图片。中间填写工会工作总结汇报PPT标题。界面色彩丰富充满活力。 PowerPoint模板内容页&#xff0c;由31张…

FDM(傅里叶分解)

代码的使用教程 傅里叶分解&#xff08;FDM&#xff09; 代码原理 FDM (Frequency Division Multiplexing)是一种调制技术&#xff0c;将信号分成多个不同的频带进行传输&#xff0c;从而实现多路复用的通信方式。FDM分解原理是将不同频率的信号分解成不同的频带&#xff08;子…

【Linux】基本指令

Linux现在已经是绕不开的操作系统&#xff0c;其开源导致的稳定性&#xff0c;安全性等方面遥遥领先。今天我们开始学习Linux操作系统的基本指令 ls 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于…

极光笔记 | EngageLab Push的多数据中心接入指南

01背景 作为一个面向全球的消息推送服务平台&#xff0c;我们一直致力于给全球用户提供安全、可靠、高效的消息推送服务&#xff0c;因此我们意识到在不同洲建立数据中心的重要性。这样做将有助于提高我们的服务可用性、降低延迟并保护用户数据的安全性。 第一&#xff0c;通过…

Kubernetes1.28.X 集群安装

1、环境准备 准备2台虚拟机&#xff0c;安装集群一律使用内网ip通信&#xff0c;相关配置文件一律配置内网ip。 ip别名用途192.168.0.193kubernetes-master.openlab.cn主节点&#xff0c;harbor仓库192.168.0.194kubernetes-work.openlab.cnwork节点 hostnamectl set-hostna…

git diff相关命令

git diff相关命令 git diff git diff此命令比较的是工作目录中当前文件和暂存区中的文件差异&#xff0c;也就是修改之后还没有暂存起来的变化内容。因为后续要将工作目录中的文件添加到暂存区。 示例&#xff1a; 当前工作目录下有一个2.txt的文件&#xff0c;文件的内容是…

Vue 路由缓存 防止路由切换数据丢失 路由的生命周期

在切换路由的时候&#xff0c;如果写好了一丢数据在去切换路由在回到写好的数据的路由去将会丢失&#xff0c;这时可以使用路由缓存技术进行保存&#xff0c;这样两个界面来回换数据也不会丢失 在 < router-view >展示的内容都不会被销毁&#xff0c;路由来回切换数据也…

《轻购优品》新零售玩法:消费积分认购+众筹新玩法

《轻购优品》新零售玩法&#xff1a;消费积分认购众筹新玩法 引言&#xff1a;2023年开年已来&#xff0c;政府的工作报告提出“把恢复和扩大消费摆在优先位置”&#xff0c;并且把2023年定位为“消费提振年”&#xff0c;以“全年乐享全年盛惠”为主题多地政府共同发力&#x…

LLM大模型4位量化实战【GPTQ】

权重量化方面的最新进展使我们能够在消费类硬件上运行大量大型语言模型&#xff0c;例如 RTX 3090 GPU 上的 LLaMA-30B 模型。 这要归功于性能下降最小的新型 4 位量化技术&#xff0c;例如 GPTQ、GGML 和 NF4。 在上一篇文章中&#xff0c;我们介绍了简单的 8 位量化技术和出…

2020年06月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 如下图所示脚本运行的结果是()? A:画一条直线 B:画一个三角形 C:画一个圆形 D:画一条虚线 答案:D 第2题 运行如下图所示脚本,下面选项中说法错误的是? A:“笔的颜色”…

计算机网络秋招面试题

自己在秋招过程中遇到的计算机网络的面试题 OSI七层网络模型 DNS&#xff1a;应用层协议 根据域名查IP地址 DNS查询⽅式有哪些&#xff1f; 递归解析 局部DNS服务器⾃⼰负责向其他DNS服务器进⾏查询&#xff0c;⼀般是先向该域名的根域服务器查询&#xff0c;再由根域名服…

C++之map容器

C之map容器 map构造和赋值 #include<iostream> #include<string> using namespace std; #include<map>void printMap(map<int,int>&m) {for (map<int,int>::iterator it m.begin();it ! m.end();it){//cout <<"key is: "&l…

macbook ntfs能读不能复制 c盘ntfs拒绝访问怎么解决

如果你是一位Mac用户&#xff0c;你可能会遇到这样的问题&#xff1a;你的Mac能够读取NTFS格式的移动硬盘或U盘&#xff0c;但是不能往里面复制或者修改文件。或者&#xff0c;你的Windows电脑出现了C盘NTFS拒绝访问的错误&#xff0c;导致你无法正常使用系统。这些问题都是由于…

Spring 设计模式-简洁版

Java 中包括以下设计模式&#xff1a; 其中Spring 用到的设计模式 1.简单工厂-BeanFactory 2.工厂方法FactoryBean 3.单例模式Bean实例 4.适配器模式SpringMVC中的HandlerAdatper 5.装饰器模式BeanWrapper 6.代理模式_AOP底层 7.观察者模式-spring的事件监听 8.策略横式exclud…

Unity在Windows选项下没有Auto Streaming

Unity在Windows选项下没有Auto Streaming Unity Auto Streaming插件按网上说的不太好使最终解决方案 Unity Auto Streaming插件 我用的版本是个人版免费版&#xff0c;版本号是&#xff1a;2021.2.5f1c1&#xff0c;我的里边Windows下看不到Auto Streaming选项,就像下边这张图…