Pinia基础使用 (vite vue3)

news/2024/5/19 15:50:27/文章来源:https://blog.csdn.net/change_fate/article/details/131472668

pinia

Pinia 概念

是 Vue 的存储库,它允许您跨组件/页面共享状态。 Vue官方推荐状态库

Pinia 的优点

pinia 符合直觉,易于学习。
pinia 是轻量级状态管理工具,大小只有1KB.
pinia 模块化设计,方便拆分。
pinia 没有 mutations,直接在 actions 中操作 state,通过 this.xxx 访问响应的状态,尽管可 以直接操作 state,但是还是推荐在 actions 中操作,保证状态不被意外的改变。
store 的 action 被调度为常规的函数调用,而不是使用 dispatch 方法或者是 MapAction 辅助函数,这是在 Vuex 中很常见的。
支持多个 store。
支持 Vue devtools、SSR、webpack 代码拆分。

什么时候使用Store

存储应该包含可以在整个应用程序中访问的数据。这包括在许多地方使用的数据
避免可以托管在组件的数据使用Store

创建项目(vite + vue3 + pinia):

pnpm create vite
cd project
pnpm i
pnpm i pinia
pnpm run dev

如果您的应用使用 Vue 2,您还需要安装组合 API:@vue/composition-api
创建一个pinia(根存储):

如果是 vue 3.2 + pinia 2.1.4版本,可能由以下报错:
import { hasInjectionContext,inject,toRaw,watch,…
在这里插入图片描述
是由于版本不兼容导致的

在package.json升级vue到3.3.4版本即可

基本使用

(1)创建一个 pinia(根存储)并将其传递给应用程序
修改main.js

import { createPinia } from 'pinia'
createApp(App).use(pinia).mount('#app')

(2) src下新建store文件夹,然后在store下创建counter.js文件

defineStore参数:
第一个参数是唯一的 id, 标志着一个命名空间
第二个参数是一个对象, 有三个模块: state, getters,actions

const useCounter = defineStore("counter", {state () {return {count: 66,}},getters: {},actions: {}
})
// 返回函数统一使用useXXX命名
export default useCounter;

(3) 在组件中使用:
修改,定义组件

<template><div>展示pinia的counter的counter值: {{ counterStore.count }}</div><div>解构出来的pinia的counter的count值: {{ count1 }}</div><div>storeToRefs: {{ count2 }}</div><button @click="addCount">count+1</button>
</template><script setup>
import useCounter from '../stores/counter'
import {storeToRefs} from 'pinia'
const counterStore = useCounter()
const {count1} = counterStore // 解构得到的失去响应式
const {count2} = storeToRefs(counterStore) // 不会失去响应式function addCount() {counterStore.count++
}

修改App.vue,使用组件

<template><Counter1/>
</template><script setup>
import Counter1 from './components/Counter1.vue'
</script>

(4) Store获取后不能解构, 否则失去响应式

const {count} = counterStore

解决方案:
提供了函数storeToRefs解决,作用就是把结构的数据使用ref做代理

import {storeToRefs} from 'pinia'
const counterStore = useCounter()
const {count} = storeToRefs(counterStore)

(5)修改state的数据

重新新建一个user模块store/user.js

import {defineStore} from 'pinia'const useUser = defineStore("user", {state:() => ({name: "cq",age: 17})
})export default useUser

新建组件 ChangeVaule.vue:
有几种修改state的方法

<template>
<div><h2>名字是:{{ name }}</h2><h2>年龄是: {{ age }}</h2><button @click="updateStore">修改Store数据</button><button @click="resetStore">重置Store数据</button>
</div>
</template><script setup>
import useUser from '../stores/user'
import { storeToRefs } from 'pinia';const userStore = useUser()
const {name, age} = storeToRefs(userStore)function updateStore() {// 1. 一个个修改状态// userStore.name = "川崎"// userStore.age = 19// 2. $patch一次改变多个状态userStore.$patch({name: "川川",age: 18})// 3. $state(替换, 基本不用)
}function resetStore() {// 4. $reset()是重置state数据的userStore.$reset()
}
</script>

getters的使用:

getters类似于vue的计算属性,可以对已有的数据进行修饰。不管调用多少次,getters中的函数只会执行一次,而且会缓存

(1) 最基本使用
在store/counter.js添加getters:

const useCounter = defineStore("counter", {state:() => ({count:66,})getters: {doubleCount(state) {doubleCount(state) {return state.count * 2}}}
})export default useCounter

在组件中使用:

<div><h1>getters使用: </h1><h2>doubleCount:{{counterStore.doubleCount}}</h2>
</div>

(2)一个getter引入另一个getter
counter模块:

getters: {doubleCount(state) {return state.count * 2},doubleCountAddTwo() {console.log(this)return this.doubleCount + 2}
}

组件中使用:

<div><h2>doubleCount: {{counterStore.doubleCount}}</h2><h2>doubleCountAddTwo: {{counterStore.doubleCountAddTwo}}</h2>
</div>

运行且看看getters的this打印:

在这里插入图片描述
this中有两个getters

(3) getters中使用别的store数据
在counter模块中拿user模块store数据

count模块的getters添加:

import useUser from "./user"
...showMessage(state){console.log(state);console.log(this)//获取user信息,拿到useUser模块const userStore = useUser()//拼接信息return `name:${userStore.name}--count:${state.count}`}

在组件中使用:

<div><h2>showMessage:{{counterStore.showMessage}}</h2>
</div>

结果:
在这里插入图片描述
实现了counter模块中拿到了user模块的数据

actions的使用:

actions可以处理同步,也可以处理异步,类似于methods

(1) 同步使用:
counter模块使用:
在actions定义两个函数一个加1函数,一个加Num函数

  actions: {increment(state) {console.log(state)console.log(this)this.count++},incrementNum(num) {this.count += num},

组件中使用:

    <h2>展示pinia的counter的counter值: {{ counterStore.count }}</h2><h2>doubleCountAddTwo:{{ counterStore.doubleCountAddTwo }}</h2><button @click="incrementOne">count+1</button><button @click="incrementNum">count+20</button>

在这里插入图片描述

点击count+1 ⇒ 加一
点击count+20 ⇒ 加二十

(2) 异步操作使用
在actions处理异步的时候,异步是与async和await连用

在actions中添加:

    // 异步操作async getData() {const res =await new Promise((resolve, reject) => {setTimeout(() => {resolve([11,22,33,44])}, 2000)})this.list = resreturn "ok"}

新建组件AsyncChangeData.vue:

<template><!-- 遍历store的数据 --><div v-for="item in counterStore.list">{{ item }}</div>
</template><script setup>
import useCounter from '../stores/counter'
const counterStore = useCounter()counterStore.getData().then(res =>{
console.log("成功",res);
})
</script>

可以看到异步数据延迟显示

数据持久化:

(1) 添加库:

npm i pinia-plugin-persist

(2) 在store中添加:

  persist: {enabled: true, // 开启缓存  默认会存储在本地localstoragestorage: sessionStorage, // 缓存使用方式paths:[] // 需要缓存键 },

在这里插入图片描述
可以看到session中存储的信息

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仅个人记录 CMX复现

文章解析(214条消息) CMX: Cross-Modal Fusion for RGB-X SemanticSegmentation with Transformers_cmx: cross-modal fusion for rgb-x semantic segment_翰墨大人的博客-CSDN博客 代码 GitHub - huaaaliu/RGBX_Semantic_Segmentation 一、 环境配置 conda create -n rgbx…

爬虫入门07——requests中携带cookie信息

爬虫入门07——requests中携带cookie信息 对于需要登陆的网站如果不携带cookie是无法获取我们所需内容的就以查看我在CSDN中的订单为例&#xff0c;在登陆后可以查看到订单信息 而当我们使用Python代码发出请求时&#xff0c;是不携带cookie&#xff0c;因此无法拿到订单相关信…

使用 VMware 安装 docker

1、首先创建一个新的虚拟机 &#xff08;1&#xff09;配置自定义就可以 &#xff08;2&#xff09;选择稍后安装 &#xff08;3&#xff09;选择Linux &#xff08;4&#xff09;安装位置自己选择 &#xff08;5&#xff09;处理器数量根据自己电脑来&#xff08;一般2个就够…

【Java EE】-JVM

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 雨下整夜 我的爱溢出就像雨水 ——《七里香》 主要内容&#xff1a;JDK&#xff0c;JRE&#xff0c;JVM三者之间的联系。JVM内存区域划分&#xff1a;本地方法栈…

【数据分析 - 基础入门之NumPy③】日常难题解决

知识目录 前言一、启动Jupyter Notebook报错没有这样的目录结语# 往期文章&相关导读 前言 本篇文章用于整理在学习 NumPy 过程中遇到的错误&#xff0c;以此做个记录&#xff0c;希望能帮助到大家&#xff0c;让大家少走弯路。 一、启动Jupyter Notebook报错没有这样的目…

Delphi XE编写OCX控件

1、new->other 2、Active libary 3、再次New->Other,才出现ActiveX组件内容 设置类名及参数

开源预训练框架 MMPRETRAIN官方文档(概览、环境安装与验证、基础用户指南)

MMPretrain是全新升级的开源预训练框架。它已着手提供多个强大的预训练骨干网并支持不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和MMSelfSup&#xff0c;并开发了许多令人兴奋的新功能。目前&#xff0c;预训练阶段对于视觉识别至关重要。凭借丰富而强…

Docker 常用指令集合,更换镜像(Ubantu)

1.更换镜像 先进入root用户 cat /etc/docker/daemon.json 查看有没有镜像创建目录,创建并编辑damon,json文件 mkdir -p /etc/docker vim /etc/docker/daemon.json# 填写内容 {"registry-mirrors": ["https://h5rurp1p.mirror.aliyuncs.com"] } 重新启…

如何从零开始学习自动化测试?终于找到靠谱的教程了

目录 前言 测试基础 Python基础 selenium appium requests unittest 项目实战&#xff1a; 总结&#xff1a; 前言 最近有几个小伙伴在后台给安静私信说&#xff0c;如何学习自动化&#xff0c;不知道如何入手&#xff1f;在网上看的资料都是乱七八糟的&#xff0c;每…

VSCode编译github上面的C++项目

1、下载cmake 在这里下载对应的版本 https://cmake.org/download/ 测试下载的是这个 下载完成后安装&#xff0c;安装都比较简单 2、安装CMake工具扩展 3、安装C扩展 4、下载github项目 例如&#xff1a;下载这个项目 https://gitcode.net/mirrors/zrax/pycdc?utm_source…

使用凌鲨进行数据标注

在AI研发团队中&#xff0c;数据的数量和质量通常比算法本身更重要。为了获得大量高质量的数据&#xff0c;标注软件是必不可少的。目前许多开源标注软件在权限、任务管理和审核方面都存在较大问题。 在凌鲨(linksaas)0.3.8版本中增加了数据标注功能&#xff0c;支持 音频分类…

123.【SpringBoot 源码刨析B】

SpringBoot-核心功能 (三)、SpringBoot核心功能1.配置文件1.1、properties1.2、yaml(1).yaml 简介(2).yaml 基本语法(3).数据类型(4).示列 1.3、配置提示 2.WEB 开发1.SpringMVC自动配置概览2.简单功能分析(1).静态资源访问&#xff08;1.1&#xff09;.静态资源目录&#xff0…

用真人模型制作3D虚拟人物,岂不是更真实?

3D虚拟人物是指利用计算机技术和图形学技术创建的一种能够模拟真实人体形态、行为和语言的虚拟实体。与传统的平面图像或视频不同&#xff0c;3D虚拟人物具有立体感和真实感&#xff0c;能够在虚拟环境中实现人机交互和情感交流&#xff0c;给用户带来全新的沉浸式体验。 随着…

国内环境安装Atlas OS步骤与网络问题解决

国内环境安装Atlas OS步骤与网络问题解决 Atlas 是一个开源、透明的项目&#xff0c;它修改了 Windows&#xff0c;并消除了影响游戏性能的所有负面缺点。我们是减少系统延迟、网络延迟、输入延迟和保持系统私密性的绝佳选择&#xff0c;同时仍然关注性能。我不久前在安装时遇…

【在线文件管理】响应式文件管理AngularJS

目录 1.功能展示截图 2.实现代码 2.1HTML页面代码 2.2后台代码 2.2.1项目结构 2.2.2项目代码 其他问题 1.功能展示截图 项目中需要用到文件管理来自由控制文件的上传、下载、删除等&#xff0c;就想到做一个简单的在线文件管理功能。 支持在线编辑&#xff1a; 2.实现代…

14 MFC多进程

文章目录 创建进程win32子进程内容创建进程传递参数关闭进程通过配置文件读取全部代码 打开进程便利进程 创建进程 分别创建MFC应用程序和Win32应用程序 MFC应用程序界面设置 win32子进程内容 #include <Windows.h> int WINAPI wWinMain(HINSTANCE hInstance, HINSTAN…

Java中的字符串类

提示&#xff1a;字符串类是编程中最常用的一种数据类型&#xff0c;比较重要❗ 文章目录 前言一、字符串类创建对象方式静态创建动态创建 二、String字符串内容不可改变三、字符串常用方法length方法charAt方法substring方法indexOf与lastIndexOfindexOf方法lastIndexOf方法 替…

Rust 动态数组Vec基本概念及其用法

目录 一、基本概念 Vec是什么&#xff1f; Vec的特点 (1)动态大小&#xff1a; (2)可变性&#xff1a; (3)泛型&#xff1a; 二、基础用法 1. 创建 (1) Vec::new()方法 (2) Vec::from()方法 (3) vec! 宏 2. 基础用法 三、Vec的简单实现及其宏模拟 四、leetcode 实…

如何在Linux下搭建接口自动化测试平台

我们今天来学习一下在Linux下如何搭建基于HttpRunner开发的接口自动化测试平台吧&#xff01; 需要在Linux上提前准备的环境&#xff08;下面是本人搭建时的环境&#xff09;&#xff1a; 1&#xff0c;Python 3.6.8 2&#xff0c;MySQL 5.7 一&#xff1a;下载HttpRunner…

【C语言基础】函数(2)

在函数&#xff08;1&#xff09;中我们已经讲过了函数的定义&#xff0c;形参与实参&#xff0c;函数的调用&#xff0c;局部变量与栈内存 接下来还有几个要强调的函数相关知识。 一、静态函数 静态函数是在函数声明前加上关键字 static 的函数。静态函数在C语言中具有以…