Vue状态管理之使用Pinia代替Vuex
作者:rogepi 发布时间:2024-05-09 15:12:12
1、Pinia是什么
Pinia
是一个vue
的状态管理方案,是vuex
团队成员开发,实现了很多vuex5
的提案,更加地轻量化且有devtools
的支持
vuex4
一直被人诟病对于typescript
的支持不良好,vuex5
也迟迟未来
所以有了pinia的出现
相较于vuex:
pinia
无需创建复杂的包装器来支持typescript
,对于typescript
类型判断是天然支持的,享受ide带来的自动补全,减少开发的心智负担,减少vue开发过程中的面向字符串编程减去了mutations的概念,只保留
state
,getters
和anctions
三个概念,减少代码冗余无需手动添加store,创建的store会在使用时自动添加
没有模块
module
的概念,不用面对一个store下嵌套着许多模块,使用单文件store(有点类似redux/toolkit的一个reducer),可以直接导入其他store使用
Pinia文档有这么一段话:
Pinia 试图尽可能接近 Vuex 的理念。 它旨在测试 Vuex 下一次迭代的提案,并且取得了成功,因为我们目前有一个针对 Vuex 5 的开放 RFC,其 API 与 Pinia 使用的 API 非常相似。 请注意,我(Eduardo),Pania 的作者,是 Vue.js 核心团队的一员,并积极参与了 Router 和 Vuex 等 API 的设计。 我个人对这个项目的意图是重新设计使用全局 Store 的体验,同时保持 Vue 平易近人的哲学。 我让 Pania 的 API 与 Vuex 一样接近,因为它不断向前发展,以便人们可以轻松地迁移到 Vuex 或什至在未来融合两个项目(在 Vuex 下)。
所以现在学习Pinia
,相当于提前学习Vuex5就是说
2、Pinia简单上手
首先我们初始化一个vite+vue+ts工程
pnpm create vite pinia-demo -- --template vue-ts
安装pinia
pnpm i pinia
打开项目,编辑src目录下的mian.ts文件,引入Pinia
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'
createApp(App).use(createPinia()).mount('#app')
在src
目录下创建一个store
文件夹用来存放状态管理,然后新建一个counter.ts
,我们来做一个简单的计数器状态应用
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', {
state: () => {
return {
count: 0,
}
},
getters: {
doubleCount: (state) => state.count * 2,
},
actions: {
increment() {
this.count++
},
},
})
Pinia
通过defineStore
函数来创建一个store
,它接收一个id
用来标识store
,以及store
选项
我们也可以使用一个回调函数来返回options
,回调函数体内的写法类似vue
的setup()
写法,比如上面的定义可以写成
export const useCounterStore = defineStore('counter', () => {
const count = ref(0)
function doubleCount() {
return count.value * 2
}
function increment() {
count.value++
}
return { count, increment }
})
接着我们在App.vue
中使用store
<script setup lang="ts">
import { useCounterStore } from './store/counter'
const useCounter = useCounterStore()
</script>
<template>
<h2>{{ useCounter }}</h2>
<h2>{{ useCounter.count }}</h2>
<h2>{{ useCounter.doubleCount() }}</h2>
<button @click="useCounter.increment">increment</button>
</template>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
在使用Pinia
的过程中可以发现自动补全是相当优秀
浏览器运行如下:
打开开发者工具查看vue devtool
vue devtool
支持对Pinia
状态的增删改查!
Pinia有多种对状态的修改方式:
使用
actions
,如上面所示直接在状态上修改
const countPlus_1 = useCounter.count++
使用store
的$patch
函数,支持选项和回调函数两种写法,回调函数适用于状态为数组或其他之类的需要调用状态方法进行修改
const countPlus_2 = useCounter.$patch({ count: useCounter.count + 1 })
const countPlus_3 = useCounter.$patch((state) => state.count++)
对状态的结构需要使用StoreToRefs
函数
const { count } = storeToRefs(useCounter)
3、使用体验
Pinia
的学习和使用是相当友好的,看一遍官方文档就能上手,在上手过程中可以明显地感受到相对于vuex
更加快捷,编码体验优秀。
状态管理对于小项目来说更注重于方便和快捷(甚至可以不想需要),所以像vuex是稍微有些复杂了,像vue3出beta
的时候就有人说可以使用组合式api
比如provide
跟inject
配合来替代vuex
,所以Pinia
这个轻量级状态管理方案的出现是相当及时的。
来源:https://juejin.cn/post/7026283096521572366


猜你喜欢
- 客户需要一个类似 news letter 的功能,当然,内容是可编辑的,而且还要以 HTML 格式呈现给用户。这就需要在发送邮件的时候,指明
- while循环是在Python中的循环结构之一。 while循环继续,直到表达式变为假。表达的是一个逻辑表达式,必须返回一个true或fal
- 扫雷是一个非常经典的WIN游戏,我们教给大家用python语言来写出这个游戏,以下是全部实例代码:#!/usr/bin/python#cod
- 这是一个第三方库,可以处理xlsx格式的Excel文件。pip install openpyxl安装。如果使用Aanconda,应该自带了。
- python2.7中 集成了json的处理(simplejson),但在实际应用中,从mysql查询出来的数据,通常有日期格式,这时候,会报
- 本文主要介绍的是关于微信小程序利用co处理异步流程的方法教程,分享出来供大家参考学习,需要的朋友们下面来看看详细的介绍:coco是一个基于E
- 多线程到底什么是多线程?说起多线程我们首先从单线程来说。例如,我在这里看书,等这件事情干完,我就再去听音乐。对于这两件事情来说都是属于单线程
- 之前一直没弄清jsonArray和jsonObject的区别,今天终于弄明白了。jsonArray是数组,以[ ]包含数据,jsonObje
- 在实际的工作中,尤其是在生产环境里边,SQL语句的优化问题十分的重要,它对数据库的性能的提升也起着显著的作用.我们总是在抱怨机器的性能问题,
- 本文实例讲述了php动态生成版权所有信息的方法。分享给大家供大家参考。具体实现方法如下:function copyright($start,
- selenium 安装与 chromedriver安装我们前文提到,Python脚本中使用了selenium库,而selenium又通过ch
- 本文实例讲述了python使用sorted函数对列表进行排序的方法。分享给大家供大家参考。具体如下:python提供了sorted函数用于对
- 小编曾经有过这样的经历,就是在安装使用django框架时候,遇到了部分模块不能够使用,检查了很久,才发现是因为版本问题,需要重新编译安装一个
- 起步Django 是个同步框架,本文并不是 让 Django 变成异步框架。而是对于在一个 view 中需要请求多次 http api 的场
- 导言在前面的两篇教程中,我们看到了如何在单一页面中显示主/从报表, 它使用DropDownList显示主记录,使用GridView或Deta
- 使用opencv将图片转为灰度图主要有两种方法,第一种是将彩色图转为灰度图,第二种是在使用OpenCV读取图片的时候直接读取为灰度图。将彩色
- 前言检测图像中对象颜色的一种简单方法是首先将图像从 RGB 转换为 HSV 颜色空间,然后使用一系列色调检测对象,这可以通过使用 OpenC
- 目录分析问题音频url搜索urlJS代码实现分析问题音频url点入某个音乐的播放界面,通过F12-Network,分析数据,可以看到有一个i
- 每当这种情况发生的时候,我总会心里默念道:杯具啊,这辈子也装不完了。因为SQL Server的安装还是比较复杂的,要先安装.Net、Wind
- 这两副图片哪张更能勾起你买东西的欲望呢?相信大多数买家更喜欢看大图,实物图,产品细节图等.如果我们的卖家更能倾听下我们买家的心声.他们的产品