还不了解 Pinia 状态管理库⁉️

news2024/11/15 23:23:14

还不了解 Pinia 状态管理库⁉️🍍

什么是Pinia❓状态管理工具⁉️: 学习过Vue2的小伙伴,一定都知道Vuex,什么不知道,请看VCR👉 ;

Vuex 是一个专为 Vue.js 应用程序设计的状态管理库,它提供了一种集中式管理 应用中的状态;

  • 集中式存储: 它将应用的所有组件状态(数据),集中到一个单一的存储对象中,使得统一管理;

  • 状态管理模式: 它让组件的状态(数据),管理变得集中、有序,便于在整个应用中,共享和维护数据;

而,在Vue3 为了:遵循组合式API的理念: Pinia官网: 腾空出世☁️,当然其实它也支持Vue2 使迁移新项目选择更灵活;

有人又说了,经典白学,其实完全不用但心❤️,Pinia 支持:Vue2Vue3 内部语法,也可以是和Vuex 几乎一模一样;

  • 组合式 API: 它与Vue的组合式API无缝对接,使得状态管理更加直观和高效;

  • 无需Mutation: 不同于Vuex要求通过mutations改变状态,Pinia允许直接在actions中操作state,并支持异步;

  • 强大的插件系统: 允许通过插件扩展功能,增强Pinia的灵活性和功能性,内置多种配置:数据持久化、state管理;

  • TypeScript 支持:提供了更好的TypeScript支持,包括自动补全和类型推导,便于开发和维护;

在这里插入图片描述

vue-pinia Demo搭建:

Vue3—手动添加Pinia: Vue3、Vite支持自动配置,不过学习阶段还是,尝试一下手动安装:

在这里插入图片描述

🆗,veu create @latest 成功创建:vue-pinia 项目;删除无用代码配置、定义Demo模板:

  • 需求:App主页面、内引用子组件: 共同获取操作 pinia 数据,按钮调用修改pinia 数据;

在这里插入图片描述

Pinia 安装\使用:

Pinia 安装: 官方文档其实都介绍的很详细了,首先下载依赖、main.js配置,导入Pinia全局注入;

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

如果你的应用使用的 Vue 版本低于 2.7,你还需要安装组合式 API 包:@vue/composition-api

创建一个 pinia 实例,根 store,并将其传递给应用: main.JS

// import './assets/main.css'
import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
const app = createApp(App)          //创建Vue实例
const pinia = createPinia();        //创建Pinia实例对象

app.use(pinia)                      //Vue实例挂载 pinia
app.mount('#app')
//app支持链式操: app.use(pinia).mount('#app');

在这里插入图片描述

Pinia 核心概念\使用:

和Vuex 一样要使用Pinia,首先要定义: store 库,

每个 store 可以看作是一个独立的数据管理模块,负责特定部分的数据处理和状态维护;Pinia支持两种方式:

  • 首先: Store 是用 defineStore(?,?); 定义的,有两个必须参数;
  • defineStore(仓库的唯一标识, ?\?),第一个参数要求是一个独一无二的名字;
  • 第二个参数可接受两类值:Setup函数或 Option对象,分别对应:组合式API、选项式写法;
//引入 pinia 依赖
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
//方式一: 以 Option对象,形式定义Pinia store库,貌似现在用的比较多,因为结构相对清晰,语法与Vux几乎类似;
//我们也可以传入一个带有 state、actions 与 getters 属性的 Option 对象
export const store变量 = defineStore('唯一id', {
  state: () => ({ 
      //定义管理的 属性:值,
  }),
  getters: { /* 定义操作state的计算函数 */ },
  actions: { /* 定义对外修改state的操作函数,支持异步 */ },
})

//方式二: 以 Setup 函数,形式定义Pinia store库
export const store变量 = defineStore('唯一id', () => {
  //我们可以定义了一些响应式属性和方法: 属性对应state、函数则对应actions
  const getters = computed(()=>{ /* 定义操作state的计算函数 */ })
  return { /* 保留外界需要使用的属性\函数 */ }
})

定义 Store:

为了方便管理在Demo中创建: store/counter.js 定义Store 状态管理仓库

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

// 定义store
// defineStore(仓库的唯一标识, () => { ... })
// 仓库唯一标识,也被称作id:是必须传入的,Pinia将用它来获取store
// defineStore() 的第二个参数可接受两类值:Setup 函数或 Option对象,分别对应Vue3\Vue2写法;

//以 Option对象,形式定义Pinia store库,貌似现在用的比较多,因为结构相对清晰,语法与Vux几乎类似;
export const useCounterStore = defineStore('vue2ID', {
  //参数,以对象形式进行传递,内部几乎就是Vuex写法,没有了 mutations 全由actions 定义函数,支持异步)
  state: () => ({ count: 0 }),
  actions: { addCount() { this.count++ }, },      
  getters: { doubleCount: (state) => state.count * 2, }, 
})

//以 Setup 函数,形式定义Pinia store库
// export const useCounterStore = defineStore('vue3ID', () => {
//   // 声明数据 count
//   const count = ref(100)
//   // 声明操作数据的方法 addCount
//   const addCount = () => count.value++
//   // 声明数据派生计算属性 double 获取双倍count
//   const doubleCount = computed(() => count.value * 2) //最后,将需要保留的函数\属性抛出;
//   return {
//     count,
//     addCount,
//     doubleCount,
//   }
// })

模板引入操作Pinia:

App.vue: 主页面,引入Store 状态管理仓库

<script setup>
  import Son1Com from '@/components/Son1Com.vue'    //导入组件依赖;
  import { useCounterStore } from '@/store/counter'
  //导入对应的store依赖,并暴漏获取对应的state对象,模板则直接访问;
  const counterStore = useCounterStore()
</script>
<template>
  <div>
    <h3>App.vue根组件,获取Pinia数据:{{ counterStore.count }}</h3>
    <Son1Com></Son1Com>
  </div>
</template>
<style scoped></style>

Son1Com.vue: 子组件引入:可以通过:Store对象.属性\函数\getterss属性 直接获取对应值;

<script setup>
  import { useCounterStore } from '@/store/counter'
  const counterStore = useCounterStore();
</script>
<template>
  <div class="son" >
    <button @click="counterStore.addCount" >Pinia数据++</button> <br/>
    我是Son1.vue 获取Pinia数据:{{ counterStore.count }} <br/>
    Pinia getters管理双倍数据 {{ counterStore.doubleCount }}
  </div>
</template>
<style scoped>.son { border: 1px solid #000; padding: 30px; }</style>

在这里插入图片描述

Pinia action 异步写法:

在 Pinia 中,函数处理主要通过 actions 来实现:

actions 支持同步和异步操作,这对于执行API调用、延迟操作或任何需要等待的操作非常有用;

需求:使用Pinia 管理一个接口异步数据,给所有模块使用管理,接口: GET: http://geek.itheima.net/v1_0/channels

在这里插入图片描述

storeToRefs 函数:

Pinia进行状态管理时: storeToRefs是一个非常重要的函数,它用于将Pinia store中的状态属性转换为响应式引用;

为什么需要storeToRefs: 直接解构store中的状态可能会导致失去响应性,因为解构出来的变量不再是Vue的响应式数据;

<script setup>
  import Son1Com from '@/components/Son1Com.vue'    //导入组件依赖;
  import { useCounterStore } from '@/store/counter' //导入对应的store依赖,并暴漏获取对应的state对象,模板则直接访问;
  const counterStore = useCounterStore()

  //实际开发中我们每次都要:store对象.属性\函数太麻烦,能不能解构赋值:直接获取内部属性呢?
  //counterStore 不能直接解构,直接解构 store对象 获取属性\函数会丢失响应式;
  //const { count,getList,channelList } = counterStore;
  
  //需要通过storeToRefs(store对象) 
  //将 store对象 状态转换为响应式引用,然后通过解构赋值给局部变量;
  const { getList } = counterStore;
  import { storeToRefs } from 'pinia';
  const { count,channelList } = storeToRefs(counterStore);
</script>
<template>
  <div>
    <h3>App.vue根组件,获取Pinia数据:{{ count }}</h3>
    <Son1Com></Son1Com>
    <button @click="getList">获取频道数据</button>
    <ul>
      <li v-for="item in channelList" :key="item.id">{{ item.name }}</li>
    </ul>
  </div>
</template>
<style scoped></style>

在这里插入图片描述

Pinia 持久化🍍💾

Pinia 提供了数据持久化的能力: 这对于需要在页面刷新后保持状态的应用来说至关重要,为什么需要数据持久化:

  • 保持用户状态:例如,用户登录信息、购物车内容等,刷新页面后不应丢失。
  • 提升用户体验:用户不需要每次刷新页面都重新设置或登录

使用 pinia-plugin-persistedstate 插件: 支持通过包管理器安装 pinia-plugin-persistedstate

或使用:yarn add pinia-plugin-persistedstatenpm i pinia-plugin-persistedstate

配置 Pinia: 需要在你的 Pinia 配置文件中引入并使用该插件,即:main.JS

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

// 导入持久化的插件
import persist from 'pinia-plugin-persistedstate'
const app = createApp(App)          //创建Vue实例
const pinia = createPinia();        //创建Pinia实例对象

app.use(pinia.use(persist))         //Vue实例挂载 pinia
app.mount('#app')
//app支持链式操: app.use(pinia).mount('#app');

启用持久化:在每个需要持久化的 store 中通过 persist: true 来开启,默认配置使用localStorage存储整个 state

//defineStore 函数第三个配置参数;
//默认配置使用localStorage存储整个state, vue3ID作为Key
export const useCounterStore = defineStore('vue3ID', () => { /* ...省略... */ },{ persist: true });

在这里插入图片描述

持久化配置扩展

🆗,上述完成了Pinia数据持久化: 持久化至Local storage key是store库唯一ID,

插件支持很多配置,比如: 自定义Key、设置持久化特有属性,

export const useCounterStore = defineStore('vue3ID', () => { /* ...省略... */ },{ 
    persist: {
    key: 'divID',       // 修改本地存储的唯一标识
    paths: ['count']    // 存储的是哪些数据
  }
});

在这里插入图片描述

代码管理:

本代码已经使用Git进行管理: 公众号回复:Vue3

在这里插入图片描述

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

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

相关文章

什么是GD32 MCU读保护?

如今电子产品市场风云变幻&#xff0c;暗流汹涌&#xff0c;有没有小伙伴遇到自己费了大力气写出来的代码&#xff0c;很容易就被别人“借鉴”了&#xff0c;真的是让闻者伤心&#xff0c;听着落泪啊。 那有没有什么方法可以防止别人将你的代码从MCU读出来呢&#xff1f;答案当…

软媒市场-解释软文发布后如何在搜索引擎持续获得曝光

软文发布后,在搜索引擎持续获得曝光是一个涉及多方面策略的过程。以下是一些关键步骤和技巧,旨在帮助软文在搜索引擎中保持较高的可见度和曝光率: 1. 关键词优化 关键词选择:首先,通过专业的关键词研究工具(如Google AdWords Keyword Planner、百度指数等)分析用户搜索习惯和热…

【C语言初阶】掌握C语言调试技巧,迈向高效编程的阶梯

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言指针 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C语言调试技巧 &#x1f4d2;1. …

这个是git使用的合集

如果遇到了关于git和github的bug就会写这里 2024/8/16 github一直没有打卡和上传代码是因为感觉除了做项目的情况&#xff0c;普通的学习和普通的笔记没必要记在github里&#xff1b;如果是笔记类的东西为什么不记在csdn上呢&#xff1f;如果是算法题算法网站上回有记录啊&am…

第43课 Scratch入门篇:雪花随风飘

雪花随风飘 故事背景: 雪花轻轻地从灰蒙蒙的天空中飘落下来,它们像是天空中飘洒下来的羽毛,又像是冬日的精灵在翩翩起舞。每一片雪花都独一无二,它们在空中旋转、飘荡,最终缓缓降落在屋顶、树枝、街道和行人的肩头。 程序原理: 众多的雪花肯定是克隆功能,降落过程是通过…

three.js 光源、光源辅助对象和阴影简介

Three.js 光源对物体的影响 实际生活中物体表面的明暗效果是会受到光照的影响&#xff0c;比如晚上不开灯&#xff0c;你就看不到物体&#xff0c;灯光比较暗&#xff0c;物体也比较暗。在threejs中&#xff0c;咱们用网格模型Mesh模拟生活中物体&#xff0c;所以threejs中模拟…

Linux进程间通信学习记录(IPC 机制以及共享内存)

0.System V IPC机制&#xff1a; ①.IPC对象包含&#xff1a;共享内存、消息队列和信号灯集。 ②.每个IPC对象有唯一的ID。 ③.IPC对象创建后一直存在&#xff0c;直到被显示地删除。 ④.每一个IPC对象有一个关联的KEY。&#xff08;其他进程通过KEY访问对应的IPC对象&#xff…

索引的设计原则

4.索引的设计原则 4.1.数据准备 a.创建数据库、创建表 CREATE DATABASE atguigudb1; USE atguigudb1;# 创建学生表和课程表 CREATE TABLE student_info (id INT(11) AUTO_INCREMENT,student_id INT NOT NULL ,name VARCHAR(20) DEFAULT NULL,course_id INT NOT NULL ,class_…

x64汇编语言与逆向工程实战指南(四)

目录 1. 数组的存储与遍历1.1 编写数组数据写入内存1.2 汇编循环遍历数组元素 3. Lea指令4. mul指令与imul指令4.1 mul 指令4.2 imul 指令总结 5. div指令5.1 div 指令的基本原理5.2 8 位除法5.3 16 位除法5.3 32 位除法特点和要求 1. 数组的存储与遍历 1.1 编写数组数据写入内…

基于Web的可回收物品收购系统-计算机毕业设计源码49082

摘 要 随着电子商务和在线交易的快速发展&#xff0c;二手商品市场逐渐成为一个不可忽视的经济领域。其中&#xff0c;可回收系统的收购成为了一个关键环节&#xff0c;它不仅有助于资源的有效再利用&#xff0c;还对环境保护和可持续发展起到了积极的推动作用。Servlet可回收…

单片机中的存储器讲解

单片机中的存储器 目录 单片机中的存储器常用的存储器易失性存储器RAMSRAMDRAM 非易失性存储器ROMMask ROMPROMEPROME2PROMFlashNOR FlashNADN Flash 单片机里全局变量、局部变量、堆、栈的存储区域区域介绍栈区堆区静态区代码区常量区 内存分区分类四个区域 常用的存储器 易失…

【Linux】:实现一个简易的shell

目录 1.命令行提示符 2.命令行参数 2.1 获取命令行参数 2.2 解析命令行参数 3.判断指令类型 3.1 模拟cd命令 3.2 模拟export和echo bash的环境变量来源 4.外部指令的执行 1.命令行提示符 在我们输入指令前&#xff0c;终端界面一般有一个命令行提示符&#xff0c; …

性能优化理论篇 | swap area是个什么东西

我们知道每台计算机的内存&#xff08;RAM&#xff09;都是有限的&#xff0c;而我们的应用程序需要加载到内存才能被运行&#xff0c;如果一台机器运行多个应用程序时&#xff0c;内存可能会耗尽。Linux 系统中的“交换空间&#xff08;也称为交换分区&#xff09;”可以帮助缓…

VM相关配置及docker

NAT——VMnet8网卡 桥接——WLAN/网线 仅主机——VMnet1网卡 docker与虚拟机的区别 启动docker服务 systemctl start docker 重启 systemctl start docker关闭docker服务 systemctl stop docker.servicedocker的两大概念 镜像&#xff1a;images&#xff0c;应用程序的静态文…

nssctf-[SWPUCTF 2022 新生赛]1z_unserialize-简单的序列化题目

1. 打开题目是一段很简单的php代码 对代码进行分析&#xff0c;题目中有一个__destruct析构函数&#xff0c;这个函数是在对象被销毁的时候触发&#xff0c;那那么在这里new一下就相当于销毁一个对象&#xff0c;$a$this->lt;和$a($this->lly);相当于是$this->lt(thi…

CSS3-新特性

1.新增选择器 1.属性选择器 2.结构伪类选择器 3.伪元素选择器&#xff08;重点&#xff09; 4.CSS3 盒子模型 2.CSS3滤镜filter 3.CSS3 calc 函数 4.CSS3 过渡&#xff08;重点&#xff09;

8月18日微语报,星期日,农历七月十五

8月18日微语报&#xff0c;星期日&#xff0c;农历七月十五&#xff0c;周末愉快&#xff01; 一份微语报&#xff0c;众览天下事&#xff01; 1、南昌从业者谈蔬菜涨价&#xff1a;天热易变质增加损耗&#xff0c;农户收入未明显提升。 2、委员建议“行政教学分离”&#x…

后端开发刷题 | 寻找峰值【二分法】

描述 给定一个长度为n的数组nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于 2.假设 nums[-1] nums[n] −∞ 3.对于…

【精选】基于Java摄影约拍系统设计与实现(全网独一无二,最新定制)

目录 目录&#xff1a; 系统简介&#xff1a; 核心技术介绍 mysql技术介绍 IDEA编译器介绍 Springboot框架简介 springmvc框架简介 Mybatis技术简介 Node.js技术简介 Vue.js技术简介 系统数据库详细设计 系统功能设计 系统测试运行 模块测试 系统整体测试 测试过程 测试…

启明欣欣STM32开发板运行ThreadX

ThreadX是非常优秀的RTOS&#xff0c;微软收购了ThreadX后就开源了&#xff0c;后来又交给Eclipse基金会&#xff0c; 本文讲述如何在STM32上运行ThreadX&#xff0c;使用CubeMX来实现。本人环境如下&#xff0c; CM4芯片&#xff1a;STM32F407ZGT6&#xff0c;内存192KB&am…