【pinia】新一代更好用的状态管理器Pinia

news/2024/11/1 18:33:25/

目录

 

一,Pinia状态管理库

1.Pinia介绍

2.Pinia的核心特性

3.核心概念

4.Pinia vs Vuex

5.Pinia & Vuex的不同

6.Pinia名字

二,Pinia基本使用

1.安装Pinia

2.配置main.ts文件

3.创建store/index.ts文件

4.使用数据

三,状态更新和Actions

四,Pinia和VueDevtools


 

一,Pinia状态管理库

1.Pinia介绍

Pinia的设计主要是服务于Composite API(组合式API)的,相当于下一带的Vuex。

因为Vuex主要是为了vue2种的选项是API服务的所以,并不适用于Vue3。当Vue3伴随着组合式API来到时,Pinia的诞生也就成为了必然,一个全新的用于 Vue的状态管理库Pinia。

在Pinia种剔除了mutations,只剩了state,actions,getters,这就省去了很多麻烦

2.Pinia的核心特性

1.Vue2&Vue3都支持

两者的API都相同,只有初始化安装和SSR配置不同

2.都支持VueDevTools

跟踪actions,mutations的时间线

可以在使用容器的组件种观察到容器的本身

支持time-travel

Vue2中不能同时使用Pinia,Vuex

3.热模块更新

修改容器时不需要重新加载

在热更新的时候保持任何现有的状态

4.支持

支持Pinia插件的使用

更好的支持TS

支持服务端渲染

3.核心概念

PiniaVuex
StateState
GettersGetters
ActionsActions
MutationsMutations

组件,每个人都可以读取和写入。它有三个核心概念Store(如 Pinia) 是一个保存状态和业务逻辑的实体,它不绑定到您的组件树。换句话说,它承载全局 state。它有点像一个始终存在的

4.Pinia vs Vuex

Pinia 试图尽可能接近 Vuex 的理念。它旨在测试 Vuex 下一次选代的提案,并且取得了成功,因为我们目前有一个针对 Vuex 5 的开放式RFC,其API与Pinia 使用的API非常相似。请注意,Pini 的作者(Eduardo)是 Vueis 核心团队的一员,并积极参与 Router 和 Vuex等API 的设计。我个人对这个项目的意图是重新设计使用全局 Store 的体验,同时保持 Vue 平易近人的哲学,我让 Pania 的 API 与Vuex 一样接近,因为它不断向前发展,使人们可以轻松地迁移到 Vuex,甚至在未来融合这两个项目(在 Vuex 下)。

从上面我们可以得到凉哥信息,Pinia可能会于Vuex融合汇总,另一个信息是,Pinia可能会重新设计走自己的发展道路

5.Pinia & Vuex的不同

1.没有 mutations。mutations 被认为是非常冗长的。最初带来了 devtools 集成,但这不再是问题 2.不再有模块的嵌套结构。您仍然可以通过在另一个 store 中导入和使用 store 来隐式嵌套 store,Pinia 通过设计提供扁平结构,同时仍然支持 store 之间的交叉组合方式。您甚至可以拥有 store 的循环依赖关系

3.更好typescript 支持。无需创建自定义的复杂包装器来支持 Typecript,所有内容都是类型化的,并且 API 的设计方式尽可能地利用 TS 类型推断。

4.不再需要注入、导入函数、调用它们,享受自动补全!

5.无需动态添加stores,默认情况下它们都是动态的,您甚至不会注意到。请注意,您仍然可以随时手动使用 store 来注册它,但因为它是自动的,所以您无需担心。

6.没有命名空间模块。鉴于 store 的扁平架构,"命名空间”store 是其定义方式所固有的,您可以说所有 stores 都是命名空间的。

6.Pinia名字

Pinia(发音/peenya/为英语)是最接近pina(西班牙语中的pineapple) 的词,它是一个有效的包名。渡萝实际上是一组独立的花朵,它们结合在一起形成多种水果。与 stores 类似,每家 store 都是独立诞生的,但最终都联系在一起。它也是一种原产于南美洲的美味热 带水果。

二,Pinia基本使用

1.安装Pinia

yarn add pinia
或者使用 npm
npm install pinia

 

2.配置main.ts文件

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
// 引入pinia
import {createPinia} from 'pinia'
// 创建实例
const pinia = createPinia()
const app =  createApp(App)
// 挂载到vue实例
app.use(pinia)
app.mount('#app')

3.创建store/index.ts文件

import {defineStore} from 'pinia'
// 定义并到处容器
export const useMainStore = defineStore('main',{state:()=>{return {name:'山鱼',age:12,issex:false}},getters:{},actions:{},
})

4.使用数据

这里直接解构这个数据,其实他并不是响应式的,所以我们要使用到pinia中的一个api(storeToRefs),使用storeToRefs解构出来的数据就是响应式的了,也可以动态的展现在页面上了。

<template><div>姓名:{{ name }}年龄:{{ age }}<p v-if="issex">性别:🚹</p><p v-else>性别:🚺</p><button @click="btnHandle1">age+1</button><button @click="btnHandle2" >姓名+~</button><button @click="btnHandle3">更换性别</button></div>
</template>
​
<script lang="ts" setup>
import { storeToRefs } from 'pinia';
import { useMainStore } from '../store/index'
const mainStore = useMainStore()
// 将数据解构()但是当前的数据并不是响应式的
// const { name, age, sex } = mainStore
​
// 我们使用storeToRefs这个API来解决响应式问题
const {name,age,issex} = storeToRefs(mainStore)
function btnHandle1(){
mainStore.age++
}
function btnHandle2(){
mainStore.name+='~'
}
function btnHandle3(){if(mainStore.issex===true){mainStore.issex = false}else{mainStore.issex = true}
​
}
</script>

三,状态更新和Actions

export const useMainStore = defineStore('main',{state:()=>{return {name:'山鱼',age:12,issex:false,list:[1,2,3,4]}},// 类似于计算属性,具有缓存功能getters:{// add10(state){//     console.log('add10被调用了');//     return state.age+100// }// 如果要在getters里面使用this,则需要手动推出返回值的类型add10():number{console.log('add10被调用了');return this.age+100}},// 类似于methods,主打业务逻辑,修改state状态actions:{chanegstate(num:number){this.name = '王多鱼',// this.age = 22this.age += num}},
})

组件中使用getters中的add10,使用了三次,但是他只调用了一次,当数据修改的时候,再次使用add10且具有数据缓存功能

        <p>{{ mainStore1.add10 }}</p><p>{{ mainStore1.add10 }}</p><p>{{ mainStore1.add10 }}</p>

四,Pinia和VueDevtools

查看pinia管理的数据

也可以直接在组件中查看,调试工具直接将pinia管理的数据映射到了组件上了


http://www.ppmy.cn/news/60520.html

相关文章

爬虫实验笔记

这里的爬虫实验害暂时没有遇到验证码等问题&#xff0c;步骤可以简单概括为&#xff1a; 1.找到爬虫必要的信息&#xff1b; 2.内容提取&#xff1b; 3.将提取到的内容保存至xlsx文件 1.找到爬虫必要的信息 以zh为例&#xff0c;首先找一个自己感兴趣的贴&#xff0c;进入开…

数据结构之队列,实现队列的增删改查

目录 一、队列的定义 二、队列的实现 1.使用链表来实现队列 2.实现队列的接口 初始化队列 void QueueInit(Queue *pq) 队尾入队列 void QueuePush(Queue *pq,QDataType data) 队头出队列 void QueuePop(Queue *pq) 获取队列头部元素 QDataType QueueFront(Queue *pq) …

java学习之异常二

目录 一、异常处理机制 一、try-catch-finally 二、throws 二、try-catch 异常处理使用细节 三、try-catch-finally练习 第一题 第二题 第三题 第四题 一、异常处理机制 共有两种异常处理机制 一、try-catch-finally 处理机制图示 二、throws 关于第二点&#xff0c;如E…

Android性能监控:主循环性能统计LooperStatsService详解

作者&#xff1a;飞起来_飞过来 简介 在Android性能监控和优化领域&#xff0c;一个会影响App性能表现的因素与Handler Message Looper机制有关。当Looper里面的Message处理不及时、或数量太多占用过多处理时间时&#xff0c;可能会出现卡顿感&#xff0c;并且不容易定位到卡顿…

苦学58天,最后就这结果......

背景 非计科大专一枚&#xff0c;当初学的机械自动化专业。大学完全可以说是玩过来的&#xff0c;临近毕业开始慌了&#xff0c;毕业后一直没能找到工作&#xff0c;在高中同学&#xff08;211 计科&#xff09;的引领下&#xff0c;入坑程序员&#xff0c;学的软件测试。 从…

Unity如何上传一个文件到服务器

在游戏开发过程中&#xff0c;有时候需要上传一些文件到远程服务器上&#xff0c;比如游戏资源文件、玩家数据等等。在Unity中&#xff0c;我们可以使用UnityWebRequest类来实现文件上传功能。本文将详细介绍Unity如何上传一个文件到服务器&#xff0c;并给出Unity与服务器的核…

Java RSA密钥转换,从RSAPrivateKey得到RSAPublicKey

概述&#xff1a; 在Java编程中&#xff0c;我们经常用到如下一段代码来生成RSA公私钥&#xff0c;分别拿到公私钥然后加解密计算&#xff1a; KeyPairGenerator keyPairGen; keyPairGen KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048, new S…

每日学术速递4.27

Subjects: cs.CV 1.End-to-End Spatio-Temporal Action Localisation with Video Transformers 标题&#xff1a;使用视频转换器进行端到端时空动作定位 作者&#xff1a;Alexey Gritsenko, Xuehan Xiong, Josip Djolonga, Mostafa Dehghani, Chen Sun, Mario Lučić, Corde…