Vue3系列——Pinia状态管理库

news2025/1/20 19:39:10

目录

Pinia

安装、创建

Store

定义Store

Option Store

Setup Store

使用Store

storeToRefs

action异步实现


Pinia

Pinia是Vue的专属状态管理库,它允许跨组件或页面共享状态,实现和Vuex一样的数据共享,是Vuex状态管理工具的替代品。其:

  • 提供更加简单的API,去掉了mutation;

  • 提供符合组合式风格的API与Vue3新语法统一;

  • 去掉了modules的概念,每个store都是一个独立的模块;

  • 搭配TypeScript一起使用提供可靠的类型推断。

简单地了解了Pinia后,我们正式开始学习Pinia。

安装、创建

安装Pinia库的方法很简单,在终端执行如下命令即可:

npm install pinia

安装pinia后,我们需要在main.js中,通过createPinia方法创建一个pinia实例并将其传递给app应用,示例代码如下:

import "./assets/main.css";
import { createApp } from "vue";
import App from "./App.vue";
import { createPinia } from "pinia";  // 导入createPinia方法

const pinia = createPinia();  // 创建Pinia实例
createApp(App).use(pinia).mount("#app"); // 把pinia实例加入到app应用中

这样我们就成功地安装、创建pinia实例并将其传递给app应用了,可以愉快地使用pinia了。

Store

在使用Pinia之前,先简单了解一下Store。

Store是一个保存状态和业务逻辑的实体,不与组件绑定,但它承载着全局状态,每个组件都可以读取和写入它,它有三个概念:

  • state:返回初始状态的函数、数据;

  • getter:Vue的computed计算属性,通过defineStore中的getters属性来定义;

  • action:方法method,通过defineStore中的actions属性来定义;

使用场景:当该数据、方法在很多地方都需要使用或需要通过页面保存的数据,如显示在导航栏中用户信息,一个多步骤表单页面等,这时我们就可以使用Store了。

定义Store

我们通过defineStore方法定义Store,其语法格式如下:

import { defineStore } from 'pinia'
export const Store名字 =defineStore('Store的ID名',{
 //其他配置......
})

在defineStore方法中,第一个参数为Store的ID名,是必须传入的值,它用来连接store和devtools,第二个参数可接受两类数据:Setup函数或Option对象。

注意:在定义Store名字时,尽量使用use××××的命名格式。

Option Store

第二个传入的参数类型为Option对象时,语法格式为:

import { defineStore } from 'pinia'
export const store名字=defineStore('storeID名',{
 state: // 数据
 getters: //计算属性
    actions: //方法
})

其中:state是store的数据,getters是store的计算属性,actions是store方法。

示例代码如下:

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

Setup Store

第二个传入参数类型为Setup函数时,语法格式如下:

import { defineStore } from 'pinia'
import { ref, computed } from "vue"
export const Store名字= defineStore ('storeID名',()=>{
 const 数据名 = ref()    // 定义数据 state
    const 方法名 = ()=>{  // 定义方法 action
     //方法 
    }
 const 计算属性名 = computed(() => // 操作); // 定义计算属性
 return { 数据名, 方法名, 计算属性名  }
})

需要注意的是:在传入参数类型为Setup函数时,需要把数据、方法、计算属性通过return返回出去供外界使用。示例代码如下:

export const useCounterStore = defineStore('counter',()=>{
 const count ref(0)  // 定义数据
 const increment=()=>{ // 定义方法
  count.value++
 }
 const doubleCount =computed(()=>count.value*2)  // 定义计算属性
 return {count,increment,doubleCount}  // 返回
})

个人更喜欢用Setup Store类型。

使用Store

使用Store很简单,只需要引入写好的Store文件,创建store实例对象,其语法格式如下:

<script setup>
import { Store名字 } from "Store文件路径"
const 实例名 = Store名字()
</script>

<template>
	<div @click="实例名.方法">{{ 实例名.数据名/计算属性名 }}</div>
</template>

示例代码如下:

<script setup>
import { useCounterStore } from "./stores/counter"
const counterStore = useCounterStore()	//创建store实例
</script>

<template>
  <div @click="counterStore.increment">数据--{{ counterStore.count }}</div>
  <div>计算属性值--{{ counterStore.doubleCount }}</div>
</template>

这里我们使用了上面的Setup Store示例代码作为store,运行结果如下:

storeToRefs

当我们使用解构语法调用store中的数据、计算属性时,需要在创建store实例时添加storeToRefs方法,示例代码如下:

<script setup>
import { useCounterStore } from "./stores/counter"
import { storeToRefs } from "pinia"
const { count, doubleCount }  = storeToRefs(useCounterStore())	//创建store实例
</script>
<template>
  <div>数据--{{ counterStore.count }}</div>
  <div>计算属性值--{{ counterStore.doubleCount }}</div>
</template>

运行结果如下:

使用storeToRefs函数可以辅助保持数据(state+getter)的响应式解构。

注意:storeToRefs只能用于数据、计算属性,不能用于方法,方法直接从原来的counterStore中解构赋值。

当我们不使用storeToRefs解构数据时,会导致响应式失效,示例代码如下:

<script setup>
import { useCounterStore } from "./stores/counter"
const { count, doubleCount } = useCounterStore()  //创建store实例
const CounterStore = useCounterStore() 
</script>
<template>
  <div @click="CounterStore.increment">数据--{{ count }}</div>
  <div>计算属性值--{{ doubleCount }}</div>
</template>

当我们点击div标签时,数据没有任何反应。

action异步实现

在上面的方法中,我们的action处理的是同步,当我们需要处理异步的方法时,需要axios库,store示例代码如下:

import { defineStore } from "pinia"
import { ref} from "vue"
import axios from "axios"
const API_URL = "url连接"
export const useCounterStore = defineStore("asyncStore", () => {
  const list = ref([])   // 定义数据
  const getList = async () => {   // 定义异步方法
    const res = await axios.get(API_URL) // 获取数据
    list.value = res.data.data.channels    // 数据赋值
  }
  // 以对象的方式return供组件使用
  return {getList,list}
})

vue文件示例代码如下:

<script setup>
import { useCounterStore } from "./stores/counter";
const counterStore = useCounterStore(); //创建store实例
</script>

<template>
  <button @click="counterStore.getList">获取数据</button>
  <ul>
    <li v-for="item in counterStore.list" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

运行结果如下:

 好了,Vue3系列——Pinia入门就将学到这里了

公众号:白巧克力LIN

该公众号发布Python、数据库、Linux、Flask、自动化测试、Git、算法、Vue3等相关文章!

- END -

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

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

相关文章

【直播回顾】AIGC产业研究报告2023图像生成篇报告解读

易观&#xff1a;5月9日&#xff0c;易观高级分析师陈晨带来了《AIGC产业研究报告2023图像生成篇》的报告解读&#xff0c;错过直播的朋友敬请观看回顾&#xff01; 图像作为人工智能内容生成的一种模态&#xff0c;一直在AIGC领域中扮演着重要角色&#xff0c;由于图像生成应用…

1135 Is It A Red-Black Tree(超详细注释+46行代码)

1135 Is It A Red-Black Tree 分数 30 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 There is a kind of balanced binary search tree named red-black tree in the data structure. It has the following 5 properties: (1) Every node is either red or blac…

【C++】类和对象(中)---拷贝构造函数、赋值运算符重载

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

MySQL之MHA高可用集群及故障切换

目录 一、MHA概述1.1 MHA 的组成1.2 MHA 的特点1.3 MHA的工作原理1.4 故障切换时MHA会做什么 二、搭建MySQLMHA2.1 实验思路2.2 实验环境、安装包2.3 服务搭建2.3-1 所有服务器挂壁防火墙和安全增强2.3-2 修改 Master、Slave1、Slave2 节点的主机名2.3-3 修改三台MySQL服务器主…

『新星计划 • 数据结构与算法』数据结构学习指南以及在校招中的重要性

文章目录 &#x1f490;文章导读&#x1f490;导师自我介绍&#x1f490;数据结构与算法的重要性&#x1f513;在岗位招聘中&#x1f513;在校招笔试中&#x1f513;在校招面试中&#x1f513;在未来工作中 &#x1f490;数据结构与算法如何学习⤴️学习路线⤵️学习方法↪️几…

tinyWebServer 学习笔记——一、半同步半反应堆线程池

文章目录 一、基础知识1. 服务器编程基本框架2. 五种 I/O 模型3. 事件处理模式4. 半同步/半反应堆模式5. 线程池 二、代码解析1. 线程池类定义2. 线程池创建与回收3. 向请求队列中添加任务4. 线程处理函数5. run 执行任务 参考文献 一、基础知识 1. 服务器编程基本框架 服务器…

软件测试 自动化测试selenium篇(一)

目录 一、什么是自动化测试 单元测试 接口自动化 UI自动化 二、如何实施自动化测试 自动化测试需要了解的技能 三、selenium介绍 webdriver的工作原理&#xff1a; 四、SeleniumJava环境搭建 验证环境是否搭建成功 创建java项目&#xff0c;添加pom文件中添加依赖 常见问…

一些使用树莓派遇到的问题

在长达两个月的实习期&#xff0c;白天去公司实习&#xff0c;晚上回到实验室学习树莓派。终于简单的入门了。来做个总结。 目录 1. wifi问题 树莓派之wifi连接 2.vnc树莓派桌面问题 3.安装库或者下载东西时&#xff0c;域名无法解析。 4.进行安装或者操作时&#xff0c…

【Java多线程编程】解决线程的不安全问题之volatile关键字

目录 1. 造成线程不安全的代码 2. volatile能保证内存可见性 3. synchronized与volatile的区别 3.1 synchronized能保证原子性 3.2 volatile不能保证原子性 1. 造成线程不安全的代码 有一代码&#xff0c;要求两个线程运行。并自定义一个标志位 flag&#xff0c;当线程2&…

UVM学习——搭建简单的UVM平台

引言 本专栏的博客均与 UVM 的学习相关&#xff0c;学习参考&#xff1a; 【1】UVM Tutorial 【2】张强著&#xff0c;UVM实战 &#xff08;卷 Ⅰ&#xff09; 【3】Download UVM (Standard Universal Verification Methodology) 本专栏的学习基本依照 资料【2】的主线&#…

【机器学习】正规方程法求解线性回归问题

前情提要&#xff1a;https://blog.csdn.net/weixin_45434953/article/details/130604086 正规方程 正规方程能以更好的方式求得假设函数中 θ \theta θ的最优值。它提供了一种用于求 θ \theta θ的解析方法&#xff0c;而不是梯度下降那样的迭代方法。也就是只需要一次运算…

Microsoft Power BI连接本地mysql 数据库 !power bi提示此连接器需要安装一个或多个其他组件才能使用怎么办!

一、步骤 &#xff08;一&#xff09;从菜单栏点击进入mysql数据库 点击主页>获取数据>更多 选择mysql数据库&#xff0c;点击连接 &#xff08;二&#xff09;已经安装了mysql connector/net还是提示此连接器需要安装一个或多个其他组件才能使用-解决 重装了几次都…

vue-cli 关闭 Uncaught error 的全屏提示

在使用vue-cli开发项目的时候&#xff0c;如果代码抛出异常了&#xff0c;那么就会出现一个全屏的提示框&#xff0c;长下面这样&#xff1a; 经过一段时间的排查发现是webpack的问题&#xff0c;排查方式就是打开控制台&#xff0c;看这个框的一些属性&#xff0c;通常会有一些…

【DNDC模型】在土地利用变化、未来气候变化下的建模方法及温室气体时空动态模拟实践技术

DNDC&#xff08;Denitrification-Decomposition&#xff0c;反硝化-分解模型&#xff09;是目前国际上最为成功的模拟生物地球化学循环的模型之一&#xff0c;自开发以来&#xff0c;经过不断完善和改进&#xff0c;从模拟简单的农田生态系统发展成为可以模拟几乎所有陆地生态…

界面开发框架Qt新手入门教程 - 可编辑树模型的示例(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 The Qt Company是Di…

考研日语-详解ている、てある、ていく、てくる用法

目录 一、ている用法 1. 表示现在状态 2. 表示持续动作 3. 表示经验或习惯 4. 表示结果或效果 二、てある用法 1. 表示已经完成的动作 2. 表示现在状态 3. 表示被动 三、ていく用法 1. 表示未来的动作 2. 表示逐渐变化的过程 四、てくる用法 1. 表示过去到现在的…

Python实现哈里斯鹰优化算法(HHO)优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

滴滴一面:BigKey问题很致命,如何排查和处理?

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如极兔、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; 致命的的Redis BigKey 如何排查&#xff0c;你处理过吗&#xff1f; 与之类似…

Yield Guild Games: RON 质押来啦!

Yield Guild Games (YGG) 自 2022 年 7 月以来一直是 Ronin 区块链的验证者&#xff0c;在保障和维护网络方面发挥着至关重要的作用。随着 2023 年 4 月委托权益证明 (DPoS) 的推出&#xff0c;质押生态系统进一步民主化&#xff0c;允许更多的参与者在赚取奖励的同时为网络的安…

LabVIEWCompactRIO 开发指南19 原始以太网(TCP/UDP)

LabVIEWCompactRIO 开发指南19 原始以太网&#xff08;TCP/UDP&#xff09; TCP和UDP是所有以太网标准的低级构建块。原始TCP和UDP工具在几乎所有编程环境中都得到原生支持&#xff0c;包括LabVIEW。它们提供较低级别的通信功能&#xff0c;这些功能更灵活&#xff0c;但用户…