vue全家桶之状态管理Pinia

一、Pinia和Vuex的对比

1.什么是Pinia呢?

Pinia(发音为/piːnjʌ/,如英语中的“peenya”)是最接近piña(西班牙语中的菠萝)的词;

  • Pinia开始于大概2019年,最初是作为一个实验为Vue重新设计状态管理,让它用起来像组合式API(Composition API)。

  • 从那时到现在,最初的设计原则依然是相同的,并且目前同时兼容Vue2、Vue3,也并不要求你使用Composition API;

  • Pinia本质上依然是一个状态管理的库,用于跨组件、页面进行状态共享(这点和Vuex、Redux一样);

2.Pinia和Vuex的区别

那么我们不是已经有Vuex了吗?为什么还要用Pinia呢?

  • Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子,结合了 Vuex 5 核心团队讨论中的许多想法;
  • 最终,团队意识到Pinia已经实现了Vuex5中大部分内容,所以最终决定用Pinia来替代Vuex
  • 与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的仪式,提供了 Composition-API 风格的 API;
  • 最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持;

和Vuex相比,Pinia有很多的优势:

  • 比如mutations 不再存在:
    • 他们经常被认为是非常冗长;
    • 他们最初带来了 devtools 集成,但这不再是问题;
  • 更友好的TypeScript支持,Vuex之前对TS的支持很不友好;
  • 不再有modules的嵌套结构:
    • 你可以灵活使用每一个store,它们是通过扁平化的方式来相互使用的;
  • 也不再有命名空间的概念,不需要记住它们的复杂关系;

在这里插入图片描述

二、创建Pinia的Store

1.如何使用Pinia?

使用Pinia之前,我们需要先对其进行安装:

yarn add pinia
# or with npm
npm install pinia

创建一个pinia并且将其传递给应用程序:

import { createPinia } from 'pinia'const pinia = createPinia()export default pinia
import pinia from './store'createApp(App).use(pinia).mount('#app')

2.认识Store

什么是Store?

  • 一个 Store (如 Pinia)是一个实体,它会持续绑定到你组件树的状态和业务逻辑,也就是保存了全局的状态;
  • 它有点像始终存在,并且每个人都可以读取和写入的组件;
  • 你可以在你的应用程序中定义任意数量的Store来管理你的状态;

Store有三个核心概念:

  • stategettersactions
  • 等同于组件的data、computed、methods;
  • 一旦 store 被实例化,你就可以直接在 store 上访问 state、getters 和 actions 中定义的任何属性;

3.定义一个Store

定义一个Store:

  • 我们需要知道 Store 是使用 defineStore() 定义的,
  • 并且它需要一个唯一名称,作为第一个参数传递;
export const useCounter = defineStore("counter", {state() {return {counter: 0}}
})

这个 name,也称为 id,是必要的,Pinia 使用它来将 store 连接到 devtools。

返回的函数统一使用useX作为命名方案,这是约定的规范;

4.使用定义的Store

Store在它被使用之前是不会创建的,我们可以通过调用use函数来使用Store:

<template>
<div class="app">app.vue<div class="counter">counter: {{ counterStore.count }}</div>
</div>
</template><script setup>
import useCounter from './stores/counter'const counterStore = useCounter()</script>

注意Store获取到后不能被解构,那么会失去响应式:

  • 为了从 Store 中提取属性同时保持其响应式,您需要使用storeToRefs()
const counterStore = useCounter()
// 不是响应式
const { count } = counterStore
// 响应式
const { count: count1 } = toRefs(counterStore)
// 响应式
const { count: count2 } = storeToRefs(counterStore)

三、Pinia核心概念State

1.认识和定义State

state 是 store 的核心部分,因为store是用来帮助我们管理状态的。

  • 在 Pinia 中,状态被定义为返回初始状态的函数;
const useCounter = defineStore("counter", {state: () => ({counter: 0})
})

2.操作State

读取和写入 state:

  • 默认情况下,您可以通过 store 实例访问状态来直接读取和写入状态;
const counterStore = useCounter()
counterStore.count++
counterStore.name = 'codermy'

重置 State:

  • 你可以通过调用 store 上的 $reset() 方法将状态 重置 到其初始值;
const counterStore = useCounter()
counterStore.$reset()

改变State:

  • 除了直接用 store.counter++ 修改 store,你还可以调用 $patch 方法;
  • 它允许您使用部分“state”对象同时应用多个更改
const counterStore = useCounter()
counterStore.$patch({counter: 100,name: 'kobe'
})

替换State:

  • 您可以通过将其 $state 属性设置为新对象来替换 Store 的整个状态:
counterStore.$state = {counter: 1,name: 'monic'
}

四、Pinia核心概念Getters

1.认识和定义Getters

Getters相当于Store的计算属性

  • 它们可以用 defineStore() 中的 getters 属性定义;
  • getters中可以定义接受一个state作为参数的函数
const useCounter = defineStore("counter", {state: () => ({counter: 0}),getters: {doubleCounter: (state) => state.count * 2}
})

2.访问Getters

访问当前store的Getters:

const counterStore = useCounter()
counterStore.doubleCounter

Getters中访问自己的其他Getters:

  • 我们可以通过this来访问到当前store实例的所有其他属性;
doublePlusOne: function(state) {return this.doubleCounter + 1
}

访问其他store的Getters:

message: function(state) {const userStore = useUser()return this.fullname + ':' + userStore.nickname
}

Getters也可以返回一个函数,这样就可以接受参数:

const useCounter = defineStore("main", {state: () => ({users: [{id: 111, name: 'kobe', age: 19},{id: 112, name: 'james', age: 15},{id: 113, name: 'mike', age: 29},]}),getters: {getUserById: (state) => {return userId => {const user = state.users.find(item => item.id === userId)return user}}}
})

五、Pinia核心概念Actions

1.认识和定义Actions

Actions 相当于组件中的 methods。

  • 可以使用 defineStore() 中的 actions 属性定义,并且它们非常适合定义业务逻辑;
actions: {increment() {this.counter++},   
}
function add() {counterStore.increment()
} 

和getters一样,在action中可以通过this访问整个store实例的所有操作;

2.Actions执行异步操作

并且Actions中是支持异步操作的,并且我们可以编写异步函数,在函数中使用await;

import { defineStore } from 'pinia'const useHome = defineStore("home", {state: () => ({banners: [],recommends: []}),actions: {async fetchHomeMultidata() {const res = await fetch("http://xxx.xxx:8000/home/multidata")const data = await res.json()this.banners = data.data.banner.listthis.recommends = data.data.recommend.list// return new Promise(async (resolve, reject) => {//   const res = await fetch("http://xxx:8000/home/multidata")//   const data = await res.json()//   this.banners = data.data.banner.list//   this.recommends = data.data.recommend.list//   resolve("bbb")// })}}
})export default useHome
import { useHome } from './stores/home'const homeStore = useHome()
homeStore.fetchHomeMultidata().then(res => {console.log(res)
})

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS微课1000例】0102:面状要素空洞填充

文章目录 一、实验描述二、实验数据三、实验步骤1. 手动补全空洞2. 批量补全空洞四、注意事项一、实验描述 在对地理数据进行编辑时,时常会遇到面数据中存在个别或大量的空洞,考虑实际情况中空洞的数量多少、分布情况,填充空洞区域可以采用逐个填充的方式,也可以采用快速大…

【Django开发】美多商城项目第3篇:用户注册和图片验证码开发(附代码,文档已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目开发相关知识。本项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现…

构建高效直播美颜系统:美颜SDK集成与性能优化指南

如今&#xff0c;美颜技术的广泛应用成为各类直播平台的标配之一。今天&#xff0c;小编将与大家进一步讨论如何构建高效的直播美颜系统&#xff0c;重点关注美颜SDK的集成和性能优化方面。 一、美颜SDK的选择与集成 选择合适的美颜SDK是构建高效直播美颜系统的第一步。不同的…

一台机器上如何部署多个web项目

1、综述 随着计算机硬件水平的不断提高&#xff0c;往往不是一台机器上只部署一个web项目了&#xff0c;而是尽可能多部署几个项目&#xff0c;以用来节省资源&#xff0c;现在我们看看如何一台机器部署多个项目&#xff0c;我们先结合上一篇文章中提到的tomcat架构&#xff0…

美创科技与河南金融信创生态实验室签署战略合作协议

2024年1月31日&#xff0c;由普惠通科技与河南省科学院物理所、北京交通大学、中国金融电子化集团重庆金融认证中心联合发起成立中部地区第一家金融信创生态实验室运营公司&#xff08;即河南豫科普惠通信创科技有限公司&#xff09;与杭州美创科技股份有限公司战略合作签约仪式…

windows10忘记密码的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

下载已编译的 OpenCV 包在 Visual Studio 下实现快速配置

自己编译 OpenCV 挺麻烦的&#xff0c;配置需要耗费很长时间&#xff0c;编译也需要很长时间&#xff0c;而且无法保证能全部编译通过。利用 OpenCV 官网提供的已编译的 OpenCV 库可以节省很多时间。下面介绍安装配置方法。 1. OpenCV 官网 地址是&#xff1a;https://opencv…

Gas Hero Coupon NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 编译&#xff1a;mingfootprint.network 数据源&#xff1a;Gas Hero Coupon NFT Collection Dashboard Gas Hero “盖世英雄” 是一个交互式的 Web3 策略游戏&#xff0c;强调社交互动&#xff0c;并与 FSL 生态系统集成&#xff0…

深度学习之循环神经网络进阶

这一讲我们学习如何实现一个循环神经网络的分类器&#xff1a; 我们要解决的问题是名字分类&#xff0c;我们根据名字找到其对应的国家。 上一讲我们介绍了循环神经网络。 我们在处理自然语言的时候我们通常是以上这种方式&#xff0c;我们在处理单词的时候&#xff0c;通常…

Vue3快速上手(一)使用vite创建项目

一、准备 在此之前&#xff0c;你的电脑&#xff0c;需要安装node.js,我这边v18.19.0 wangdymb 2024code % node -v v18.19.0二、创建 执行npm create vuelatest命令即可使用vite创建vue3项目 有的同学可能卡主不动&#xff0c;可能是npm的registry设置的问题 先看下&#x…

【SpringBoot】策略和模板模式的思考与实践

一、应用场景 之所以会将策略和模板模式放在一起&#xff0c;是因为这两种模式用的最多最广泛&#xff0c;而且基本都是联合使用的。在开始之前&#xff0c;先复习一下模式的定义&#xff1a; 模板模式&#xff08;Template Pattern&#xff09; 模板模式是在一个抽象类中定…

day21网页布局

文章目录 块元素和行内元素列表标签表格标签媒体元素页面结构分析iframe内联框架 块元素和行内元素 块元素&#xff1a;无论内容多少&#xff0c;该元素独占一行。(p标签、h1~h6…) 行内元素&#xff1a;内容撑开宽度&#xff0c;左右都是行内元素的可以排在一行。&#xff08…