浅尝大菠萝Pinia

1、pinia简介

Pinia(发音为 /piːnjʌ/,类似于英语中的“peenya”)是最接近有效包名 piña(西班牙语中的_pineapple_)的词。

Pinia 是由 Vue.js 团队成员开发,新一代的状态管理器,即 Vuex5.x。

特点:

  • 对 Vue 2 和 Vue 3 都有效

  • 完整的 typescript 的支持

  • 只有 state, getter 和 action ,去掉了mutations,简化状态管理库

  • actions 支持同步和异步方法修改 state 状态

  • 不再有模块嵌套,只有 Store 的概念,Store 之间可以相互调用

  • 足够轻量,压缩后的体积只有1.6kb

  • 使用插件扩展 Pinia 功能

2、使用方式

安装

npm install pinia

创建 Store

新建 src/store 目录并在其下面创建 index.js,导出 store

import { createPinia } from 'pinia'
const store = createPinia()
export default store

在 main.js 中引入并使用

import { createApp } from 'vue'
import App from './App.vue'
import store from './store'

const app = createApp(App)
app.use(store)
app.mount('#app')

3、State

store 的核心部分。 我们通常从定义应用程序的状态开始。 在 Pinia 中,状态被定义为返回初始状态的函数。 Pinia 在服务器端和客户端都可以工作。

定义state

import { defineStore } from 'pinia'

export const useUserStore = defineStore({
    id: 'user', // id必填,且需要唯一
    state: () => {
        return {
            name: '牛牛'
        }
    }
})

获取state

import {useUserStore} from "@/store/user";
const userStore = useUserStore()
const name = computed(() => userStore.name)

修改state

(1) 直接修改

userStore.name = '芳芳'

优点:最简单直接的修改方法,代码少。

缺点:只能一次修改一个,不能修改多个。全局的状态管理还是不要直接在各个组件处随意修改状态,应放于 action 中统一方法修改

(2)通过storeToRefs转为ref后修改

 const {name} = storeToRefs(userStore)
 name.value = '芳芳'

不使用storeToRefs 直接解构会失去响应式,导致修改失败

优点:可以解构store中的内容,代码也不多。

缺点:不能一次修改多个,而且还需要引入storeToRefs,比第一种方法多了一点代码。

(3)$patch

可传对象或函数

  userStore.$patch({
    name: '芳芳'
  })
// 不能直接修改原来的state,对state中的数组或对象不能增加或删除,只能创建新的对象进行赋值。
  userStore.$patch(state=>{
    state.name='芳芳'
  })
// 可以一次修改多个,可以修改原来的state,对state中的数组或对象可以使用方法修改

(4)action

action 里可以直接通过 this 访问

// store中
import { defineStore } from 'pinia'

export const useUserStore = defineStore({
    id: 'user', // id必填,且需要唯一
    state: () => {
        return {
            name: '牛牛'
        }
    },
    actions: {
        updateName(name) {
            this.name = name
        }
    }
})
// 具体使用
 userStore.updateName('芳芳')

重置state

const reset = () => {
  userStore.$reset()
}

4、Getters

等同于 Store 状态的计算值

   getters: {
        fullName1: (state) => {
            return state.name = state.name + '放大镜'
        },
        fullName2 () {
            return this.name = '芳芳放大镜'
        }
    },

5、Action

相当于组件中的 methods,适合定义业务逻辑

  • action 可以像写一个简单的函数一样支持 async/await 的语法,让你愉快的应付异步处理的场景。

  • action 间的相互调用,直接用 this 访问即可。

  • 在 action 里调用其他 store 里的 action 也比较简单,引入对应的 store 后即可访问其内部的方法了。

 changePwd(value) {
            const pwdStore = usePwdStore()
            pwdStore.changePwd(value)
            this.pwd = pwdStore.getPwd
        }

6、Plugins

由于是底层 API,Pania Store 完全支持扩展。以下是可以扩展的功能列表:

  • 向 Store 添加新状态

  • 定义 Store 时添加新选项

  • 为 Store 添加新方法

  • 包装现有方法

  • 更改甚至取消操作

  • 实现本地存储等副作用

  • 仅适用于特定 Store

Pinia 插件是一个函数,接受一个可选参数 contextcontext 包含四个属性:app 实例、pinia 实例、当前 store 和选项对象。

函数也可以返回一个对象,对象的属性和方法会分别添加到 state 和 actions 中。

export function myPiniaPlugin(context) {
  context.app // 使用 createApp() 创建的 app 实例(仅限 Vue 3)
  context.pinia // 使用 createPinia() 创建的 pinia
  context.store // 插件正在扩展的 store
  context.options // 传入 defineStore() 的选项对象(第二个参数)
  // ...
  return {
    hello: 'world', // 为 state 添加一个 hello 状态
    changeHello() { // 为 actions 添加一个 changeHello 方法
      this.hello = 'pinia'
    }
  }
}

然后使用 store.use() 将此函数传递给 pinia 就可以了

这对于添加全局对象(如路由器\ toast 管理器)很有用。

还可以在定义 store 时创建新选项,以便以后从插件中使用它们。

例如,您可以创建一个 debounce 选项,允许您对任何操作进行去抖动:

defineStore('search', {
  actions: {
    searchContacts() {
      // ...
    },
  },

  // 稍后将由插件读取
  debounce: {
    // 将动作 searchContacts 防抖 300ms
    searchContacts: 300,
  },
})

然后插件可以读取该选项以包装操作并替换原始操作:

 if (context.options.debounce) {
        // 我们正在用新的action覆盖这些action
        return Object.keys(context.options.debounce).reduce((debouncedActions, action) => {
            debouncedActions[action] = debounce(
                context.store[action],
                context.options.debounce[action]
            )
            return debouncedActions
        }, {})
    }

7、vuex

在 Vuex store(仓库)中,有4个主要组件。

1. State

这只是一个包含实际状态的对象。我们可以在开发工具中看到这个状态,如果想保留这个状态用于缓存或其他目的,也可以保存这个对象。

2. Actions

Actions 是执行异步任务的函数。它们是由关键字dispatch发起的。

Actions 通常会请求一个外部 API 或做一些其他的异步工作。它还负责调用适当的 mutation 来实际改变状态。这说明 actions 本身并没有改变状态,而是 commit 变化,让 mutation 来改变状态。

3. Mutations

Mutation 是唯一会真正同步改变状态的函数。Mutations 使用关键字commit。

4. Getters

Getters可以被认为是计算过的属性,应该被用来从状态中获得一个修改过的响应。

const store = createStore({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

8、总结

Pinia 整体来说比 Vuex 更加简单、轻量,但功能却更加强大,也许这就是它取代 Vuex 的原因吧~

参考文档

介绍 | Pinia 中文文档

大菠萝?Pinia已经来了,再不学你就out了 - 掘金

还有人没尝过 Pinia 吗,请收下这份食用指南! - 掘金

测试一下Pinia,Vuex 要出局了?_测试pinia-CSDN博客

28 vue3 Pinia修改state的三种方法(直接修改,$patch,actions)-CSDN博客

Pinia修改State的四种方式_pinia修改state数据-CSDN博客

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

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

相关文章

Godot 学习笔记(2):信号深入讲解

文章目录 前言相关链接环境信号简单项目搭建默认的信号先在label里面预制接收函数添加信号 自定义无参数信号为了做区分,我们在label新增一个函数 自定义带参数信号Button代码label代码连接信号 自定义复杂参数信号自定义GodotObject类ButtonLabel连接信号 父传子Ca…

如何查看zip文件的MD5码

目录 Windows macOS 和 Linux 要查看zip文件的MD5码,你可以使用不同的方法,具体取决于你使用的操作系统。以下是一些常见平台的指导: Windows 可以使用PowerShell来计算文件的MD5码。打开PowerShell,然后使用以下命令&#xf…

wireshark 使用实践

1、打开wireshark软件,选择网卡,开始抓包 2、打开浏览器,访问一个http网站:这里我用 【邵武市博物馆】明弘治十一年(1498)铜钟_文物资源_福建省文 测试,因为它是http的不是https,方…

基于深度学习的场景文本检测

CTPN 简介: 基于目标检测方法的文本检测模型,在Faster RCNN的基础上进行了改进,并结合双向LSTM增强了序列提取特征,通过anchor和gt的设计将文本检测任务转化为一连串小尺度文本框的检测。 解决问题: 文本长短不一&…

jenkins gradle 编译时jvm不足情况

gradle 编译时jvm不足情况 #开启线程守护,第一次编译时开线程,之后就不会再开了org.gradle.daemontrue#配置编译时的虚拟机大小org.gradle.jvmargs-Xmx2048m -XX:MaxPermSize512m -XX:HeapDumpOnOutOfMemoryError -Dfile.encodingUTF-8#开启并行编译&…

JL15-400/11过电流继电器 400A 一开一闭 380V 柜内安装JOSEF约瑟

系列型号 JL15-1.5/11电流继电器JL15-2.5/11电流继电器 JL15-5/11电流继电器JL15-10/11电流继电器 JL15-15/11电流继电器JL15-20/11电流继电器 JL15-30/11电流继电器JL15-40/11电流继电器 JL15-60/11电流继电器JL15-80/11电流继电器 JL15-100/11电流继电器JL15-150/11电流…

顺序表的动态分配基本操作

#include <stdio.h> #include <stdlib.h>// 顺序表存储空间动态分配 #define InitSize 10 // 顺序表初始长度 typedef int ElemType; // int类型重命名为ElemType&#xff0c;方便后续调整typedef struct { // 定义结构体ElemType *data; // 用静…

LeetCode 刷题 --- 快速幂

前言&#xff1a; 幂运算是一种常见的运算&#xff0c;求取a^n,最容易想到的方法便是通过循环逐个累乘&#xff0c;其复杂度为O(n)&#xff0c;这在很多时候是不够快的&#xff0c;所以我们需要一种算法来优化幂运算的过程。 快速幂&#xff0c;二进制取幂&#xff08;Binary…

Transformer的前世今生 day03(Word2Vec、如何使用在下游任务中)

前情回顾 由上一节&#xff0c;我们可以得到&#xff1a; 任何一个独热编码的词都可以通过Q矩阵得到一个词向量&#xff0c;而词向量有两个优点&#xff1a; 可以改变输入的维度&#xff08;原来是很大的独热编码&#xff0c;但是我们经过一个Q矩阵后&#xff0c;维度就可以控…

express+mysql+vue,从零搭建一个商城管理系统16--收货地址(全国省市县名称和code列表)

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建config/area.js二、新建models/address.js三、新建dao/address.js四、新建routes/address.js五、添加地址六、查询用户地址列表总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写serv…

ANOMALY TRANSFORMER: TIME SERIES ANOMALY DETECTION WITH ASSOCIATION DISCREPANCY

论文题目&#xff1a; ANOMALY TRANSFORMER: TIME SERIES ANOMALY DETECTION WITH ASSOCIATION DISCREPANCY 发表会议&#xff1a;ICLR 2022 论文地址&#xff1a;https://openreview.net/pdf?idLzQQ89U1qm_ 论文代码&#xff1a;https://github.com/thuml/Anomaly-Transforme…

七、Java中SpringBoot组件集成接入【Minio文件服务器】

七、Java中SpringBoot组件集成接入【Minio文件服务器】 1.Minio介绍2.搭建Minio服务2.1Windows部署2.2Linux部署2.3docker部署 3.Minio可视化操作4.SpringBoot接入Minio1.添加maven依赖2.yaml配置文件3.配置类4.工具类5.控制类 5.常见问题6.其他参考文章 1.Minio介绍 对象存储…

设计模式深度解析:适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼 探索设计模式的魅力&#xff1a;深入了…

Day16-【Java SE进阶】IO流(二):字符流、缓冲流、转换流、打印流、数据流、序列化流、IO框架

一. 字符流 字节流&#xff1a;适合复制文件等&#xff0c;不适合读写文本文件 字符流&#xff1a;适合读写文本文件内容 1. FileReader(文件字符输入流) 作用:以内存为基准&#xff0c;可以把文件中的数据以字符的形式读入到内存中去。读取单个字符&#xff0c;性能比较差&a…

【位运算】【 数学】【 哈希映射】2857. 统计距离为 k 的点对

本文涉及知识点 位运算 数学 哈希映射 LeetCode 2857. 统计距离为 k 的点对 给你一个 二维 整数数组 coordinates 和一个整数 k &#xff0c;其中 coordinates[i] [xi, yi] 是第 i 个点在二维平面里的坐标。 我们定义两个点 (x1, y1) 和 (x2, y2) 的 距离 为 (x1 XOR x2) …

PMP备考心得 | 策略与技巧大揭秘

1.理解考试大纲&#xff1a;首先&#xff0c;你需要熟悉PMP考试的内容和结构。PMI官网提供了详细的考试大纲&#xff0c;包括项目管理的五个过程组&#xff08;启动、规划、执行、监控、收尾&#xff09;和十个知识领域&#xff1b; 2.制定学习计划&#xff1a;根据个人的时间…

【C语言】基本语法知识C语言函数操作符详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;C语言_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.基本语法 1.1 代码解释 1.1.1 main()主函数 1.1.2 int 1.1.3 { } 1.1.4 printf()库函数 1.1.5 stdio.h头文件 1.2 C语言的…

突破边界:Web3开启数字化社会的新纪元

引言 随着科技的不断进步和数字化社会的发展&#xff0c;Web3正逐渐成为了人们关注的焦点。作为新一代互联网的演进形态&#xff0c;Web3具有突破传统边界、实现去中心化的特点&#xff0c;被认为将开启数字化社会的新纪元。本文将深入探讨Web3的概念、特点、应用场景&#xf…

VueUse常见方法使用

npm i vueuse/core 1、useDebounceFn 节流防抖 import { useDebounceFn } from vueuse/core<button type"button" class"search" click"query">查询</button>// 查询 获取table数据const query2 async () > {try {const res …

MySQL 多表查询强化练习

环境准备 create table dept(id int PRIMARY KEY,dname VARCHAR(50),loc VARCHAR(50) ); insert into dept values (10,研发部,北京), (20,学工部, 上海), (30,销售部,广州 ), (40,财务部,深圳);create table job(id int PRIMARY KEY,jname VARCHAR(20),descripition VARCHAR(…