首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

在Vue3中如何为路由Query参数标注类型

编程知识
2024年08月05日 21:23

前言

最近发布了一款支持IOC容器的Vue3框架:Zova。与以往的OOP或者Class方案不同,Zova在界面交互层面仍然采用Setup语法,仅仅在业务层面引入IOC容器。IOC容器犹如一把钥匙,为我们打开了业务工程化的大门,允许我们探索更多工程化方面的设计和能力。有网友提出一个非常好的建议:可否提供一些业务场景,说明有哪些是Class可做而Composable做不了的,这样才更有说服力。

首先说明一点,其实没有哪些业务需求是这个能做而那个不能做的。不同的编程范式带来的是不同的代码风格,不同的编程体验,从不同的路径指向开发效率和代码可维护性方面的评估。因此,最终根据用户自身的偏好和业务实际需求而定。

那么,在这里,我们就针对这个话题如何为路由Query参数标注类型为例,看看Composable和IOC容器的代码风格究竟有什么不同。

需求说明

这里有一个页面组件User,可以通过Query传递三个参数:

参数名 类型 缺省值
id number 0
name string ''
married boolean false

Composable:原生

1. 访问页面

const router = useRouter();
router.push({
  path: '/test/demo/user',
  query: {
    id: 1,
    name: 'kevin',
    married: false.toString(),
  },
});

从Typescript类型的角度来看,这段代码有以下两个问题:

  1. path:没有类型约束和智能提示。这会存在以下三个隐患:
    1. 记不住:如果路径较长,或者单词较复杂,就记不住路径,需要从源文件查找
    2. 写错了:如果不小心写错了,没有提示,只有到实际运行时才会暴露错误
    3. 被改了:如果后续维护代码时,路径有了变更,那么这里的代码同样没有提示,只有到实际运行时才会暴露错误
  2. query:只有有限的类型约束,与业务类型并不一致
    1. 比如不支持Boolean类型,必须强制转换为String类型

2. 获取参数

const route = useRoute();
const id = parseInt(route.query.id ?? 0);
const name = route.query.name ?? '';
const married = route.query.married === 'true' ? true : false;

由于没有提供类型工具,需要针对每一个参数单独处理

Composable:useRouteQuery

1. 访问页面

(同上)

2. 获取参数

import { useRouteQuery } from '@vueuse/router';

const id = useRouteQuery('id', 0, { transform: Number });
const name = useRouteQuery('name', '');
const married = useRouteQuery('married', 'false', {
  transform: value => {
    return value === 'true' ? true : false;
  },
});

IOC容器

1. 定义类型

import { zz } from 'zova';

export const QuerySchema = zz.object({
+  id: zz.number().default(0),
+  name: zz.string().default(''),
+  married: zz.boolean().default(false),
});
  • zz是在zod基础上做的加强版,特别针对路由参数做了处理,支持array数组和json对象,具体参见:Zova: zod
  • 在定义类型的同时可以指定缺省值

2. 访问页面

const url = this.$router.resolvePath('/test/demo/user', {
  id: 0,
  name: 'kevin',
  married: false,
});
this.$router.push(url);
  • resolvePath的参数都有类型约束和智能提示,并且与业务类型保持一致

3. 获取参数

const id = this.$query.id;
const name = this.$query.name;
const married = this.$query.married;
  • 直接通过this.$query获取参数值,有明确的类型,并且不需要处理缺省值

总结

从上面的示例对比可以看出,采用IOC容器,可以实现定义使用的分离,而且定义侧可以通过工具来创建脚手架,进一步简化定义的书写。由于TS类型和缺省值等规范性代码都在定义侧完成了,那么在使用侧代码就更加简洁直观了。不知您的代码风格偏好是什么,是否还有更好的表达方式,欢迎在评论区交流。

参考资料

From:https://www.cnblogs.com/zhennann/p/18344167
本文地址: http://shuzixingkong.net/article/823
0评论
提交 加载更多评论
其他文章 数据结构 顺序与链式二叉树的原理与实现(万字)
目录一、树概念及结构树的概念树的相关概念树的表示二、二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构三、二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构堆的实现堆向下调整算法堆的创建建堆时间复杂度堆的插入堆的删除堆的代码实现Heap.hHeap.c堆的应用堆排序堆排序代码实现Heap
数据结构 顺序与链式二叉树的原理与实现(万字) 数据结构 顺序与链式二叉树的原理与实现(万字) 数据结构 顺序与链式二叉树的原理与实现(万字)
算法·理论:Manacher 笔记
\(\text{Manacher}\) 来啦! \(\text{Manacher}\) 并没有什么前置知识,比 \(\text{KMP}\) 简单多了。 前置处理 \(\text{Manacher}\) 算法用于解决回文串相关问题,先看几个基本概念:回文中心、回文半径,这些看字面意思就能猜到。 还有
【Playwright+Python】系列教程(七)使用Playwright进行API接口测试
playwright也是可以做接口测试的,但个人觉得还是没有requests库强大,但和selenium相比的话,略胜一筹,毕竟支持API登录,也就是说可以不用交互直接调用接口操作了。 怎么用 既然是API的测试了,那肯定就别搞UI自动化那套,搞什么浏览器交互,那叫啥API测试,纯属扯淡。 也不像有
【Playwright+Python】系列教程(七)使用Playwright进行API接口测试 【Playwright+Python】系列教程(七)使用Playwright进行API接口测试 【Playwright+Python】系列教程(七)使用Playwright进行API接口测试
架构演化学习思考(4) --- IOC的学习认识
架构演化学习思考(4) IOC的学习认识 IOC相关概念认识 什么是IOC? IOC全称为 Inversion Of Control ,即控制反转。它是一种控制思想,可以解释为类和类之间的依赖关系不再由代码直接控制,而是通过容器来控制和配置实现。 控制反转?那么什么是正传? 反转有啥好处?IOC到底
架构演化学习思考(4) --- IOC的学习认识 架构演化学习思考(4) --- IOC的学习认识 架构演化学习思考(4) --- IOC的学习认识
selenium复习之---原理+基础用法
简介 1.是什么 selenium是用来进行页面元素定位的第三方库,用来进行web自动化测试的工具,可以直接运行在浏览器中。 2.原理: selenium在工作过程中有三个角色,selenium客户端、webdriver和浏览器 selenium客户端是开发者与selenium的交互接口,它会发送指
.NET电子邮件高效处理解决方案
前言 在日常软件开发中,电子邮件处理是一个不可或缺的功能,无论是用户注册验证、通知推送还是日常的业务沟通,都离不开电子邮件的支持。今天大姚给大家分享2款.NET开源、高效、强大的.NET电子邮件处理库,这些库不仅简化了电子邮件的发送、接收和管理工作,还提供了丰富的功能和灵活的配置选项,以满足各种复杂
AI编程助手那些事儿
最近跟身边的程序员老杆子讨论需求时,惊奇的发现,他居然没使用AI编程助手。一时间有2个想法从大脑闪过,然后心里还带了一丝轻蔑。
AI编程助手那些事儿 AI编程助手那些事儿 AI编程助手那些事儿
随时随地与 LLMs 聊天的开源项目「GitHub 热点速览」
众所周知,本地运行 LLMs 需要下载模型(体积大),并且还比较吃硬件配置。近日 GitHub 推出了 GitHub Models 服务,让开发者可以在 GitHub 上免费测试 Llama、Phi 3、Mistral 和 GPT-4o 等大模型。但是,目前该服务仍处于公测阶段,类似早期的 Copi
随时随地与 LLMs 聊天的开源项目「GitHub 热点速览」 随时随地与 LLMs 聊天的开源项目「GitHub 热点速览」 随时随地与 LLMs 聊天的开源项目「GitHub 热点速览」