一盏茶的时间,带你轻松上手Pinia

🎬 岸边的风:个人主页

 🔥 个人专栏 :《 VUE 》 《 javaScript 》

⛺️ 生活的理想,就是为了理想的生活 !

目录

 📚 前言

📘 创建 Pinia

📘 Option Store

📘 Pinia 提供多种选项配置 Store:

🍍 state

🍍 getters

🍍 actions

🍍 persist

📘 使用 Store

🍍 读取状态

🍍调用 Actions

🍍 多个 Store

📘 Setup Store

📘 数据持久化

📘 Pinia 插件

📘 购物车示例

📘 Pinia 插件

📘 实现一个持久化插件

📚  写在最后


 📚 前言

 

Pinia,让状态管理再无难题!

作为Vue.js官方推荐的新星级管理库,Pinia为开发者带来前所未有的顺滑体验。你还在为复杂难懂的状态管理代码头疼吗?别急,用Pinia你可以告别一切烦恼!

本指南将为您还原Pinia的奥秘,您将掌握它独特的简洁API使用技巧,迅速成为状态管理的专家级大师!无论您是新手还是老鸟,这里的专业指导将助您在项目中如虎添翼,以最轻松的姿态管理复杂应用状态。

快来 Reshape Your State Management Skills吧!我们一起领略 Pinia的魅力!

📘 创建 Pinia

main.js 中导入 createPinia 并使用:

import { createApp } from 'vue'
import { createPinia } from 'pinia'const pinia = createPinia()
const app = createApp(App)app.use(pinia)

可以通过 app.config.globalProperties.$pinia 访问 Pinia 实例。

📘 Option Store

Vue 的选项式 API 类似,我们也可以传入一个带有 stateactions 与 getters 属性的 Option 对象(废弃了Mutations

使用 defineStore API 定义 Store:

import { defineStore } from 'pinia'export const useMainStore = defineStore('main', {// statestate: () => {return {counter: 0}},// gettersgetters: {doubleCount(state) {return state.counter * 2}},// actionsactions: {increment() {this.counter++ }}
})
  • 接收唯一 ID 作为第一个参数

  • state、getters、actions 定义方式与 Vue 组件类似

  • 可以直接通过 this 访问状态

📘 Pinia 提供多种选项配置 Store:

🍍 state

📟 定义响应式状态:

state: () => {return {count: 0}
} 

必须是一个返回状态对象的函数。

🍍 getters

📟 定义 getter 计算属性:

getters: {double(state) {return state.count * 2}
}

📟 getter 可以接收参数:

getters: {getMessage(state) {return (name = 'Vue') => `Hello ${name}` }
}

🍍 actions

📟 定义方法修改状态:

actions: {increment(amount = 1) {this.count += amount}
}

📟 actions 支持同步和异步操作。

🍍 persist

📟 配置数据持久化,需要使用插件:

persist: {enabled: true,strategies: [{key: 'my_store',storage: localStorage,},]
} 

📘 使用 Store

📟 通过 useXxxStore() 获取 Store 实例:

import { useMainStore } from '@/stores/main'export default {setup() {const main = useMainStore()main.increment()} 
}

📟 读取状态、调用 actionsVue 组件。

🍍 读取状态

// 直接读取
const count = main.count// 通过计算属性
const double = computed(() => main.doubleCount)// 通过 storeToRefs
const { count } = storeToRefs(main)

🍍调用 Actions

main.increment()const message = main.getMessage('Vue')

🍍 多个 Store

📟 可以拆分多个 Store 管理不同模块状态:

stores
|- user.js
|- product.js

📟 单独导出每个 Store 并在组件中使用:

import { useUserStore } from '@/stores/user'
import { useProductStore } from '@/stores/product' export default {setup() {// ...}
}

📟 Store 可以互相引用:

// userStore.js
import { useProductStore } from './product'export const useUserStore = defineStore({// 可以直接使用 productStore
})

📘 Setup Store

🍍 个人比较倾向这种语法

也存在另一种定义 store 的可用语法。与 Vue 组合式 API 的 setup 函数 相似,我们可以传入一个函数,该函数定义了一些响应式属性和方法,并且返回一个带有我们想暴露出去的属性和方法的对象。

export const useCounterStore = defineStore('counter', () => {const count = ref(0)function increment() {count.value++}return { count, increment }
})

🍍 在 Setup Store 中:

  • ref() 就是 state 属性

  • computed() 就是 getters

  • function() 就是 actions

Setup store 比 Option Store 带来了更多的灵活性,因为你可以在一个 store 内创建侦听器,并自由地使用任何组合式函数。不过,请记住,使用组合式函数会让 SSR 变得更加复杂。

📘 数据持久化

📟 Pinia 默认状态不持久化,可以通过插件实现持久化:

npm install pinia-plugin-persistedstate
import persistedState from 'pinia-plugin-persistedstate'const pinia = createPinia()
pinia.use(persistedState) 

📟 在 Store 中配置 persist:

export const useUserStore = defineStore({persist: {enabled: true} 
}) 

📟 配置 storage 指定存储位置:

persist: {storage: sessionStorage
}

📘 Pinia 插件

Pinia 生态已有许多插件,可以扩展更多功能:

  • pinia-plugin-persistedstate:数据持久化

  • pinia-plugin-debounce:防抖修改状态

  • pinia-plugin-pinia-observable:转换成 Observable

📟 使用插件:

import piniaPluginPersist from 'pinia-plugin-persist'pinia.use(piniaPluginPersist)

📟 Devtools

Pinia支持Vue devtools

📘 购物车示例

📟 我们来通过一个购物车的例子看看 Pinia 的用法:

// store.js
import { defineStore } from 'pinia'export const useCartStore = defineStore('cart', {state: () => {return {items: []  }},getters: {total(state) {return state.items.reduce((total, item) => {return total + item.price  }, 0)}},actions: {addItem(item) {this.items.push(item)},removeItem(id) {this.items = this.items.filter(i => i.id !== id)}}
})

📟 在组件中使用:

// Cart.vueimport { useCartStore } from '@/stores/cart'setup() {const cart = useCartStore()return {items: cart.items,total: cart.total}
}

可以看出代码非常简洁直观。

📘 Pinia 插件

Pinia 插件是一个函数,可以选择性地返回要添加到 store 的属性。它接收一个可选参数,即 context

export function myPiniaPlugin(context) {context.pinia // 用 `createPinia()` 创建的 pinia。 context.app // 用 `createApp()` 创建的当前应用(仅 Vue 3)。context.store // 该插件想扩展的 storecontext.options // 定义传给 `defineStore()` 的 store 的可选对象。// ...
}

然后用 pinia.use() 将这个函数传给 pinia

pinia.use(myPiniaPlugin)

插件只会应用于「在 pinia 传递给应用后」创建的 store,否则它们不会生效。

📘 实现一个持久化插件

  • getStorage 函数:根据提供的 key 从本地存储中读取数据。如果数据无法解析或不存在,则返回 null

  • setStorage 函数:将提供的值转换为 JSON 格式,并以指定的 key 保存到本地存储中。

  • DEFAULT_KEY 常量:表示默认的本地存储键名前缀。如果在选项中未提供自定义键名,将使用该默认键名。

  • Options 类型:定义了插件选项对象的类型,包含 key(本地存储键名前缀)和 needKeepIds(需要进行持久化的 Pinia 存储的 ID 数组)两个可选属性。

  • piniaPlugin` 函数:这是主要的插件函数,它接收一个选项对象,并返回一个用于处理 Pinia 存储的函数。

import { PiniaPluginContext } from "pinia";
import { toRaw } from "vue";// Get data from local storage by key
export function getStorage(key) {const data = localStorage.getItem(key);try {return JSON.parse(data);} catch (error) {return null;}
}// Set data to local storage with a key
export function setStorage(key, value) {const data = JSON.stringify(value);localStorage.setItem(key, data);
}const DEFAULT_KEY = "pinia";type Options = {key?: string;needKeepIds?: string[];
};const piniaPlugin = ({ key = DEFAULT_KEY, needKeepIds = [] }: Options) => {return (context: PiniaPluginContext) => {const { store } = context;const data = getStorage(`${key}-${store.$id}`);const subscribeToStore = () => {if (needKeepIds.length === 0 || needKeepIds.includes(store.$id)) {setStorage(`${key}-${store.$id}`, toRaw(store.$state));}};store.$subscribe(subscribeToStore);return {...data,};};
};export default piniaPlugin;

📚  写在最后

PiniaVue.js的新一代状态管理解决方案,由Vue核心团队开发,其设计理念简洁直观,易于上手使用。相较于Vuex,Pinia解决了其过于复杂的问题,提供了更符合Vue理念的状态管理方式

Pinia通过组合式Store结构,实现了状态、获取器、操作行为的逻辑分离。开发者可以轻松地创建Store模块,在Vue组件内直接使用$store语法访问状态,无需导入映射函数,语法非常简洁。同时Pinia还提供了完整的TypeScript支持,可以为State、Getters、Actions添加类型检测。

除此之外,Pinia还有模块热更新,无需重载页面即可看到状态变更,开发调试体验更佳。同时支持Vue DevTools进行调试,也提供插件机制等拓展功能。总的来说,Pinia是一个非常轻量、易于理解和使用的状态管理方案,可以极大地提升Vue项目的开发效率。它是Vue生态中简洁高效管理状态的首选解决方案。

 

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

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

相关文章

k8s pod启动报错: no route to host

k8s pod kuboard启动报错 查看pod命令 kubectl get pods -A kubectl get pods --all-namespaces查看报错pod日志 命令: kubectl logs -f -n namespace nametime"2023-08-09T13:40:3608:00" levelerror msg"不能获取 AgentEndpointsGet \"http:/…

【算法基础20-单调栈】

算法原理: 用单调递增栈,当该元素可以入栈的时候,栈顶元素就是它左侧第一个比它小的元素。 以:3 4 2 7 5 为例,过程如下: 动态模拟过程 题目: 给定一个长度为 N 的整数数列,输出每个数左边第一…

postman入门基础 —— 接口测试流程

一、编写接口测试计划 接口测试计划和功能测试计划目标一致,都是为了确认需求、确定测试环境、确定测试方法,为设计测试用例做准备,初步制定接口测试进度方案。一般来说,接口测试计划包括概述、测试资源、测试功能、测试重点、测试…

抖音小程序实现less语言编译样式

1.在抖音开发工具中搜索扩展less 2. 然后点击小齿轮选择扩展设置 3. 然后在扩展设置中选择在settings.json中编辑# 4. 在settings.json中加入以下这段代码即可 // Easy LESS配置"less.compile": {"compress": false,//是否压缩"sourceMap": fal…

EndNote 21 for Mac(文献管理软件) v21.0.1中文版

EndNoter mac是一款参考文献管理软件,旨在帮助学术研究者、学生和专业人士有效地管理和引用参考文献。该软件提供了许多功能,使用户可以轻松地组织、搜索和引用各种类型的文献。 EndNoter mac软件特点和功能 1. 参考文献管理:EndNoter允许用…

提高 After Effects 效率的 40 个最佳快捷键

After Effects 是运动图形和视觉效果的强大工具,但它也可能让人不知所措。拥有如此多的特性和功能,很容易让人迷失在软件中。但是,有一种方法可以简化您的工作流程并提高工作效率 - 使用键盘快捷键。 After Effects素材文件巨大、占用电脑内…

探索自动化网页交互的魔力:学习 Selenium 之旅【超详细】

"在当今数字化的世界中,网页自动化已经成为了不可或缺的技能。想象一下,您可以通过编写代码,让浏览器自动执行各种操作,从点击按钮到填写表单,从网页抓取数据到进行自动化测试。学习 Selenium,这一功能…

Claude 2、ChatGPT、Google Bard优劣势比较

​Claude 2: 优势:Claude 2能够一次性处理多达10万个tokens(约7.5万个单词)。 tokens数量反映了模型可以处理的文本长度和上下文数量。tokens越多,模型理解语义的能力就越强)。它在法律、数学和编码等多个…

一百五十二、Kettle——Kettle9.3.0本地连接Hive3.1.2(踩坑,亲测有效)

一、目的 由于先前使用的kettle8.2版本在Linux上安装后&#xff0c;创建共享资源库点击connect时页面为空&#xff0c;后来采用如下方法&#xff0c;在/opt/install/data-integration/ui/menubar.xul文件里添加如下代码 <menuitem id"file-openZiyuanku" label&…

layui的基本使用-日期控件的业务场景使用入门实战案例一

效果镇楼&#xff1b; 1 前端UI层面&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

Shell函数调用

定义一个函数&#xff0c;计算所有参数的和&#xff1a; #!/bin/bashfunction getsum(){local sum0for n in $do((sumn))donereturn $sum }getsum 10 20 55 15 #调用函数并传递参数 echo $?运行结果&#xff1a; 100

spss--数据分析Log-Binonial模型

在横断面研究中&#xff0c;Log-binomial 模型能够获得研究因素与结局变量的关联强度指标患病率比&#xff08;PR&#xff09;&#xff0c;是一种研究二分类观察结果与多因素之间关系的重要方法&#xff0c;在医学研究等领域中得到了广泛的应用。 采用log-binomial 模型可直接估…

elementUi表单恢复至初始状态并不触发表单验证

elementUi表单恢复至初始状态并不触发表单验证 1.场景再现2.解决方法 1.场景再现 左侧是树形列表&#xff0c;右侧是显示节点的详情&#xff0c;点击按钮应该就是新增一个规则的意思&#xff0c;表单内容是没有改变的&#xff0c;所以就把需要把表单恢复至初始状态并不触发表单…

大语言模型(LLM)与 Jupyter 连接起来了

现在&#xff0c;大语言模型&#xff08;LLM&#xff09;与 Jupyter 连接起来了&#xff01; 这主要归功于一个名叫 Jupyter AI 的项目&#xff0c;它是官方支持的 Project Jupyter 子项目。目前该项目已经完全开源&#xff0c;其连接的模型主要来自 AI21、Anthropic、AWS、Co…

MSP432自主开发笔记6:定时器多通道捕获多条编码器线脉冲数

所用开发板&#xff1a;MSP432P401R 今日在此更新一下编码器测速的定时器捕获写法&#xff0c;之前学习时竟然忘记更新了~~ 本文讲如何用定时器的通道来 捕获编码器的脉冲信号数量&#xff0c;不提供速度路程的计算方式&#xff0c; 文章提供源码&#xff0c;测试工程下载&a…

积木报表集成前端加载js文件404

项目场景&#xff1a; 在集成积木报表和shiro时候&#xff1a; 集成积木报表&#xff0c;shrio&#xff0c;shrio是定义在另一个模块下的&#xff0c;供另一个启动类使用&#xff0c;积木报表集成shrio的时候&#xff0c;需要依赖存放shrio的核心包&#xff0c;该核心包除了存…

android 如何分析应用的内存(十七)——使用MAT查看Android堆

android 如何分析应用的内存&#xff08;十七&#xff09;——使用MAT查看Android堆 前一篇文章&#xff0c;介绍了使用Android profiler中的memory profiler来查看Android的堆情况。 如Android 堆中有哪些对象&#xff0c;这些对象的引用情况是什么样子的。 可是我们依然面临…

【ArcGIS】经纬度数据转化成平面坐标数据

将点位置导入Gis中&#xff0c;如下&#xff08;经纬度表征位置&#xff09;&#xff1a; 如何利用Gis将其转化为平面坐标呢&#xff1f; Step1 坐标变换 坐标变换&#xff0c;打开ArcToolbox&#xff0c;找到“数据管理工具”->“投影和变换”->“要素”->“投影”…

MySQL—缓存

目录标题 为什么要有Buffer Poolbuffer pool有多大buffer pool缓存什么 如何管理Buffer Pool如何管理空闲页如何管理脏页如何提高缓存命中率预读失效buffer pool污染 脏页什么时候会被刷入到磁盘 为什么要有Buffer Pool 虽然说MySQL的数据是存储在磁盘中&#xff0c;但是也不能…

抖音关键词搜索小程序排名怎么做

抖音关键词搜索小程序排名怎么做 1 分钟教你制作一个抖音小程序。 抖音小程序就是我的视频&#xff0c;左下方这个蓝色的链接&#xff0c;点进去就是抖音小程序。 如果你有了这个小程序&#xff0c;发布视频的时候可以挂载这个小程序&#xff0c;直播的时候也可以挂载这个小…