【Vue3】搭建Pinia环境及其基本使用

news2024/12/23 13:58:06

下载

npm i pinia

引入并注册

App.vue

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

const app = createApp(App)
// 2. 创建
const pinia = createPinia()
// 3. 注册
app.use(pinia)
app.mount('#app')

存储数据

Store是一个保存 状态、业务逻辑 的实体,每个组件都可以 读取、写入它。
Store有三个概念:state、getter、action,相当于组件中的:data、computed和methods。

首先创建count.ts文件,路径为 src/store/count

使用defineStore定义store,第一个参数为store名,第二个参数为配置对象。
配置对象中的state表示状态,其return的对象中是所有变量,getters可以理解为computed,actions中定义动作函数,函数中可以修改state的值。具体代码如下:

// count.ts

import { defineStore } from 'pinia'

// 定义并暴露一个store
// 命名规范同Hook
export const useCountStore = defineStore('count',{
	// 状态
	state(){
		// 声明变量
		return { sum: 6, name: '田本初', age: 23 }
	},
	// 计算(可以理解为computed)
	getters:{
		// 可以通过this修改,this就是当前store
		addAge():number{
			return this.age + 3
		},
		// 也可以通过参数state修改
		doubleSum: state => state.sum * 2
	},
	// 动作
	actions:{}
})

读取、使用数据

state中定义数据,getters可以对state中的数据进行计算,并返回一个新数据。
使用数据时有两种方式:「store.变量名」 和 「store.$state.变量名」
第一种更简洁,所以更加推荐第一种写法。

// 读取出定义时暴露出的store
import { useCountStore } from '@store/count'

const countStore = useCountStore()
// 使用state数据
<div>{{ countStore.sum }}</div> // 6
// 或者
<div>{{ countStore.$state.sum }}</div> // 6

// 使用getters数据
<div>{{ countStore.addAge }}</div> // 26
<div>{{ countStore.doubleSum }}</div> // 12

如何简便的使用数据

如下写法过于繁琐,如果只想通过 sum、name、age表达变量,需要将它们解构。

<div>{{ countStore.sum }}</div>
<div>{{ countStore.name }}</div>
<div>{{ countStore.age }}</div>

解构需要注意:由于countStore是响应式数据,不可直接解构使用其中的数据,这会使数据丢失响应式,所以需要使用 toRefs。

<template>
	<div>{{ sum }}</div>
	<div>{{ name }}</div>
	<div>{{ age }}</div>
	<div>{{ doubleSum }}</div>
</template>

<script>
	import { useCountStore } from '@store/count'
	import { toRefs } from 'vue'
	
	const countStore = useCountStore()
	// 将countStore中的全部数据变为响应式
	const { sum, name, age, doubleSum } = toRefs(countStore)
</script>

但是 toRefs 并不是最好的解决方式,它会把store中所有值全部变成响应式,如actions函数和一些其他属性。
如果只想修改store中的数据为响应式,需要使用 storeToRefs

<template>
	<div>{{ sum }}</div>
	<div>{{ name }}</div>
	<div>{{ age }}</div>
	<div>{{ doubleSum }}</div>
</template>

<script>
	import { useCountStore } from '@store/count'
	// 引入storeToRefs
	import { storeToRefs } from 'pinia'
	
	const countStore = useCountStore()
	const { sum, name, age, doubleSum } = storeToRefs(countStore)
</script>

修改数据的三种方式

方式一:修改单个数据

不同于Vuex,正如官方文档中说的「Pinia是一个更符合直觉的状态管理工具」,Pinia可以直接修改store中的数据。

<template>
	<div>{{ countStore.sum }}</div>
	// 或者
	<div>{{ countStore.$state.sum }}</div>
</template>

<script>
	import { useCountStore } from '@store/count'
	const countStore = useCountStore()
	
	// 比如当前函数直接修改store的state,可以生效
	const handler = () => {
		countStore.sum += 10
	}
</script>

方式二:批量修改数据

语法:store.$patch({变量名:新值})

<template>
	<div>{{ countStore.sum }}</div>
	<div>{{ countStore.name }}</div>
	<div>{{ countStore.age }}</div>
</template>

<script>
	import { useCountStore } from '@store/count'
	const countStore = useCountStore()
	
	const handler = () => {
		// $patch可以同时修改state中多个数据
		countStore.$patch({
			sum: 100,
			name: '田公路',
			age: 24
		})
	}
</script>

如果多次修改单个数据,会发现进行了多次修改。
在这里插入图片描述
如果是批量修改,只进行一次变更,所以需要修改多个数据时,推荐使用$patch进行批量修改。
在这里插入图片描述

方式三:通过actions进行修改

需要在store的actions中定义「动作函数」,使用数据的组件中调用该函数,如果进行相对复杂的操作,并非只修改数据,如:判断以及其他逻辑,更推荐使用actions。

定义actions函数

import { defineStore } from 'pinia'

export const useCountStore = defineStore('count',{
	state(){
		return { sum: 6, name: '田本初', age: 23 }
	},
	// 动作
	actions:{
		// this是当前store
		changeName(value){ this.name = value }
	}
})

调用函数,修改数据

<template>
	<div>{{ countStore.name }}</div>
</template>

<script>
	import { useCountStore } from '@store/count'
	const countStore = useCountStore()
	
	const handler = () => {
		// 直接调用actions中的处理函数,并传入参数
		countStore.changeName('田公路')
	}
</script>

store.$subscribe

可以理解为watch,当store中的数据发生了改变,会调用。
它接受一个函数作为参数,该函数有两个参数,分别为mutate和state,mutate是本次修改信息,state是所有数据。

store.$subscribe((mutate,state)=>{
	// 处理函数
})

组合式写法(推荐)

实际开发中更推荐使用组合式写法,Hooks写法。

定义存储数据

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

export const useCountStore = defineStore('count',()=>{
	// 这里的state同上述写法
	const state = reactive({sum: 6, name: '田本初', age: 23})
	// changeName相当于在actions中定义的函数
	const changeName = value => {
		state.name = value
	}
	// 一定要return
	return { state, changeName }
})

读取使用数据

import { useCountStore } from '@/store/count'
import { storeToRefs } from 'pinia'

// 读取
const countStore = useCountStore()
const { sum, name, age } = storeToRefs(countStore)

// 使用
<div>{{ sum }}</div>

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

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

相关文章

python----面向对象

这里写目录标题 面向对象思想类类的定义类名的定义类的构造函数的定义类的属性类的方法定义 继承语法关于构造函数问题 文件操作绝对路径相对路径pycharm获取绝对路径和相对路径文件读写读文件open&#xff08;&#xff09;read&#xff08;&#xff09;readline&#xff08;&a…

2021年CSP-J认证 CCF信息学奥赛中小学初级组 第一轮真题-单项选择题解析

2021年 中小学信息学奥赛CSP-J真题解析 1、以下不属于面向对象程序设计语言的是 A、c B、python C、java D、c 答案&#xff1a;D 考点分析&#xff1a;主要考查编程语言&#xff0c;ABC都是面向对象语言&#xff0c;D选项c语言是面向过程语言&#xff0c;答案D 2、以下奖…

202427读书笔记|《猫的自信:治愈系生活哲学绘本》——吸猫指南书,感受猫咪的柔软慵懒与治愈

202427读书笔记|《猫的自信&#xff1a;治愈系生活哲学绘本》——吸猫指南书&#xff0c;感受猫咪的柔软慵懒与治愈 《猫的自信&#xff1a;治愈系生活哲学绘本》作者林行瑞&#xff0c;治愈系小漫画绘本&#xff0c;10分钟可以读完的一本书&#xff0c;线条明媚&#xff0c;自…

SQL注入工具之SQLmap入门操作

了解SQLmap 基础操作 SQLmap是一款自动化的SQL注入工具&#xff0c;可以用于检测和利用SQL注入漏洞。 以下是SQLmap的入门操作步骤&#xff1a; 1.下载SQLmap&#xff1a;可以从官方网站&#xff08;https://sqlmap.org/&#xff09;下载最新版本的SQLmap。 2.打开终端&#…

CDP和Chrome

CDP和Chrome CDP和WebDriver Protocol WebDriver和 Chrome DevTools Protocol&#xff08;CDP&#xff09; 是用于自动化浏览器的两个主要协议&#xff0c;大多数的浏览器自动化工具都是基于上述其中之一来实现的。可以通过这两种形式来和浏览器交互&#xff0c;通过代码来控…

使用maven集成spring在测试的时候报出了如下的异常:version 60

使用maven集成spring在测试的时候报出了如下的异常&#xff1a; Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 60 解决&#xff1a;

MAC M1安装vmware和centos7虚拟机并配置静态ip

一、下载vmware和centos7镜像 1、VMWare Fusion 官网的下载地址是&#xff1a;下载地址 下载好之后注册需要秘钥&#xff0c;在官网注册后使用免费的个人秘钥 2、centos7 下载地址&#xff1a; https://biosyxh.cn:5001/sharing/pAlcCGNJf 二、虚拟机安装 直接将下…

比特币正在蚕食黄金

号外&#xff1a;教链内参2.19《内参&#xff1a;蹭热点、骗流量、割韭菜》 众所周知&#xff0c;自从美国SEC批准比特币现货ETF登陆美股市场之后&#xff0c;打开了美国金融市场泛滥的流动性向比特币流入的大门。只用了短短的30个交易日&#xff0c;比特币ETF就从零膨胀到了近…

基于RBAC的权限管理的理论实现和权限管理的实现

权限管理的理论 首先需要两个页面支持&#xff0c;分别是角色管理和员工管理&#xff0c;其中角色管理对应的是角色和权限的配合&#xff0c;员工管理则是将登录的员工账号和员工所处的角色进行对应&#xff0c;即通过新增角色这个概念&#xff0c;让权限和员工并不直接关联&a…

Ubuntu18.04有线连接后,无法设置ip地址以及显示网口设置

前提&#xff1a;首先测试过网线是完全没问题的 桌面端找不到设置网口 终端输入&#xff1a; ifconfig 没有找到网口设置和对应IP 然后查询网口驱动是否正常安装&#xff0c;输入&#xff1a; lspci | grep Ethernet 有输出说明网口驱动正常安装 然后查询电脑的ip地址&am…

2023年全球软件开发大会(QCon北京站2023)2月:核心内容与学习收获(附大会核心PPT下载)

本次峰会是一个汇集了最新技术趋势、最佳实践和创新思维的盛会。对于从事软件开发和相关领域的专业人士来说&#xff0c;参加这样的大会将有助于他们了解行业动态、提升技能水平、拓展职业视野&#xff0c;并与同行建立联系和合作。 本次峰会包含&#xff1a;AI基础架构、DevO…

Stable Diffusion 绘画入门教程(webui)-lora

通过前边的文章&#xff0c;相信大家已经能够自己产出好看的小姐姐或者小哥哥了&#x1f923; 不知道有没有发现每次生成的脸、身材、衣服、环境、风格等等可能都会有所差异&#xff0c;那么如果这个问题不解决&#xff0c;实用性将大大降低&#xff0c;因此lora诞生了。 文章…

人工智能_普通服务器CPU_安装清华开源人工智能AI大模型ChatGlm-6B_001---人工智能工作笔记0096

使用centos安装,注意安装之前,保证系统可以联网,然后执行yum update 先去更新一下系统,可以省掉很多麻烦 20240219_150031 这里我们使用centos系统吧,使用习惯了. ChatGlm首先需要一台个人计算机,或者服务器, 要的算力,训练最多,微调次之,推理需要算力最少 其实很多都支持C…

SpringBoot常见问题

1 引言 Spring Boot是一个基于Spring框架的快速开发脚手架&#xff0c;它简化了Spring应用的初始化和搭建过程&#xff0c;提供了众多便利的功能和特性&#xff0c;比如自动配置、嵌入式Tomcat等&#xff0c;让开发人员可以更加专注于业务逻辑的实现。   Spring Boot还提供了…

IO进程线程作业day2

使用fread和fwrite完成两个图片文件的拷贝 #include <myhead.h> #define high 541 #define wide 541 int main(int argc, const char *argv[]) {//以只读的方式打开图片文件1.bmpFILE *fp NULL;if((fp fopen("./1.bmp", "r")) NULL){perror(&qu…

数据分析 - 机器学习

1&#xff1a;线性回归 线性回归是一种统计技术用于对输出变量与一个或多个输入变量之间的关系进行建模 用外行人的话来说&#xff0c;将其视为通过某些数据点拟合一条线&#xff0c;如下所示 以便在未知数据上进行预测&#xff0c;假设变量之间存在线性关系 点和线之间存在微小…

实体类赋值之后,数据库属性最后为null的解决方法

目录 1. 问题所示2. 原理分析1. 问题所示 执行代码赋值的时候,通过Debug可以看到成功被赋值,但执行到最后,该数据库的属性为null 如图所示: 2. 原理分析 针对这种情况,排查了一个晚上才找到根本原因 最后发现是持久化操作的问题,本身赋值之后,对于数据库还要执行一个…

112. Path Sum(路径总和)

问题描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 是指…

MCAL知识点(二十七):TC275如何通过GPT12实现ABZ解码

目录 1、概述 2、代码实现 1、概述 GPT12 - General Purpose Timer Unit (GPT12):通用定时器单元,具备较为灵活的定时器结构,可以用来做定时器、事件计数、脉冲宽度测量、产生PWM、频率调制、ABZ编码器增量测量。文章记录一下如何通过GPT12实现编码器ABZ信号的测量。 注意…

《基于CEEMDAN一小波包自适应阈值混凝土声发射信号降噪研究》算法思路笔记

![1]杨智中,林军志,汪魁等.基于CEEMDAN-小波包自适应阈值混凝土声发射信号降噪研究[J].振动与冲击,2023,42(03):139-149.DOI:10.13465/j.cnki.jvs.2023.03.016.](https://img-blog.csdnimg.cn/direct/9814ff64cc474cd3aa06ecaea60f2f75.png) 首先对周期循环荷载作用下混凝土试…