Vue3项目中Pinia使用详解

news2025/6/27 22:30:22

开篇

本文的目的是创建一个使用typescript的vue3项目,并使用pinia来管理状态。

详细步骤

创建项目

  • 创建vue3项目,并使用vite作为打包工具
npm create vite@latest vue3_pinia
// 选择vue,随后选择typesript
  • 进入项目,并按照依赖包
cd vue3_pinia
npm i
  • 安装pinia
npm i pinia

配置Pinia

  • 在src下新建stores文件夹,并在stores文件夹下新建index.ts文件
  • 在src/main.ts中引入pinia,并进行配置
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
// 引入pinia
import { createPinia } from 'pinia'

// 创建pinia实例
const pinia = createPinia()

createApp(App).use(pinia).mount('#app')
  • 在store/index.ts中写入一些基本的数据用于测试
import { defineStore } from "pinia";

export const useExampleStore = defineStore('example', {
    state: () => {
        return {
            count: 3
        }
    },

    getters: {
        // 判断是否是偶数
        isEven: state => state.count % 2 === 0,
        // 求平方
        isSquare: state => state.count * state.count
    },
    actions: {
        increment() {
            this.count++
        }
    }
})

读取Store中的数据

  • 在src/components下新建PiniaDemo.vue组件,并引入useExampleStore 得到store实例,从而渲染stores中的数据
<script setup lang="ts">
import { useExampleStore } from '../stores/index';

const store = useExampleStore();
</script>

<template>
    <div>
        <p>Count: {{ store.count }}</p>
        <p>isEven: {{ store.isEven }}</p>
        <p>Square: {{ store.isSquare }}</p>
        <button @click="store.increment">+1</button>
    </div>
</template>

<style scoped>
    div {
        border: 1px solid gray;
        width: 200px;
        height: 200px;
    }
</style>
  • 在App.vue中,引入PiniaDemo.vue组件,此时,页面上的效果如下:
    在这里插入图片描述

  • 此时点击按钮,发现已经生效了的
    在这里插入图片描述

  • 肯定你也发现了,渲染的还是,都是store.xxx,这非常不方便!所以,在PiniaDemo.vue中使用解构的方式来获取这些值,并渲染

<script setup lang="ts">
import { useExampleStore } from '../stores/index';
import { storeToRefs } from 'pinia'

const store = useExampleStore();

// 注意,解构的时候,要使用这个方法,不然解构出来的值就不是响应式了
const { count, isEven, isSquare } = storeToRefs(store);
const { increment } = store;
</script>

<template>
    <div>
        <p>Count: {{ count }}</p>
        <p>isEven: {{ isEven }}</p>
        <p>Square: {{ isSquare }}</p>
        <button @click="increment">+1</button>
    </div>
</template>

<style scoped>
    div {
        border: 1px solid gray;
        width: 200px;
        height: 200px;
    }
</style>
  • 当然,我们也可以一次性修改多条state中的数据, 现在在index.ts的state中,新增一个数据
    state: () => {
        return {
            count: 3,
            pet: 'cat'
        }
    },
  • 在PiniaDemo.vue中增加change按钮,并一次性修改count和pet两个数据(注意:$patch的两种用法都列出来啦!)
<script setup lang="ts">
import { useExampleStore } from '../stores/index';
import { storeToRefs } from 'pinia'

const store = useExampleStore();

// 注意,解构的时候,要使用这个方法,不然解构出来的值就不是响应式了
const { count, isEven, isSquare, pet } = storeToRefs(store);
const { increment } = store;

// $patch的第一种用法
// const patchClickEvent = () => {
//     store.$patch(store => {
//         store.count += 2;
//         store.pet = store.pet === 'cat' ? 'dog' : 'cat'
//     })
// }

//$patch的第2种用法
const patchClickEvent = () => {
    store.$patch({
        count: store.count+2,
        pet: store.pet === 'cat' ? 'dog' : 'cat'
    })
}
</script>

<template>
    <div>
        <p>Count: {{ count }}</p>
        <p>isEven: {{ isEven }}</p>
        <p>Square: {{ isSquare }}</p>
        <p>pet: {{  pet }}</p>
        <button @click="increment">+1</button>
        <!-- 其他改变数据的方式之$patch, 可一次修改多条-->
         <button @click="patchClickEvent">change</button>
    </div>
</template>
  • 点击按钮,此时效果如下

在这里插入图片描述

不同store文件间的通信

  • 在stores下新建pet.ts文件,并构建基本的代码,可以看到,这里代码比较简单,只定义了一个数组类型的petList数据
import { defineStore } from 'pinia'

export const usePetStore = defineStore('pet', {
    state: () => {
        return {
            petList: ['cat', 'dog', 'rabbit']
        }
    }
})
  • 在stores/index.ts中引入usePetStore,并定义一个getPetList方法,获取petList的值(此处为了方便,我直接给出index.ts所有的代码
import { defineStore } from "pinia";
import { usePetStore } from './pet'

export const useExampleStore = defineStore('example', {
    state: () => {
        return {
            count: 3,
            pet: 'cat'
        }
    },

    getters: {
        // 判断是否是偶数
        isEven: state => state.count % 2 === 0,
        // 求平方
        isSquare: state => state.count * state.count
    },
    actions: {
        increment() {
            this.count++
        },

        getPetList() {
            return usePetStore().petList
        }
    }
})
  • 在PiniaDemo.vue中使用getPetList()方法渲染petList数组
<p>petList: {{ getPetList() }}</p>
...
const { increment, getPetList } = store;
  • 此时,效果如下
    在这里插入图片描述

以上便是Pinia的一些使用方式了,希望能对您起到抛砖引玉的参考作用。

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

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

相关文章

适用VS2019尝试生成跨平台的动态库

文章目录 1、2、步骤2.1 创建一个CMake项目2.2 写一个简单的计算加法的函数2.3 调整CMakeLists.txt2.4 Windows下编译x86的库2.4.1 配置x86-release2.4.2 选择启动项2.4.3 生成动态库 2.5 linux下编译动态库2.5.1 参考2.4.1设置Linux-GCC-Release配置X642.5.2 配置远程linux计算…

r语言数据分析案例25-基于向量自回归模型的标准普尔 500 指数长期预测与机制分析

一、背景介绍 2007 年的全球经济危机深刻改变了世界经济格局&#xff0c;引发了一系列连锁反应&#xff0c;波及各大洲。经济增长停滞不前&#xff0c;甚至在某些情况下出现负增长&#xff0c;给出口导向型发展中国家带来了不确定性。实体经济受到的冲击尤为严重&#xff0c;生…

Python学习笔记8:入门知识(八)

前言 本篇是元组的知识点学习以及知识点的补充 元组 概念 不可变的列表&#xff0c;叫做元组。 在之前列表的特性中&#xff0c;我们就说过列表是可变的&#xff0c;但是在实际使用过程中&#xff0c;我们有时候仍然需要一系列不可变的元素&#xff0c;这个时候就需要元组出…

每日5题Day24 - LeetCode 116 - 120

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; /* // Definition for a Node. class Node {public int val;public Node left;…

万字长文爆肝Spring(一)

Spring_day01 今日目标 掌握Spring相关概念完成IOC/DI的入门案例编写掌握IOC的相关配置与使用掌握DI的相关配置与使用 1&#xff0c;课程介绍 对于一门新技术&#xff0c;我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那对于Spring来说: 1.1 为什么要学? …

the histogram of cross-entropy loss values 交叉熵损失值的直方图以及cross-entropy loss交叉熵损失

交叉熵损失值的直方图在机器学习和深度学习中有几个重要的作用和用途&#xff1a; 评估模型性能: 直方图可以帮助评估模型在训练数据和测试数据上的性能。通过观察损失值的分布&#xff0c;可以了解模型在不同数据集上的表现情况。例如&#xff0c;损失值分布的形状和范围可以反…

2024 Idea最新激活码

idea的激活与安装 操作如下&#xff1a; ① 打开网站&#xff1a;https://web.52shizhan.cn 切换到&#xff1a;激活码&#xff0c;点击获取 ② 这个时候就跳转到现成账号页面&#xff0c;点击获取体验号&#xff0c;如图 ③ 来到了获取现成账号的页面了。输入你的邮箱账号即…

uni app 自定义 带popup弹窗的input组件

工作需要。自定义了个带popup弹窗的input组件。此组件满足个人需求&#xff0c;不喜勿喷。应该可以看明白怎么回事&#xff0c;也能自己改改&#xff0c;所以就不要联系了&#xff0c;点赞收藏就好 <template><view class"dialog_main"><input v-mod…

【第七篇】SpringSecurity核心组件和核心过滤器

一、SpringSecurity中的核心组件 在SpringSecurity中的jar分为4个,作用分别为 jar作用spring-security-coreSpringSecurity的核心jar包,认证和授权的核心代码都在这里面spring-security-config如果使用SpringSecurity XML命名空间进行配置或者SpringSecurity的<br />J…

Python 使用 Tkinter库 设置 tkinter ttk 框架的背景颜色

Tkinter 设置 tkinter ttk 框架的背景颜色 在本文中&#xff0c;我们将介绍如何使用 Tkinter 在 tkinter ttk 框架中设置背景颜色。Tkinter 是 Python 中常用的 GUI 工具包&#xff0c;ttk 则是 Tkinter 中的一个模块&#xff0c;提供了一套更加现代化的控件。 Tkinter 简介 …

ESP32基础应用之esp32连接腾讯云并使用微信小程序控制的智能灯

文章目录 1. 项目简介1.1 功能接收1.2 使用资源1.3 测试平台 2 腾讯云物联网开发平台3 esp32设备开发3.1 准备参考例程3.2 vscode平台创建测试工程3.3 修改工程 问题总结使用PowerShell命令行终端生成的二维码不能用 1. 项目简介 1.1 功能接收 实现腾讯云创建项目与设备&…

泰坦尼克号数据集机器学习实战教程

泰坦尼克号数据集是一个公开可获取的数据集&#xff0c;源自1912年沉没的RMS泰坦尼克号事件。这个数据集被广泛用于教育和研究&#xff0c;特别是作为机器学习和数据分析的经典案例。数据集记录了船上乘客的一些信息&#xff0c;以及他们是否在灾难中幸存下来。以下是数据集中主…

微信小程序查分易如何使用?

期末马上到了&#xff0c;老师们又开始为发放成绩而头疼了&#xff0c;堆积如山的试卷&#xff0c;密密麻麻的分数&#xff0c;还有那些不断响起的家长电话&#xff0c;真是让人心烦。别担心&#xff0c;今天就让我来介绍一个让老师“偷懒”神器——查分易微信小程序 第一步&am…

Qt创建静态库及静态库使用

Qt创建静态库及静态库使用 1. 创建一个库文件 选择静态库 将需要打包的.h 和.cpp文件添加到程序中&#xff0c; 在编译器版本下的debug和release模式下分别编译&#xff08;右键项目&#xff0c;点击“qmake”,再点击“构建”&#xff09;后&#xff0c;在对应的的build目录下…

区间分割求解方程

本文实现了基于mpi4py的多进程算法 mpi不过多介绍&#xff0c;某些函数的用法也不是介绍范围&#xff0c;这里只给出怎么实现多进程的方程求根算法。区间划分求解方程&#xff0c;在串行程序里&#xff0c;二分法是非常经典的算法&#xff0c;现在对其进行拓展&#xff0c;实现…

Kubrnetes APIServe 监控

kube-apiserver组件监控指标及大盘使用说明_容器服务 Kubernetes 版 ACK(ACK)-阿里云帮助中心 kube-apiserver组件提供了Kubernetes的RESTful API接口&#xff0c;使得外部客户端、集群内的其他组件可以与ACK集群交互。本文介绍kube-apiserver组件的监控指标清单、大盘使用指导…

C# Winform 侧边栏,切换不同页面

在项目中我们经常遇到需要在主界面上切换不同子页面的需求&#xff0c;常用做法是左侧显示子页面菜单&#xff0c;用户通过点击左侧菜单&#xff0c;实现右边子页面的展示。 实例项目实现&#xff1a; 项目左侧侧边栏实现FlowLayoutPanel使用显示不同子窗体 实例链接&#xf…

苹果设备上的livp格式是什么?怎么转换?

livp格式是苹果公司推出的一种图片格式&#xff0c;它允许用户在iOS设备上拍摄的照片中包含声音和动作&#xff0c;从而创造出一种动态的照片效果。 livp格式的照片不仅记录了图像&#xff0c;还记录了拍摄前后1.5秒的音频和视频&#xff0c;使得照片能够“活”起来。 ✨livp…

植物大战僵尸(杂交版)最新版V2.1来袭!

【新手指导】最新版v2.1来袭 1.闪退怎么办&#xff1f; 答:窗口模式可以解决大部分问题。输入法转换成英文也可以。最后一种办法管理员运行&#xff0c;再后台可运行&#xff0c;即便不是窗口也不会闪退&#xff0c;亲测有效 2.哪里下载&#xff1f; 答&#xff1a;夸克网盘htt…