浅尝大菠萝Pinia

news2024/11/24 3:10:55

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博客

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

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

相关文章

C语言-----冒泡排序

今天,让我们来学习一下C语言中一个简单的排序算法------冒泡排序。 什么是冒泡排序呢? 冒泡排序是C语言中一个可以将一个数组的内容按照升序或者降序进行重新排列的算法。简单来说,是一种排序的思维。 冒泡排序的核心思想:让同…

MS2574/2574T/2574S高速、四通道差动线路驱动器

品简述 MS2574/MS2574T/MS2574S 是一款高速、低功耗的四通道 差动线路驱动芯片,用于平衡或非平衡的数字数据传输。可 以满足 ANSI TIA/EIA-422-B 和 ITU (原 CCITT )建议 V.11 的要求。 三态输出可提供用于驱动双绞线或平行双线传输线路等…

【面试精讲】深克隆和浅克隆的实现方式?深克隆和浅克隆有什么区别?

【面试精讲】深克隆和浅克隆的实现方式?深克隆和浅克隆有什么区别? 目录 本文导读 一、浅克隆(Shallow Clone) 二、深克隆(Deep Clone) 1、递归使用clone()方法实现深克隆 2、使用序列化实现深克隆 …

程序员思维之新机遇面前如何选择

你会不会因为 AI 的爆火,焦虑 AI 会替代自己的工作,焦虑其他人躬身入局把你淘汰。 我有过,甚至想全部精力都去学习 ChatGPT、Stable diffusion 、 Midjourney,每新出来一款大语言模型就想预约体验,那段时间像是无头的…

【复现】某指挥调度管理平台 SQL注入漏洞_66

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设备、维护人员和工作任务等。用户可以通过该平台发送指令…

代码随想录算法训练营Day52 ||leetCode 300.最长递增子序列 || 674. 最长连续递增序列 || 718. 最长重复子数组

300.最长递增子序列 class Solution { public:int lengthOfLIS(vector<int>& nums) {if (nums.size() < 1) return nums.size();vector<int> dp(nums.size(), 1);int result 0;for (int i 1; i < nums.size(); i) {for (int j 0; j < i; j) {if (…

概率基础——逻辑回归多分类法

概率基础——逻辑回归多分类法 逻辑回归是一种经典的分类算法&#xff0c;通常用于解决二分类问题。然而&#xff0c;在实际应用中&#xff0c;我们经常会遇到多分类任务。本文将简单介绍逻辑回归的理论、多分类方法以及优缺点&#xff0c;并提供一个Python实现的示例。 逻辑…

2 使用GPU理解并行计算

2.1 简介 本章旨在对并行程序设计的基本概念及其与GPU技术的联系做一个宽泛的介绍。本章主要面向具有串行程序设计经验&#xff0c;但对并行处理概念缺乏了解的读者。我们将用GPU的基本知识来讲解并行程序设计的基本概念。 2.2 传统的串行代码 绝大多数程序员是在串行程序占据…

3.6 条件判断语句cmp,je,ja,jb及adc、sbb指令

汇编语言 1. adc指令 adc是带进位加法指令&#xff0c;它利用了CF位上记录的进位值指令格式&#xff1a;adc 操作对象1&#xff0c;操作对象2功能&#xff1a;操作对象1 操作对象1 操作对象2 CF例如&#xff1a;adc ax,bx&#xff0c;实现的功能是&#xff1a;ax ax bx …

利用JS实现网页全自动翻译

由于谷歌翻译退出内地市场&#xff0c;可能导致谷歌浏览器默认提供的网页全文翻译在内地无法使用。今天我向大家推荐一个简洁的解决方案&#xff1a;只需两行 JavaScript 代码&#xff0c;即可实现 HTML 的全自动翻译&#xff0c;而无需修改页面、配置语言文件或使用 API 密钥。…

eth uniswap 套利交易案例四

交易hash: 0x085843b47c0d1b0f820b80c166ea8dd2e3928876fb353d107e49dcf879cf8426 交易时间&#xff1a; 2024.02.29 获利&#xff1a; 196,284刀 balancer 借了 338个 weth&#xff0c; 然后和 0x3BA6A019eD5541b5F5555d8593080042Cf3ae5f4 交易用 282个weth 换了293个wste…

什么是状态压缩DP???

1. 引言 相信大家已经对普通的01背包或者其他背包问题已经很熟练了&#xff0c;但是有时候我们去解决NP问题&#xff08;指数级别的复杂度&#xff0c;比如N&#xff01;&#xff09;&#xff0c;时间复杂度就会非常之大 所以&#xff0c;这个时候我们需要寻找更加优化的方法…

微信小程序调试、断点调试

1、wxml 查看对应的页面组件 2、console面板可以用来打印信息 3、sources 用来断点调试 4、network面板用来调试接口 5、storage面板 可以查看每个key对应的value内容&#xff0c;这些数据在用户使用小程序时被持久化保存在本地。

Java基础之多线程

多线程 一、多线程的创建1.1 方式一 继承Thread类1.2 方式二 实现Runnable接口1.3 方式二的化简(匿名内部类)1.4 实现Callable接口(JDK5新增)1.5 小节 二、Thread常用API2.1 获取当前线程对象2.2 获取/设置线程名称2.3 Thread的构造器2.4 Thread类的线程休眠方法2.5 小节 三、线…

3 CUDA硬件概述

3.1 PC 架构 首先&#xff0c;我们看看当下许多PC中都使用的酷睿2(Core2)处理器的典型架构&#xff0c;然后分析一下它是如何影响我们使用GPU 加速器的(如图 3-1所示)。 图3-1典型的酷睿2(Core2)系列处理器的结构图 由于所有的 GPU 设备都是通过 PCI-E(Peripheral Communicat…

【教程】如何自制一个ArcGIS工具箱

ArcGIS已经提供了十分丰富的工具箱&#xff0c;但是如果遇到一些需要批处理或者需要将多个工具箱组合使用&#xff0c;就需要根据需求自制一个ArcGIS的工具箱。 下面介绍一下如何自制一个ArcGIS/ArcGIS Pro工具箱&#xff0c;主要是使用ArcPy和模型构建器。 使用模型构建器 使…

给计算机专业学生的建议

如果条件允许&#xff0c;推荐尝试考研。虽然研究生学历的价值在一定程度上有所下降&#xff0c;但计算机专业研究生的发展前景通常优于本科生。如果决定考研&#xff0c;应尽力提高自己的学校等级。比赛成绩对于求职帮助有限&#xff0c;除非是含金量高的比赛&#xff0c;通常…

隐语笔记1 —— 数据可信流通,从运维信任到技术信任

数据可信流通体系 关于可信的反思 信任是涉及交易或交换关系的基础 信任的基石&#xff1a; 身份可确认利益可依赖能力有预期行为有后果 数据流通中的不可信风险&#xff1a;可信链条失效&崩塌 法规层面&#xff1a;数据的持有权&#xff0c;加工权&#xff0c;经营权…

FPGA学习_时序约束以及VIVADO时序报告

文章目录 前言时序约束的目的一、时序约束种类1、约束主时钟2、约束衍生时钟3、约束虚拟时钟4、input delay5、output delay6、约束异步时钟组7、约束互斥时钟8、假路径约束9、多周期约束 二、VIVADO时序报告三、从时序的角度看为什么寄存器赋值慢一拍 前言 一边学习一边补充当…

Unity Toggle与Toggle Group的妙用

Toggle与Toggle Group结合使用&#xff0c;妙处多多。 因为在同一Toggle Group内只有一个Toggle可以被选中&#xff0c;那么对于我们要创建单选按钮组、游戏的一些开关、暗夜模式、筛选不同显示内容等功能都非常好用。 比如我要实现通过点击不同按钮,从而筛选显示不同内容&am…