【Vue3进阶】Pinia 中的 Store 组合式写法

Hey小伙伴们!今天来给大家分享一个 Vue3 状态管理库 Pinia 中非常实用的功能——Store 的组合式写法。通过这种写法,我们可以将多个 store 进行组合和复用,使得代码更加模块化、清晰易读。

如果你对 Vue3 和 Pinia 感兴趣,或者想学习如何更好地组织和管理应用的状态,那这篇笔记一定要收藏哦!🚀


👉 什么是 Pinia?

Pinia 是由 Vue.js 官方团队成员开发的新一代状态管理库,旨在替代 Vuex 成为 Vue3 的默认状态管理方案。相比 Vuex,Pinia 提供了更简洁的 API 和更强大的功能,使得状态管理变得更加直观和高效。

Pinia 支持模块化设计,允许我们将状态分散在多个 store 中进行管理。每个 store 都可以独立地定义自己的状态、getter、action 和 mutation,这使得代码更加清晰易读。


👉 为什么需要组合式写法?

在实际项目中,我们经常会遇到需要在多个组件或页面之间共享状态的情况。传统的状态管理方式可能会导致代码冗余、难以维护等问题。Pinia 提供了一种优雅的方式来解决这些问题——Store 的组合式写法

通过组合式写法,我们可以将多个 store 进行组合和复用,避免重复定义相同的逻辑,提升代码的可维护性和可扩展性。


👉 案例场景:用户认证与购物车状态管理

我们来实现一个简单的案例:使用 Pinia 的组合式写法来管理用户认证和购物车的状态。我们将创建两个独立的 store(authStorecartStore),并在组件中组合使用它们。

1. 安装依赖库

首先,确保你已经安装了 Vue3 和 Pinia:

npm install vue@next pinia
2. 创建 Pinia Store

接下来,我们创建两个独立的 store:authStorecartStore

authStore.js
// src/stores/authStore.js
import { defineStore } from 'pinia';export const useAuthStore = defineStore('auth', {state: () => ({username: 'Guest',isLoggedIn: false,}),actions: {login(username) {this.username = username;this.isLoggedIn = true;},logout() {this.username = 'Guest';this.isLoggedIn = false;}}
});
cartStore.js
// src/stores/cartStore.js
import { defineStore } from 'pinia';export const useCartStore = defineStore('cart', {state: () => ({items: [],total: 0,}),actions: {addItem(item) {this.items.push(item);this.total += item.price;},removeItem(index) {const item = this.items[index];this.total -= item.price;this.items.splice(index, 1);}}
});
3. 组合使用 Store

现在,我们可以在组件中同时使用这两个 store,并将它们组合在一起。为了简化操作,我们可以创建一个新的 store 来组合这两个 store。

combinedStore.js
// src/stores/combinedStore.js
import { useAuthStore } from './authStore';
import { useCartStore } from './cartStore';export const useCombinedStore = () => {const authStore = useAuthStore();const cartStore = useCartStore();return {authStore,cartStore,};
};
4. 在组件中使用组合 Store

接下来,我们在组件中使用这个组合后的 store,并调用其中的方法来测试效果。

<template><div><h1>用户认证与购物车</h1><!-- 用户信息 --><div><p>用户名: {{ combined.authStore.username }}</p><p>登录状态: {{ combined.authStore.isLoggedIn ? '已登录' : '未登录' }}</p><button @click="login">登录</button><button @click="logout">登出</button></div><!-- 购物车信息 --><div><h2>购物车</h2><ul><li v-for="(item, index) in combined.cartStore.items" :key="index">{{ item.name }} - {{ item.price }} 元<button @click="removeItem(index)">移除</button></li></ul><p>总计: {{ combined.cartStore.total }} 元</p><input v-model="newItem.name" placeholder="商品名称"><input v-model="newItem.price" type="number" placeholder="价格"><button @click="addItem">添加到购物车</button></div></div>
</template><script>
import { ref } from 'vue';
import { useCombinedStore } from '../stores/combinedStore';export default {setup() {const combined = useCombinedStore();const newItem = ref({name: '',price: 0,});const login = () => {combined.authStore.login('Alice');};const logout = () => {combined.authStore.logout();};const addItem = () => {combined.cartStore.addItem({ ...newItem.value });newItem.value.name = '';newItem.value.price = 0;};const removeItem = (index) => {combined.cartStore.removeItem(index);};return {combined,newItem,login,logout,addItem,removeItem,};}
};
</script>
5. 运行效果

当你点击“登录”按钮时,会看到用户的登录状态变为“已登录”,并且用户名显示为“Alice”。你可以通过输入商品名称和价格,并点击“添加到购物车”按钮将商品添加到购物车中。购物车中的商品列表会实时更新,并显示总计金额。


👉 关键点解析
  1. Store 的组合式写法

    • 我们通过 useCombinedStore 函数将多个 store 组合在一起,这样可以在组件中方便地使用这些 store。
    • 这种方式使得代码更加模块化,便于维护和扩展。
  2. 状态管理的优势

    • Pinia 提供了简洁的 API 和模块化的设计,使得状态管理变得更加直观和高效。
    • 通过组合多个 store,我们可以避免重复定义相同的逻辑,提升代码的可维护性和可扩展性。
  3. 灵活的应用场景

    • 在实际项目中,我们可以根据需求创建多个独立的 store,并通过组合的方式在不同的组件中复用这些 store。
    • 这种方式特别适合大型项目或多团队协作开发,能够有效提升开发效率和代码质量。

👉 更多扩展
  1. 异步操作

    • 在 store 中可以定义异步 action,例如发送网络请求获取数据。Pinia 支持 async/await 语法,使得异步操作更加简单明了。
  2. 持久化状态

    • 结合 localStoragesessionStorage,可以在状态发生变化时将数据保存到本地存储中,以便在页面刷新后恢复状态。
  3. 插件支持

    • Pinia 提供了插件机制,可以通过插件扩展 store 的功能,例如添加日志记录、性能监控等。

👉 总结与应用

通过这个简单的案例,我们可以看到 Pinia 的组合式写法在实际项目中的强大功能。它不仅使代码更加模块化、清晰易读,还大大提升了开发效率和代码的可维护性。

无论是用于用户认证、购物车管理还是其他复杂的状态管理场景,Pinia 的组合式写法都能帮助我们更好地组织和管理应用的状态。

希望这篇笔记能帮助大家更好地理解和应用 Pinia 的组合式写法!


👉 更多资源
  • Pinia 官方文档
  • Vue3 官方文档
  • Pinia GitHub 仓库

🌟 结语

今天的分享就到这里啦!希望这篇笔记能帮助大家更好地理解和应用 Pinia 的组合式写法。如果你觉得有用,别忘了点赞、收藏哦!如果有任何问题或想法,欢迎在评论区留言交流,我们一起学习进步!💖


如果你有其他问题或需要进一步的帮助,请随时告诉我!😊

希望你能从这篇笔记中学到新知识,提升你的开发技能!喜欢我的朋友请点赞收藏并关注我🌟

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

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

相关文章

00_专栏《Redis 7.x企业级开发实战教程》介绍

大家好,我是袁庭新。Redis作为一款高性能、多用途的内存数据库,凭借其丰富的数据结构、高速读写能力、原子操作特性及发布订阅等功能,在缓存加速、分布式锁、消息队列等场景中不可或缺,极大提升了系统性能与开发效率,是现代互联网应用架构的关键组件。 你是否在学习Redis…

TensorFlow DAY3: 高阶 API(Keras,Estimator)(完)

TensorFlow 作为深度学习框架&#xff0c;当然是为了帮助我们更便捷地构建神经网络。所以&#xff0c;本次实验将会了解如何使用 TensorFlow 来构建神经网络&#xff0c;并学会 TensorFlow 构建神经网络的重要函数和方法。 知识点 Keras 顺序模型Keras 函数模型Keras 模型存储…

Python自动化:基于faker批量生成模拟数据(以电商行业销售数据为例)

引言&#xff1a;个人认为&#xff0c;“造数据”是一个数据分析师的一项基本技能&#xff0c;当然啦&#xff0c;“造数据”不是说胡编乱造&#xff0c;而是根据自己的需求去构造一些模拟数据集&#xff0c;用于测试等用途&#xff0c;而且使用虚拟数据不用担心数据隐私和安全…

WPS数据分析000004

目录 一、表格阅读技巧 冻结窗格 拆分窗口 新建窗口 阅读模式 护眼模式 二、表格打印技巧 打印预览 打印缩放 打印区域 打印标题 分页打印 打印位置 页眉页脚 逐份打印 三、表格保护技巧 锁定单元格 隐藏公式 文档权限 文件加密 一、表格阅读技巧 冻结窗…

【前端】CSS学习笔记

目录 CSS的简介CSS的概念语法 CSS的引入方式内联样式&#xff08;行内样式&#xff09;内部样式外部样式&#xff08;推荐&#xff09; 选择器全局选择器元素选择器类选择器ID选择器合并选择器后代选择器子选择器相邻兄弟选择器通用兄弟选择器伪类选择器:link:visited:hover:ac…

SQL在线格式化 - 加菲工具

SQL在线格式化 - 加菲工具 打开网站 加菲工具 https://www.orcc.online 选择“SQL 在线格式化” 或者直接访问网址 https://www.orcc.online/tools/sql 输入sql&#xff0c;点击上方的格式化按钮即可 输入框得到格式化后的sql结果

50-《仙人掌》

仙人掌 仙人掌&#xff08;学名&#xff1a;Opuntia stricta (Haw.) Haw. var. dillenii (Ker-Gawl.) Benson &#xff09;是仙人掌科缩刺仙人掌的一种变种。是丛生肉质灌木&#xff0c;高1.5~3m。上部分枝宽呈倒卵形、倒卵状椭圆形或者是近圆形&#xff0c;绿色至蓝绿色&#…

【C++课程学习】:C++中的IO流(istream,iostream,fstream,sstream)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 C学习笔记&#xff1a; https://blog.csdn.net/djdjiejsn/category_12682189.html 前言&#xff1a; 在C语…

【桌面程序】PyWebview跨平台桌面应用程序

什么是PyWebview PyWebView 是一个轻量级的 Python 库&#xff0c;用于将网页&#xff08;HTML、CSS、JavaScript&#xff09;嵌入到本地应用程序的窗口中。它允许你创建带有图形用户界面&#xff08;GUI&#xff09;的桌面应用程序&#xff0c;并且能够使用 Web 技术&#xf…

DDD - 整洁架构_解决技术设计困局

文章目录 Pre如何落地 DDD底层技术的更迭 整洁架构的设计主动适配器/北向适配器被动适配器/南向适配器 整洁架构的落地总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对象的两种设计思路…

C语言之文本加密程序设计

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 文本加密程序设计 摘要&#xff1a;本文设计了一种文本加密程序&#xff0c;旨在提高信息安…

基于javaweb的SpringBoot景区旅游管理系统设计和实现(源码+文档+部署讲解)

个人名片 &#x1f525; 源码获取 | 毕设定制| 商务合作&#xff1a;《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片运行环境技术栈适用功能说明使用说明 运行环境 Java≥8、MySQL≥5.7 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台…

PHP CRM售后系统小程序

&#x1f4bc; CRM售后系统 &#x1f4fa;这是一款基于PHP和uniapp深度定制的CRM售后管理系统&#xff0c;它犹如企业的智慧核心&#xff0c;精准赋能销售与售后管理的每一个环节&#xff0c;引领企业步入精细化、数字化的全新管理时代。系统集成了客户管理、合同管理、工单调…

【LFS/从0构建Linux系统】软件包与补丁安装及环境配置

笔者从虚拟机换回了开发板&#xff0c;系统仍然是Ubuntu。 文章目录 1. 安装包与补丁的安装1.1 wget指令1.2 aria2指令1.3 使用阿里云的整合包 2. 最后的准备阶段(环境配置)3 .总结 在上篇文章&#xff0c;我们完成lfs的硬件准备和磁盘分区。 最终达成这个效果&#xff1a; 那么…

微服务网关,如何选择?

什么是API网关 API网关&#xff08;API Gateway&#xff09;是微服务架构中的一个关键组件&#xff0c;它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关&#xff0c;客户端无需直接与多个微服务交互&a…

海康MV-EB435i立体相机SDK安装(ROS 2)

文章目录 一、简介二、驱动配置小结 一、简介 MV-EB435i相机是一款低成本、小体积、配置全面的立体相机&#xff0c;凭借硬件级的深度图像处理方案&#xff0c;相机可在高性能输出的同时维持低功耗的水平。相机采用海康MV3D SDK&#xff0c;并提供跨平台支持&#xff0c;广泛应…

中国数字安全产业年度报告(2024)

数字安全是指&#xff0c;在全球数字化背景下&#xff0c;合理控制个人、组织、国家在各种活动中面临的数字风险&#xff0c;保障数字社会可持续发展的政策法规、管理措施、技术方法等安全手段的总和。 数字安全领域可从三个方面对应新质生产力的三大内涵:一是基于大型语言模型…

一次统计信息收集导致的Oracle数据库查询慢分析

客户反馈在18.30-19.00之间&#xff0c;数据库运行特别慢&#xff0c;19点后就恢复正常。根据客户提出的信息&#xff0c;查看对应时段的awr报告&#xff0c;发现在此时段内&#xff0c;对表XXX_XXXX_SCAN存在着大量的查询操作。同时&#xff0c;查看该表的统计信息时间&#x…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测

角点检测&#xff08;Corner Detection&#xff09;是计算机视觉和图像处理中重要的步骤&#xff0c;主要用于提取图像中的关键特征&#xff0c;以便进行后续的任务&#xff0c;比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…

网络编程 | UDP套接字通信及编程实现经验教程

1、UDP基础 传输层主要应用的协议模型有两种&#xff0c;一种是TCP协议&#xff0c;另外一种则是UDP协议。在上一篇博客文章中&#xff0c;已经对TCP协议及如何编程实现进行了详细的梳理讲解&#xff0c;在本文中&#xff0c;主要讲解与TCP一样广泛使用了另一种协议&#xff1a…