Vue3项目中Pinia使用详解

开篇

本文的目的是创建一个使用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的一些使用方式了,希望能对您起到抛砖引玉的参考作用。

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

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

相关文章

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

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

OrangePi AIpro测评:性能、应用与开发者体验解析

一、OrangePi AIpro介绍 OrangePi AIpro(8T)采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32GB/64GB/128GB/256GB eMMC模块&#xff0c;支持双4K高…

学习ZYNQ——使用IP核

文章目录 [TOC](文章目录) 前言一、新建Vivado工程二、使用IP核1.加载IP2.查看IP核3.应用IP核 三、添加源文件1.led.v2.约束文件pin_led.xdc 四、综合、运行程序 前言 加载前面使用HLS生成的IP核&#xff0c;实现LED灯的闪烁&#xff0c;熟悉整套流程的步骤&#xff1a; 前一篇…

关于对pagination.js源代码进行修改且引入项目使用

实现效果 使用定时器对组件进行每秒请求&#xff0c;每过固定时间之后&#xff0c;进行下一页项目请求&#xff0c;进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…

NAND flash测试-雷龙发展

文章目录 一、简介 二、速度测试 最近比较忙&#xff0c;也一直没空发什么文章&#xff0c;这算是新年第一篇吧&#xff0c;正好最近收到了一个雷龙的flash芯片&#xff0c;先拿来玩一下吧。 有兴趣的小伙伴可以去雷龙官网找小姐姐领取一个免费试用。 一、简介 大概样子就是上面…

大模型企业落地:汽车行业知识大模型应用

前言 在当今这个信息爆炸的时代&#xff0c;知识管理成为了企业提升核心竞争力的关键。特别是在汽车行业这样一个技术密集、信息量庞大的领域&#xff0c;如何高效管理和利用知识资源&#xff0c;成为了每个企业必须面对的挑战。 汽车行业的知识管理痛点 汽车行业作为现代工…

RCD负载箱:电力系统的安全保障

在电力系统中&#xff0c;负载箱是一种重要的设备&#xff0c;它的主要功能是模拟实际的电力负载&#xff0c;以便对电力系统进行各种性能测试和分析。RCD负载箱一种特殊类型的负载箱&#xff0c;它具有剩余电流保护功能&#xff0c;可以有效地防止电气火灾和电击事故的发生&am…

基于Spring Boot的智能分析平台

项目介绍&#xff1a; 智能分析平台实现了用户导入需要分析的原始数据集后&#xff0c;利用AI自动生成可视化图表和分析结论&#xff0c;改善了传统BI系统需要用户具备相关数据分析技能的问题。该项目使用到的技术是SSMSpring Boot、redis、rabbitMq、mysql等。在项目中&#…

工业 UI 风格,展现独特魅力

工业 UI 风格&#xff0c;展现独特魅力

Facebook:数字时代的文化交流平台

在当今信息爆炸的数字时代&#xff0c;Facebook已经成为了一个不可或缺的社交媒体平台&#xff0c;不仅在个人生活中起到了联系社交的作用&#xff0c;更在全球范围内促进了文化交流和理解。本文将深入探讨Facebook作为文化交流平台的重要性&#xff0c;并分析其在数字时代如何…

C++面向对象程序设计 - 命名空间

命名空间是ANSI C引入的可以由用户命名的作用域&#xff0c;用来处理程序中常见的同名冲突。 在C语言中定义了三个层次的作用域&#xff0c;即文件&#xff08;编译单元&#xff09;、函数和复合语句。C又引入了类作用域&#xff0c;类是出现在文件内的。在不同的作用域中可以定…

vue代办事件案例实战练习,配有答案解析

代办事件案例 该案例&#xff0c;综合了前面所学的知识&#xff0c;列入点击事件绑定&#xff0c;双向绑定&#xff0c;v-for循环语句&#xff0c;v-model双向绑定&#xff0c;以及input标签的不同type形式。 演示代码如下&#xff1a; <template > <div id"ku…

腾讯云对象存储不绑定自定义备案域名不给下载应该如何处理?

从2024年1月1日起&#xff0c;腾讯云对象存储&#xff08;COS&#xff09;将实施新政策&#xff1a;新创建的存储桶不再支持使用path-style域名&#xff08;即存储桶绝对路径&#xff09;。此外&#xff0c;使用默认域名访问的新存储桶将不再支持任意类型文件的预览&#xff0c…

刷题记录(240613)

aliyun0512 1. 小红定义一个数组是好数组&#xff0c;当且仅当所有奇数出现了奇数次&#xff0c;所有偶数出现了偶数次。现在小红拿到了一个数组&#xff0c;她希望取一个该数组的非空子序列(可以不连续)&#xff0c;使得子序列是好数组。你能帮小红求出子序列的方案数吗?由于…

C++面向对象:多态性

多态性 1.概念 多态性是面向对象的程序设计的一个重要特征。在面向对象的方法中一般是这样表述多态的&#xff1a;向不同的对象发送同一个信息&#xff0c;不同的对象在接收时会产生不同的行为。也就是说&#xff0c;每个对象用自己的方式去响应共同的消息。 2.典例 下面这…

MFC动态创建按钮

void CMFCApplication1Dlg::OnBnClickedOk() {for (int i 0; i < 100; i){for (int j 0; j < 100; j){CButton* pButton3 new CButton;pButton[i][j] pButton3;}}CRect rect;GetClientRect(&rect); // 获取对话框客户区的大小rect.top 10; // 设置按钮的位置rec…

Elastic 索引结构-倒排索引

前言 Elastic 在数据库分类中一般被分为全文检索的数据库&#xff0c;那为什么这么区分呢&#xff1f;主要是因为其独特的索引结构 即倒排索引。 倒排索引 倒排索引先将文档中包含的关键字全部提取出来&#xff0c;然后再将关键字与文档的对应关系保存起来&#xff0c;最后再…

19、24年--信息系统工程——安全工程

1、工程概述 信息安全系统工程就是要建造一个信息安全系统,它是整个信息系统工程的一部分,而且最好是业务应用信息系统工程同步进行,主要围绕信息安全内容。 2、安全系统 1)X轴是”安全机制“。安全机制可以理解为提供某些安全服务,利用各种安全技术和技巧,所形成的一个…

06 SpringBoot 配置文件详解-application.yaml

Spring Boot 提供了大量的自动配置&#xff0c;极大地简化了spring 应用的开发过程&#xff0c;当用户创建了一个 Spring Boot 项目后&#xff0c;即使不进行任何配置&#xff0c;该项目也能顺利的运行起来。当然&#xff0c;用户也可以根据自身的需要使用配置文件修改 Spring …