【Vue】Vue3.0(十七)Vue 3.0中Pinia的深度使用指南(基于setup语法糖)

上篇文章: 【Vue】Vue3.0(十一)Vue 3.0 中 computed 计算属性概念、使用及示例

🏡作者主页:点击!

🤖Vue专栏:点击!

⏰️创作时间:2024年11月10日15点23分

文章目录

    • 一、前言
    • 二、Pinia基础与setup语法糖的融合
      • (一)理解Pinia的核心优势
      • (二)setup语法糖简介
    • 三、Pinia的安装与基本配置
      • (一)安装Pinia
      • (二)在项目中配置Pinia
    • 四、创建和使用Store
      • (一)创建一个简单的Store示例
      • (二)在组件中使用Store(基于setup语法糖)
    • 五、深入理解State在setup中的使用
      • (一)响应式State的原理
      • (二)直接修改State
    • 六、Getters的灵活运用
      • (一)计算属性风格的Getters
      • (二)传递参数的Getters
    • 七、强大的Actions功能
      • (一)同步和异步Actions
      • (二)在组件中调用Actions
    • 八、Store之间的交互
      • (一)在不同Store中共享数据和方法
    • 九、结论

一、前言

在Vue 3.0的开发中,高效的状态管理是构建大型应用的关键。Pinia作为专为Vue 3设计的状态管理库,结合setup语法糖,能让我们更优雅地处理应用状态。本文将详细阐述在使用setup语法糖的情况下,Pinia在Vue 3.0中的使用细节。

二、Pinia基础与setup语法糖的融合

(一)理解Pinia的核心优势

Pinia提供了一种简洁且直观的方式来管理应用状态。与传统的状态管理方式相比,它具有更好的类型推断、更灵活的模块结构,在与Vue 3.0的setup语法糖配合时,能减少大量样板代码。

(二)setup语法糖简介

setup函数是Vue 3.0中一个新的组件选项,它在组件创建之前执行。在这个函数中,可以使用Composition API来组织逻辑。使用setup语法糖可以让我们更方便地在组件中引入和使用Pinia的Store。

三、Pinia的安装与基本配置

(一)安装Pinia

通过npm安装Pinia到Vue 3.0项目中:

npm install pinia

(二)在项目中配置Pinia

在main.js(或main.ts)中,创建并挂载Pinia实例:

import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';

const pinia = createPinia();
const app = createApp(App);
app.use(pinia);
app.mount('#app');

四、创建和使用Store

(一)创建一个简单的Store示例

创建一个名为counterStore.js(或counterStore.ts)的文件:

import { defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0
  }),
  getters: {
    doubleCount: (state) => state.count * 2
  },
  actions: {
    increment() {
      this.count++;
    }
  }
});

(二)在组件中使用Store(基于setup语法糖)

在Vue组件中:

<template>
  <div>
    <p>Count: {{ counterStore.count }}</p>
    <p>Double Count: {{ counterStore.doubleCount }}</p>
    <button @click="counterStore.increment">Increment</button>
  </div>
</template>

<script setup>
import { useCounterStore } from './counterStore';
const counterStore = useCounterStore();
</script>

另外一个例子:
在这里插入图片描述
count.ts


import { defineStore } from "pinia";

export const useCountStore = defineStore(
    'count',
    //pinia中真正存储数据的地方
    {
        actions:{
            increment(value: number){
                this.sum+=value
            }
        },
        state(){
            return{
                sum:6
            }
        }
    }
);

在count中我要实现对store中sum值的增减,那写法有三种:

  • //第一种 修改某个值的时候,这种的修改最为方便
    countStore.sum+=n.vaue

//第二种 :需改多个值的时候这种使用的较多
countStore.$patch({
})

  • //第三种:当对数据的处理方法也被别的组件使用,需要对这个数据处理的动作形成一个公共的方法的话,需要在store中形成一个action,然后再在vue中的调用
    countStore.increment(n.value) //这个是一个store中的action

Count.vue

<template>
    <div class="count">
       <h2>当前求和为:{{countStore.sum}}</h2>
       <select v-model.number="n">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
       </select>
       <button @click="add"></button>
       <button @click="minus"></button>
    </div>
</template>


<script lang="ts" setup name="Count">
import { reactive, ref } from 'vue'; 
//引入pinia中的数据
import {useCountStore} from '@/store/count'
import { log } from 'console';
//数据
//使用store得到一个count相关的store
const countStore =useCountStore();




let n =ref(1); //用户选择的数字

//方法
function add(){
    // sum.value+=n.value
    //第一种  修改某个值的时候,这种的修改最为方便
    countStore.sum+=n.vaue

	//第二种 :需改多个值的时候这种使用的较多
		countStore.$patch({
		
})
    //第三种:当对数据的处理方法也被别的组件使用,需要对这个数据处理的动作形成一个公共的方法的话,需要在store中形成一个action,然后再在vue中的调用
    countStore.increment(n.value)
}
function minus(){
    // sum.value-=n.value
}
</script>

<style scoped>
.count {
    background-color: skyblue;
    padding: 10;
    border-radius: 10px;
    box-shadow: 0 0 10px;
}

select,button {
    margin: 0 5px;
    height: 25px;
}
</style>



在这里插入图片描述

五、深入理解State在setup中的使用

(一)响应式State的原理

在Pinia的Store中,state是响应式的。当使用setup语法糖时,这种响应式机制无缝衔接。这是因为Pinia内部使用了Vue 3.0的响应式系统,对state进行了包装,使得在组件中使用时,能够自动更新视图。

(二)直接修改State

虽然可以直接通过this.count++这样的方式在actions中修改state,但不建议在组件中直接修改store的state。应该通过定义好的actions来保证数据的一致性和可维护性。

六、Getters的灵活运用

(一)计算属性风格的Getters

Getters在Pinia中类似于计算属性。在setup中使用时,它们会根据依赖的state自动计算和缓存结果。例如,doubleCount这个getter会在count变化时重新计算。

(二)传递参数的Getters

除了简单的计算属性风格的getters,Pinia还支持带有参数的getters。这可以让我们根据不同的条件计算出不同的值。例如:

getters: {
  multiplyCount: (state) => (factor) => state.count * factor
}

在组件中使用:

<template>
  <div>
    <button @click="console.log(counterStore.multiplyCount(3))">Multiply by 3</button>
  </div>
</template>

七、强大的Actions功能

(一)同步和异步Actions

Actions可以是同步或异步的。同步actions如increment可以直接修改state。异步actions则可以用于处理网络请求等异步操作。例如:

actions: {
  async fetchData() {
    const response = await fetch('https://example.com/data');
    const data = await response.json();
    // 处理数据并可能修改state
  }
}

(二)在组件中调用Actions

在setup中,可以直接调用store的actions。对于异步actions,可以使用async/await来处理异步流程。例如:

<template>
  <div>
    <button @click="fetchData">Fetch Data</button>
  </div>
</template>

<script setup>
import { useCounterStore } from './counterStore';
const counterStore = useCounterStore();
const fetchData = async () => {
  await counterStore.fetchData();
};
</script>

八、Store之间的交互

(一)在不同Store中共享数据和方法

有时候,不同的Store之间需要共享数据或调用彼此的方法。可以通过在一个Store中引入另一个Store来实现。例如,如果有一个userStorecounterStoreuserStore可以在某个action中调用counterStore的方法:

import { defineStore } from 'pinia';
import { useCounterStore } from './counterStore';

export const useUserStore = defineStore('user', {
  state: () => ({
    username: 'default'
  }),
  actions: {
    resetCounter() {
      const counterStore = useCounterStore();
      counterStore.count = 0;
    }
  }
});

九、结论

在Vue 3.0中,结合setup语法糖使用Pinia可以让状态管理变得更加简洁、高效和灵活。通过深入理解和运用Pinia的各个特性,我们能够更好地构建复杂的应用程序,提高代码的可维护性和可读性,从而为用户带来更优质的体验。

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

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

相关文章

常用的c++新特性-->day03

断言和异常 断言断言的基本使用 静态断言静态断言的基本使用 异常异常基本使用c98异常案例 noexceptnoexcept简单案例 断言 断言的基本使用 #include <iostream> #include <cassert>// >>>>>>>>>>>>>>>> 断言的…

11月7日星期四今日早报简报微语报早读

11月7日星期四&#xff0c;农历十月初七&#xff0c;早报#微语早读。 1、河南&#xff1a;旅行社组织1000人次境外游客在豫住宿2夜以上&#xff0c;可申请激励奖补&#xff1b; 2、主播宣称下播后商品恢复原价构成欺诈&#xff0c;广州市监&#xff1a;罚款5万元&#xff1b;…

数据结构-并查集专题(1)

一、前言 因为要开始准备年底的校赛和明年年初的ACM、蓝桥杯、天梯赛&#xff0c;于是开始按专题梳理一下对应的知识点&#xff0c;先从简单入门又值得记录的内容开始&#xff0c;并查集首当其冲。 二、我的模板 虽然说是借用了jiangly鸽鸽的板子&#xff0c;但是自己也小做…

【dvwa靶场:XSS系列】XSS (Stored)低-中-高级别,通关啦

更改name的文本数量限制大小&#xff0c; 其他我们只在name中进行操作 【除了低级可以在message中进行操作】 一、低级low <script>alert("假客套")</script> 二、中级middle 过滤了小写&#xff0c;咱们可以大写 <Script>alert("假客套…

【spark面试】spark的shuffle过程

概述 所有的shuffle的过程本质上就是一个task将内存中的数据写入磁盘&#xff0c;然后另一个task将磁盘中的数据读入内存的过程。 对于mapreduce来说&#xff0c;我们将内存中的数据写入磁盘成为maptask&#xff0c;将磁盘中的数据读入内存称为reducetask。 而对于spark来说&…

MySQL —— Innodb 索引数据结构

文章目录 不用平衡二叉树或红黑树作为索引B树适合作为索引比B树更适合作为索引的结构——B树总结 MySQL 使用 B树索引数据结构&#xff08;因为默认使用 innodb 存储引擎&#xff09; B树&#xff1a;有序数组 平衡多叉树&#xff1b;B树&#xff1a;有序数组链表 平衡多叉树…

shell中执行hive指令以及hive中执行shell和hdfs指令语法

0. 简介 主要介绍了三种环境命令执行语法&#xff1a; shell中执行hive指令hive中执行shell指令hive中执行hdfs指令 1. shell中执行hive指令 语法&#xff1a;hive [-hiveconf xy]* [<-i filename>]* [<-f filename> | <-e query-string>] [-S] 说明&…

MySQL系列之如何在Linux只安装客户端

导览 前言Q&#xff1a;如何安装一个Linux环境下的MySQL客户端一、准备文件1. 确认Server版本2. 选择Client安装文件 二、下载并安装1. 下载1.1 寻找文件1.2 文件说明 2. 安装2.1 上传至Linux服务器2.2 执行安装 三、连接验证1. 确认远程授权2. 建立远程连接 结语精彩回放 前言…

C++20 概念与约束(3)—— 约束的进阶用法

1、再谈约束主句与从句 上一篇文章中提到过约束可以无限嵌套。末尾也提到不考虑嵌套约束的情况下&#xff0c;模板因为 SFINAE 规则的存在&#xff0c;其中 requires 子句只要存在返回值&#xff0c;只有可能是 true 这一种结果。在非模板中&#xff0c;如果 requires 子句中的…

进程启动时,main 函数是如何被找到的?

Linux中一个进程是如何被启动起来的&#xff1f; 一、进程是怎么启动的&#xff1f;二、进程内存空间分段三、进程的入口函数四、总结 一、进程是怎么启动的&#xff1f; 当一个程序被执行时&#xff0c;怎么看出进程的运行呢&#xff1f;一个进程是怎么启动的&#xff1f;为什…

关于 el-table 的合计行问题

目录 一.自定义合计行 二.合计行不展示&#xff0c;只有缩放/变大窗口或者F12弹出后台时才展示 三.合计行出现了表格滚动条下方 四.合计行整体样式的修改 五.合计行单元格样式修改 1.css 2.jsx方式 六.合计行单元格合并 一.自定义合计行 通过 show-summary 属性开启合计…

十三:java web(5)-- Spring数据持久层

目录 Spring 数据持久层 1. Spring 与 JDBC 1.1 使用 Spring 管理数据库连接 1.1.2 Apache Commons DBCP 基于配置文件xml 使用 1.1.3 Apache Commons DBCP 基于配置类使用 1.1.4 HikariCP 基于配置文件xml 使用 推荐使用 Spring Boot 默认连接池 1.1.5 HikariCP 基于配置…

初学者指南:用例图——开启您的软件工程之旅

目录 背景&#xff1a; 基本组成&#xff1a; 关联&#xff08;Assciation&#xff09;&#xff1a; 包含&#xff08;Include&#xff09;&#xff1a; 扩展&#xff08;Extend&#xff09;&#xff1a; 泛化&#xff08;Inheritance&#xff09;&#xff1a; 完整银行…

基于单片机洗衣机控制器的设计(论文+源码)

1需求分析 在智能洗衣机系统设计中&#xff0c;考虑到洗衣机在实际应用过程中&#xff0c;需要满足用户对于不同衣物清洁、消毒的应用要求&#xff0c;对设计功能进行分析&#xff0c;具体如下&#xff1a; 通过按键实现洗衣机不同工作模式的切换&#xff0c;包括标准模式&am…

qt QFontDialog详解

1、概述 QFontDialog 是 Qt 框架中的一个对话框类&#xff0c;用于选择字体。它提供了一个可视化的界面&#xff0c;允许用户选择所需的字体以及相关的属性&#xff0c;如字体样式、大小、粗细等。用户可以通过对话框中的选项进行选择&#xff0c;并实时预览所选字体的效果。Q…

Python学习从0到1 day27 第三阶段 Spark ③ 数据计算 Ⅱ

目录 一、Filter方法 功能 语法 代码 总结 filter算子 二、distinct方法 功能 语法 代码 总结 distinct算子 三、SortBy方法 功能 语法 代码 总结 sortBy算子 四、数据计算练习 需求&#xff1a; 解答 总结 去重函数&#xff1a; 过滤函数&#xff1a; 转换函数&#xff1a; 排…

今天,智谱「新清影」上线,率先进入有声视频生成时代!还要继续开源宠粉

来&#xff0c;你先把手机音量打开&#xff0c;然后去“听”下面一段视频&#xff1a; 你是不是一脸懵逼&#xff1f;不知道我想表达什么&#xff1f; 视频是AI生成的并不奇怪&#xff0c;但你可能没法相信&#xff0c;这个视频的音效&#xff0c;也是AI生成的。 火车鸣笛 你…

「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件

本篇将带你实现一个自定义评分星级组件&#xff0c;用户可以通过点击星星进行评分&#xff0c;并实时显示评分结果。为了让界面更具吸引力&#xff0c;我们还将添加一只小猫图片作为评分的背景装饰。 关键词 UI互动应用评分系统自定义星级组件状态管理用户交互 一、功能说明 …

pdf转excel;pdf中表格提取

一、问题描述 在工作中或多或少会遇到&#xff1a;需要将某份pdf中的表格数据提取出来&#xff0c;以便能够“修改使用”数据 可将pdf中的表格提取出来&#xff0c;解决办法还有点复杂 尤其涉及“pdf中表格不是标准的单元格”的时候&#xff0c;提取数据到excel不太容易 比…

IT架构管理

目录 总则 IT架构管理目的 明确组织与职责 IT架构管理旨在桥接技术实施与业务需求之间的鸿沟&#xff0c;通过深入理解业务战略和技术能力&#xff0c;推动技术创新以支持业务增长&#xff0c;实现技术投资的最大价值。 设定目标与范围 IT架构管理的首要目的是确立清晰的组织…