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. vue vue-simple-uploader 前端的简单使用

    前言 因为项目需要上传大文件tif图,考虑使用分片上传. 1.安装 npm install vue-simple-uploader --save 2.main.js中初始化 import upload ...

  2. AcWing 4797. 移动棋子题解

    算出数值为 \(1\) 的点离 \((3, 3)\) 的距离即可. #include <iostream> #include <cstring> #include <al ...

  3. 社区活动 | “中文 AI 微小说大赛”正式开启报名!

    ️ 我们要求每位参赛选手以 LLM (大语言模型)为工具,将 AI 的能力与选手的创作才华相结合,创造出引人入胜.感人至深或充满疯狂的微小说! 无论你是首次接触 AI 工具还是资深的从业者,我们期待在 ...

  4. [Lua] IT技术熟练度生成器 | 根据IT活动记录生成md表格 | 自创

    IT技术熟练度 v1.0 为衡量个人能力水平自创的一套评分机制,根据时间.代码行数.基础理论三个变量生成.最近在学lua,正好练下基本功.效果可见 个人介绍 | 代码统计 - 小能日记 - 博客园 ( ...

  5. JOIN 关联表中 ON、WHERE 后面跟条件的区别

    SQL中join连接查询时条件放在on后与where后的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和wh ...

  6. 《SQLi-Labs》01. Less 1~5

    @ 目录 前言 索引 Less-1 题解 原理 Less-2 题解 Less-3 题解 Less-4 题解 Less-5 题解 原理 sqli.开启新坑. 前言 对于新手,为了更加直观的看到 sql ...

  7. 修复linux系统更新后Conky无法启动的问题

    kali系统更新后的版本为 ~$uname -a Linux 4rk 5.9.0-kali5-amd64 #1 SMP Debian 5.9.15-1kali1 (2020-12-18) x86_64 ...

  8. 简单聊一聊SpringBoot的约定优于配置

    Spring Boot的约定优于配置 对于今天聊的SpringBoot的约定优于配置,我打算从三个方面去展开: 1.什么是约定优于配置 1> 约定优于配置是一种软件设计的范式,其核心思想:使用一 ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (89)-- 算法导论8.3 2题

    二.用go语言,下面的排序算法中哪些是稳定的:插入排序.归并排序.堆排序和快速排序?给出一个能使任何排序算法都稳定的方法.你所给出的方法带来的额外时间和空间开销是多少? 文心一言: 在Go语言中,以下 ...

  10. Machine Learning for NetFlow Anomaly Detection With Human-Readable Annotations 笔记

    Machine Learning for NetFlow Anomaly Detection With Human-Readable Annotations 关键摘要 我们开发了一个复杂企业网络中的异 ...