在Vue3中为路由Query参数标注类型的方法

 更新时间:2024年08月06日 08:59:27   作者:濮水大叔  
这篇文章主要介绍了在Vue3中如何为路由Query参数标注类型,我们就针对这个话题如何为路由Query参数标注类型为例,看看Composable和IOC容器的代码风格究竟有什么不同,需要的朋友可以参考下

前言

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

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

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

需求说明

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

参数名类型缺省值
idnumber0
namestring''
marriedbooleanfalse

Composable:原生

1. 访问页面

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

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

  • path:没有类型约束和智能提示。这会存在以下三个隐患:

    记不住:如果路径较长,或者单词较复杂,就记不住路径,需要从源文件查找

    写错了:如果不小心写错了,没有提示,只有到实际运行时才会暴露错误

    被改了:如果后续维护代码时,路径有了变更,那么这里的代码同样没有提示,只有到实际运行时才会暴露错误

  • query:只有有限的类型约束,与业务类型并不一致

    比如不支持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类型和缺省值等规范性代码都在定义侧完成了,那么在使用侧代码就更加简洁直观了。不知您的代码风格偏好是什么,是否还有更好的表达方式,欢迎在评论区交流。

参考资料

到此这篇关于在Vue3中如何为路由Query参数标注类型的文章就介绍到这了,更多相关Vue3路由Query参数标注类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 手把手教你Vue3 按需引入 Echarts的过程(收藏)

    手把手教你Vue3 按需引入 Echarts的过程(收藏)

    新项目采用 Vue3 作为前端项目框架,避免不了要使用 echarts,但是在使用的时候,出现了与 Vue2 使用不一样的地方,所以特别记下来,希望给到有需要的同学一些帮助
    2023-10-10
  • vue element-plus中el-input修改边框border的方法

    vue element-plus中el-input修改边框border的方法

    element样式还是蛮好的,只是有时候我们需要做一些调整,比如el-input的边框,下面这篇文章主要给大家介绍了关于vue element-plus中el-input修改边框border的相关资料,需要的朋友可以参考下
    2022-09-09
  • Element-ui 自带的两种远程搜索(模糊查询)用法讲解

    Element-ui 自带的两种远程搜索(模糊查询)用法讲解

    这篇文章主要介绍了Element-ui 自带的两种远程搜索(模糊查询)用法讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • vue中el-tab如何点击不同标签触发不同函数的实现

    vue中el-tab如何点击不同标签触发不同函数的实现

    el-tab本身的功能是点击之后切换不同页,本文主要介绍了vue中el-tab如何点击不同标签触发不同函数的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Vue 打包上线后的缓存问题解决

    Vue 打包上线后的缓存问题解决

    在使用vue脚手架搭建前端工程时,经常会遇到打包上线后的缓存问题,许多开发者会直接在index.html中加入类似以下代码来解决缓存问题,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-11-11
  • vue使用Echarts设置数据无效问题记录及解决方法

    vue使用Echarts设置数据无效问题记录及解决方法

    这篇文章主要介绍了vue使用Echarts设置数据无效问题记录,本文通过场景分析给大家分享解决方法,需要的朋友可以参考下
    2022-08-08
  • Vue使用wavesurfer.js实现音频可视化的示例详解

    Vue使用wavesurfer.js实现音频可视化的示例详解

    WaveSurfer.js是一个开源的音频可视化库,用于创建交互式、可定制的波形,本文将为大家简单介绍了Vue如何使用wavesurfer.js实现音频可视化功能,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • 在vue中获取token,并将token写进header的方法

    在vue中获取token,并将token写进header的方法

    今天小编就为大家分享一篇在vue中获取token,并将token写进header的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue-input框checkbox强制刷新问题

    Vue-input框checkbox强制刷新问题

    这篇文章主要介绍了Vue-input框checkbox强制刷新问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • vue中的slot-scope及scope.row用法

    vue中的slot-scope及scope.row用法

    这篇文章主要介绍了vue中的slot-scope及scope.row用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论