引言

在现代前端应用中,模态框(Modal)是最常用的UI组件之一。然而,随着应用规模的增长,模态框的状态管理往往会变得混乱。本文将介绍一种基于 Pinia 和 Vue 3 Composition API 的类型安全模态框管理方案,帮助你优雅地处理应用中的各种模态框状态。

核心概念解析

1. Pinia 状态管理

Pinia 是 Vuex 的继任者,也是 Vue3 官方推荐的状态管理库,相比 Vuex 提供了更好的 TypeScript 支持和更简洁的 API。我们的解决方案将基于 Pinia 来存储和管理所有模态框的状态。

2. 类型安全的必要性

在大型项目中,确保模态框状态和操作的类型安全可以显著减少运行时错误,并提高开发效率。我们的方案充分利用 TypeScript 的泛型和类型推断来实现这一点。

实现详解

1. 定义模态框状态类型

首先,我们需要定义应用中所有模态框的状态类型:

type BaseModalState = {
open: boolean;
}; type ModalStates = {
taskCompleteModal: BaseModalState;
recConfirmModal: BaseModalState & { tipsText?: string };
}; type ModalKey = keyof ModalStates;

这里我们定义了一个基础模态框状态 BaseModalState,然后通过 ModalStates 类型扩展定义了具体的模态框类型。

2. 创建 Pinia Store

接下来,我们创建 Pinia store 来管理这些模态框状态:

const useModalStore = defineStore('APP_MODAL_STORE', () => {
const modals = ref<ModalStates>({
taskCompleteModal: { open: false },
recConfirmModal: { open: false, tipsText: '' },
}); function updateModal<K extends ModalKey>(
key: K,
value: Partial<ModalStates[K]>
) {
modals.value[key] = { ...modals.value[key], ...value };
} return {
modals,
updateModal,
};
});

这个 store 提供了:

  • modals: 响应式对象,存储所有模态框状态
  • updateModal: 用于更新特定模态框状态的通用方法

3. 创建便捷的 Composition 函数

为了更方便地在组件中使用,我们创建了一个 useModal 组合式函数:

export function useModal<K extends ModalKey>(
key: K
): {
state: ComputedRef<ModalStates[K]>;
update: (payload: Partial<ModalStates[K]>) => void;
} & {
[P in keyof ModalStates[K]]: ComputedRef<ModalStates[K][P]>;
} {
const store = useModalStore();
const state = computed(() => store.modals[key]); const result: Record<string, any> = {
state,
update: (payload: Partial<ModalStates[K]>) =>
store.updateModal(key, payload),
}; for (const field in state.value) {
if (Object.prototype.hasOwnProperty.call(state.value, field)) {
result[field] = computed(
() => state.value[field as keyof ModalStates[K]]
);
}
} return result as any;
}

这个函数为每个模态框状态属性生成了计算属性,这一步很重要,使得在组件中可以更方便地访问和更新状态。

使用示例

1. 在组件中使用

<script setup lang="ts">
import { useModal } from './modalStore'; const {
open: isTaskModalOpen,
update: updateTaskModal
} = useModal('taskCompleteModal'); const openModal = () => {
updateTaskModal({ open: true });
};
</script> <template>
<button @click="openModal">打开任务完成模态框</button>
<TaskCompleteModal v-model="isTaskModalOpen" />
</template>

2. 带有额外属性的模态框

<script setup lang="ts">
import { useModal } from './modalStore'; const {
open: isConfirmModalOpen,
tipsText,
update: updateConfirmModal
} = useModal('recConfirmModal'); const showConfirm = () => {
updateConfirmModal({
open: true,
tipsText: '您确定要执行此操作吗?'
});
};
</script> <template>
<button @click="showConfirm">显示确认对话框</button>
<ConfirmModal v-model="isConfirmModalOpen" :tips-text="tipsText" />
</template>

方案优势

  1. 类型安全:所有模态框状态和操作都有严格的类型检查
  2. 集中管理:所有模态框状态集中在一个 store 中,便于维护,也可根据实际情况拆分出不同的 modal store
  3. 使用便捷useModal 函数提供了简洁的 API 来访问和更新状态
  4. 响应式:基于 Vue 的响应式系统,状态变化自动更新视图
  5. 可扩展:添加新模态框只需扩展 ModalStates 类型

总结与延伸

本文介绍的类型安全模态框管理方案适用于中大型 Vue 项目,特别是那些需要管理多个模态框状态的应用。通过结合 Pinia 和 TypeScript 的强大功能,我们实现了既安全又易用的解决方案。希望这个方案能帮助你更好地管理 Vue 应用中的模态框状态。如果你有更复杂的需求,可以考虑在此基础上进一步扩展和完善。

优雅管理模态框:基于 Pinia 的类型安全的解决方案的更多相关文章

  1. 基于bootstrap模态框的alert弹窗

    完成的效果如下: html代码: <!-- 弹出框 --> <div class="modal fade" id="alert_like" t ...

  2. 基于bootstrap模态框的日期选择器

    近来由于工作需求,以bootstrap模态框+DIV+CSS+JS做了一个适用于移动端的日期选择器,能够满足多样的需求,目前处于第一个版本,后续可能会继续更新.废话不多说,直接进入制作过程. 首先,需 ...

  3. 基于jquery-ui及bootstrap的可拖拽模态框

    可直接使用代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  4. 基于bootstrap 在同一个界面弹出不同的模态框

    同一个页面如何操作多个模态框的弹出 <button class="btn btn-info" data-toggle="modal" data-targe ...

  5. 基于bootstrap的模态框使用

    使用步骤两步 1:按顺序引入以下三个文件 <link rel="stylesheet" href="../css/bootstrap.min.css"&g ...

  6. bootstrap模态框modal使用remote第二次加载显示相同内容解决办法

    bootstrap模态框modal使用remote动态加载内容,第二次加载显示相同内容解决办法 bootstrap的modal中,使用remote可以动态加载页面到modal-body中,并弹窗显示 ...

  7. Html中模态框(弹出框)使用入门

    作为html学习学习模态框需要二步: 效果图 第一步学习HTML中 div的弹出 ①触发按钮         <input class="btn btn-success" i ...

  8. Bootstrap 模态框插件

    一.基本使用 使用模态框的弹窗组件需要三层 div 容器元素,分别为 modal(模态声明层). dialog(窗口声明层).content(内容层).在内容层里面,还有三层,分别为 header(头 ...

  9. bootstrap 模态框动态加载数据

    .页面中添加modal <!-- 模态框(Modal) --> <div class="modal fade" id="showModal" ...

  10. 使用bootstrap的插件实现模态框效果

    在上一篇文章中,我们使用 js+css 实现了模态框效果,在理解了模态框的基本实现方法和实现效果后,我们就要寻找更快捷的方法,又快又好的来完成模态框开发需求,从而节约时间,提高效率.一个好的轮子,不仅 ...

随机推荐

  1. .NET外挂系列:7. harmony在高级调试中的一些实战案例

    一:背景 1. 讲故事 如果你读完前六篇,我相信你对 harmony 的简单使用应该是没什么问题了,现在你处于手拿锤子看谁都是钉子的情况,那这篇我就找高级调试里非常经典的 3个钉子 让大家捶一锤. 二 ...

  2. SmolVLM2轻量级视频多模态模型,应用效果测评(风景、事故、仿真、统计、文字、识物)

    SmolVLM2轻量级视频多模态模型,应用效果测评 目       录 1.     前言... 2 2.     应用部署... 2 3.     应用效果... 4 1.1          风景 ...

  3. java XML字符串和bean实体类互转

    pom引入依赖 <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artif ...

  4. 乒乓球测距(K210)

    测距 说明 识别的物体是乒乓球(规格应该是统一的吧), 硬件是K210,测距的函数经过拟合,在50cm范围内是准确的 如果使用起来不准确,可以打印代码中的LM, 然后去测数据,自己再拟合一个函数,代替 ...

  5. 2022 电赛C题 巡线基础模块代码(带控制)

    巡线功能模块 from maix import camera, display, gpio, pwm class FindLine(): def __init__(self): self.THRESH ...

  6. Benchmark论文解读:Evaluating the Ripple Effects of Knowledge Editing in Language Models

      论文发表于自然语言处理顶刊TACL-2024(原文链接).目前模型编辑方法的评估主要集中在测试单个事实是否被成功注入,以及模型对其它事实的预测是否没有改变.作者认为这样的评估模式有限,因为注入一个 ...

  7. php链式调用

    我们经常在项目中会写到 Mode::find()->where()->orderBy()->limit(); 链式调用,那么它是怎么实现的呢? 昨天看韩天峰大佬的视频,学到了 关键点 ...

  8. Arduino从零开始的高手之路0——引言:Arduino是世界上最好的开发板!

    开篇先比比: 虽然我们的老会长一直强调Arduino是个很菜的东西,但是的确是嵌入式入门的不二法宝啊. 现在其实我已经学了stm32了,arduino自认为比较精通了,但是其实实践上手的机会还是很少 ...

  9. 数栈产品分享:Kafka—实时离不开的那个TA

    一.前言 随着技术不断的成熟及市场需求的日益旺盛,实时开发已经成为当前大数据开发不可或缺的一部分.在整个实时开发的链路中,数据采集需要写入到Kafka,数据处理也需要使用到Kafka.今天我们就针对K ...

  10. 你应该懂的AI大模型(八)之 微调 之 增量微调

    一.什么是微调 1.1.什么是微调?为什么要做微调? 模型微调(Fine-tuning)指的是将一个预训练好的模型(通常在大规模通用数据集上训练)针对特定任务或领域进行优化的过程. 那么什么是预训练好 ...