Pinia

Pinia是西班牙语piña(西班牙语中的“菠萝”)单词的形似。

它是一个状态管理的库,用于跨组件、页面进行状态共享(这点和Vuex、Redux一样),同时兼容Vue2、Vue3,也并不要求你使用Composition API;

Pinia开始于大概2019年,最初是作为一个实验,目的为了探索 Vuex 的下一次迭代会是什么样子,所以它结合了 Vuex 5 核心团队讨论中的许多想法,为Vue重新设计状态管理,让它用起来像组合式API(Composition API)。

最终,团队意识到Pinia已经实现了Vuex5中大部分内容,所以最终决定用Pinia来替代Vuex;

与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的仪式,提供了 Composition-API 风格的 API;

最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持;

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

  • 比如mutations 不再存在;
  • 更友好的TypeScript支持,Vuex之前对TS(TypeScript)的支持很不友好;
  • 不再有modules的嵌套结构,
  • 也不再有命名空间的概念。

01. 安装Pinia

npm install pinia

或者:

yarn add pinia

02. 案例入门

目录结构。

与vuex类似,对于pinia的使用,编程习惯上一般创建“stores”文件夹。

也常见取名为“pinia”。

在index.js文件中,创建一个全局的pinia实例。

import {createPinia} from 'pinia'

const pinia = createPinia()

export default pinia

创建好之后,在全局的main.js文件中,使用这个实例。

import {createApp} from 'vue'  // 不支持template选项
// import {createApp} from 'vue/dist/vue.esm-browser' // 支持template选项
import App from './App.vue'
import pinia from './stores/index' createApp(App).use(pinia).mount('#app')

对于业务逻辑,可以根据模块的不同,将需要管理的state抽离,建立单独的文件,比如counter.js。

定义一个Store:

Store 是使用 defineStore() 定义的,

它需要一个唯一名称,作为第一个参数传递;第二个参数为具体的对象。

defineStore返回的是一个函数,在命名上,统一使用useX作为命名方案,这是约定的规范。

使用defineStore定义的store,默认会与创建的全局pinia关联,可以在组件中直接调用,无需其他操作。

import {defineStore} from 'pinia'

// defineStore第一个参数为name,也称为id,是必传参数。唯一标识Store
const useCounter = defineStore('counter',{
state:()=>({
count:99
})
}) export default useCounter

HomeCom.vue

<template>
<h1>Home Page</h1> <!-- 注意这里与vuex不同 -->
<p>Home中的count计数:{{counterStore.count}}</p>
<button @click="addCount">count+1</button>
</template> <script setup>
import useCounter from '@/stores/counter'
import {toRefs} from "vue";
import {storeToRefs} from "pinia"; // 执行函数,拿到Store
const counterStore = useCounter() // pinia支持直接修改state,不必像vuex那样commit一个mutation
function addCount(){
counterStore.count++
} // 需要注意的是,直接对Store进行解构,会失去响应式
// const {count} = counterStore // 保留响应式,可以使用vue提供的方法
// const {count} = toRefs(counterStore) // 保留响应式,pinia也专门提供了一个方法
const {count} = storeToRefs(counterStore)
</script> <style scoped> </style>

03. Store

在应用程序中,可以定义任意数量的Store来管理应用程序的状态,

Store有三个核心概念:state、getters、actions;

类似于组件的data、computed、methods;

Store在它被使用之前是不会创建的,使用defineStore函数定义Store时,返回的是一个函数,

调用这个函数,才会创建对应的 store 。

编程习惯:定义Store时,一般以useX的形式。

04. State

对于state,pinia支持直接修改,不同像vuex那样通过mutation。

pinia也支持一次性修改多个state,用 Store.$patch() ,传入一个对象。

对于Store的内部方法,以$开头。

pinia支持直接替换state对象和重置对象。

stores/user.js:

import { defineStore } from 'pinia'

const useUser = defineStore("user", {
state: () => ({
name: "Mark",
age: 18,
score: 100
})
}) export default useUser

Home.vue

<template>
<div class="home">
<h2>Home View</h2>
<h2>name: {{ name }}</h2>
<h2>age: {{ age }}</h2>
<h2>level: {{ score }}</h2>
<button @click="changeState">修改state</button>
<button @click="resetState">重置state</button>
</div>
</template> <script setup>
import useUser from '@/stores/user'
import { storeToRefs } from 'pinia'; const userStore = useUser()
const { name, age, score } = storeToRefs(userStore) function changeState() {
// 1.一个个修改状态
// userStore.name = "kobe"
// userStore.age = 20
// userStore.score = 200 // 2.一次性修改多个状态
// userStore.$patch({
// name: "james",
// age: 35
// }) // 3.替换state为新的对象
const oldState = userStore.$state
userStore.$state = {
name: "curry",
score: 200
}
console.log(oldState === userStore.$state) // true。pinia这个功能并不是真的直接替换。
} function resetState() {
userStore.$reset()
} </script>

05. Getters

Getters相当于Store的计算属性:

  • 用 defineStore() 中的 getters 属性定义;

  • getters中可以定义接受一个state作为参数的函数;


counter.js:

// 定义关于counter的store
import { defineStore } from 'pinia' import useUser from './user' const useCounter = defineStore("counter", {
state: () => ({
count: 99,
subjects: [
{ id: 111, name: "语文" },
{ id: 112, name: "英语" },
{ id: 113, name: "数学" },
]
}),
getters: {
// 1.基本使用
doubleCount(state) {
return state.count * 2
},
// 2.一个getter引入另外一个getter
doubleCountAddOne() {
// this是store实例
return this.doubleCount + 1
},
// 3.getters也支持返回一个函数
getFriendById(state) {
return function(id) {
for (let i = 0; i < state.subjects.length; i++) {
const subject = state.friends[i]
if (subject.id === id) {
return subject
}
}
}
},
// 4.getters中用到别的store中的数据
showMessage(state) {
// 1.获取user信息
const userStore = useUser() // 2.获取自己的信息 // 3.拼接信息
return `name:${userStore.name}-count:${state.count}`
}
},
}) export default useCounter

06. Actions

Actions 相当于组件中的 methods。

  • 使用 defineStore() 中的 actions 属性定义。

一般网络请求相关的state管理(异步操作),就使用action完成。

import { defineStore } from 'pinia'

const useHome = defineStore("home", {
state: () => ({
banners: [],
recommends: []
}),
actions: {
async fetchHomeMultidata() {
const res = await fetch("http://123.207.32.32:8000/home/multidata")
const data = await res.json() this.banners = data.data.banner.list
this.recommends = data.data.recommend.list // return new Promise(async (resolve, reject) => {
// const res = await fetch("http://123.207.32.32: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

Vue06-Pinia的更多相关文章

  1. 轻量级状态管理库Pinia试吃

      最近连续看了几个GitHub上的开源项目,里面都用到了 Pinia 这个状态管理库,于是研究了一下,发现确实是个好东西!那么,Pinia 的特点: 轻量化 -- Pinia 体积约1KB,十分轻巧 ...

  2. 简单了解一下pinia的结构

    随着 Vue3 的正式转正,Pinia 也渐渐火了起来.所以要更新一下自己的知识树了.这里主要是看看新的状态是什么"形态". 状态的容器还是"reactive" ...

  3. 在Vue3项目中使用pinia代替Vuex进行数据存储

    pinia是一个vue的状态存储库,你可以使用它来存储.共享一些跨组件或者页面的数据,使用起来和vuex非常类似.pina相对Vuex来说,更好的ts支持和代码自动补全功能.本篇随笔介绍pinia的基 ...

  4. vue下一代状态管理Pinia.js 保证你看的明明白白!

    1.pinia的简单介绍 Pinia最初是在2019年11月左右重新设计使用Composition API的 Vue 商店外观的实验. 从那时起,最初的原则相同,但 Pinia 适用于 Vue 2 和 ...

  5. 结合 Vuex 和 Pinia 做一个适合自己的状态管理 nf-state

    一开始学习了一下 Vuex,感觉比较冗余,就自己做了一个轻量级的状态管理. 后来又学习了 Pinia,于是参考 Pinia 改进了一下自己的状态管理. 结合 Vuex 和 Pinia, 保留需要的功能 ...

  6. 一文解析Pinia和Vuex,带你全面理解这两个Vue状态管理模式

    Pinia和Vuex一样都是是vue的全局状态管理器.其实Pinia就是Vuex5,只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia. 本文将通过Vue3的形式对两者的不同实现方式进行 ...

  7. pinia 入门及使用

    自上月从上海结束工作回来 在家闲来无事 想写点东西打发时间 也顺便学习学习新的技术.偶然发现了 pinia 据说比vuex好用些 所以便搭了个demo尝试着用了下 感觉确实不错,于是便有了这篇随笔. ...

  8. 基于 vite 创建 vue3 全家桶项目(vite + vue3 + tsx + pinia)

    vite 最近非常火,它是 vue 作者尤大神发布前端构建工具,底层基于 Rollup,无论是启动速度还是热加载速度都非常快.vite 随 vue3 正式版一起发布,刚开始的时候与 vue 绑定在一起 ...

  9. 使用Vite快速构建Vue3+ts+pinia脚手架

    一.前言 vue3的快速更新,很多IT发展快的地区在22开始都已经提上日程,小编所在的青岛好像最近才有点风波.vue3的人才在青岛还是比较稀缺的哈,纯属小编自己的看法,可能小编是个井底之蛙!! vue ...

  10. vue3中pinia的使用总结

    pinia的简介和优势: Pinia是Vue生态里Vuex的代替者,一个全新Vue的状态管理库.在Vue3成为正式版以后,尤雨溪强势推荐的项目就是Pinia.那先来看看Pinia比Vuex好的地方,也 ...

随机推荐

  1. 论文解读(DWL)《Dynamic Weighted Learning for Unsupervised Domain Adaptation》

    [ Wechat:Y466551 | 付费咨询,非诚勿扰 ] 论文信息 论文标题:Dynamic Weighted Learning for Unsupervised Domain Adaptatio ...

  2. ois七层模型与数据封装过程

    一,ois七层模型 一,ois七层模型1 为什么要分层2 七层模型3 七层总结二,协议,端口,的作用2.1协议作用2.2tcp/udp的区别2.3ARP 协议的作用2.4客户端与服务端的作用2.5ic ...

  3. vscode+gdb 配置

    到这个网址下载 mingw c语言环境 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ 我是windows64 位,直接下载这个 ...

  4. struct(C# 参考)

    struct 类型是一种值类型,通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征. 下面的示例显示了一个简单的结构声明. 1 public struct Book 2 { 3 public ...

  5. MacOS系统(M1/M2)安装AI绘画StableDiffusion保姆级教程

    安装完成后,推荐阅读这篇教程:AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通 实操环境: macOS 13 Arm64(建议12以上的系统使用) Apple M1 先来看几个样 ...

  6. Midjourney的一些学习心得:如何高效的图生图

    注意本文没有什么长篇大论,全部是自己的学习心得. 心得体会:如何图生图 今天在一篇midjourney看到好图应该怎么抄. 相信经常会看到好图也想要的,但是要么抄不出感觉,要么抄过来把水印也抄了,这一 ...

  7. 初识Redis与桌面客户端

    Redis介绍 什么是Redis Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. Redi ...

  8. 如何用PHP写接口

    当用PHP编写API接口时,可以使用PHP中的框架(如Laravel.Symfony.CodeIgniter等)来简化开发过程.接下来,以使用Laravel框架为例,提供一个简单的示例代码: 首先,确 ...

  9. Haproxy搭建 Web 群集实现负载均衡

    Haproxy搭建 Web 群集实现负载均衡 1 Haproxy HAProxy是可提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,是免费.快速并且可靠的一种解决方案.HAProxy非常适用 ...

  10. 「Semigroup と Monoid と Functional と」

    一个被国内 oi 环境弱化至几乎不存在的概念,不过我觉得还是有学一学的必要.因为我没学过代数结构所以大部分内容都在开黄腔,欲喷从轻. Semigroup 的定义是,\(\forall a,b\in\m ...