在Vue3中為路由Query參數(shù)標(biāo)注類型的方法
前言
最近發(fā)布了一款支持IOC容器的Vue3框架:Zova。與以往的OOP或者Class方案不同,Zova在界面交互層面仍然采用Setup語法,僅僅在業(yè)務(wù)層面引入IOC容器。IOC容器猶如一把鑰匙,為我們打開了業(yè)務(wù)工程化的大門,允許我們探索更多工程化方面的設(shè)計(jì)和能力。
有網(wǎng)友提出一個(gè)非常好的建議:可否提供一些業(yè)務(wù)場景,說明有哪些是Class可做而Composable做不了的,這樣才更有說服力。
首先說明一點(diǎn),其實(shí)沒有哪些業(yè)務(wù)需求是這個(gè)能做而那個(gè)不能做的。不同的編程范式帶來的是不同的代碼風(fēng)格,不同的編程體驗(yàn),從不同的路徑指向開發(fā)效率和代碼可維護(hù)性方面的評估。因此,最終根據(jù)用戶自身的偏好和業(yè)務(wù)實(shí)際需求而定。
那么,在這里,我們就針對這個(gè)話題如何為路由Query參數(shù)標(biāo)注類型
為例,看看Composable和IOC容器的代碼風(fēng)格究竟有什么不同。
需求說明
這里有一個(gè)頁面組件User,可以通過Query傳遞三個(gè)參數(shù):
參數(shù)名 | 類型 | 缺省值 |
---|---|---|
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類型的角度來看,這段代碼有以下兩個(gè)問題:
path:沒有類型約束和智能提示
。這會存在以下三個(gè)隱患:記不住
:如果路徑較長,或者單詞較復(fù)雜,就記不住路徑,需要從源文件查找寫錯(cuò)了
:如果不小心寫錯(cuò)了,沒有提示,只有到實(shí)際運(yùn)行時(shí)才會暴露錯(cuò)誤被改了
:如果后續(xù)維護(hù)代碼時(shí),路徑有了變更,那么這里的代碼同樣沒有提示,只有到實(shí)際運(yùn)行時(shí)才會暴露錯(cuò)誤query:只有有限的類型約束,與業(yè)務(wù)類型并不一致
比如不支持Boolean類型,必須強(qiáng)制轉(zhuǎn)換為String類型
2. 獲取參數(shù)
const route = useRoute(); const id = parseInt(route.query.id ?? 0); const name = route.query.name ?? ''; const married = route.query.married === 'true' ? true : false;
由于沒有提供類型工具,需要針對每一個(gè)參數(shù)單獨(dú)處理
Composable:useRouteQuery
1. 訪問頁面
(同上)
2. 獲取參數(shù)
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基礎(chǔ)上做的加強(qiáng)版,特別針對路由參數(shù)做了處理,支持array數(shù)組和json對象,具體參見:Zova: zod
- 在定義類型的同時(shí)可以指定缺省值
2. 訪問頁面
const url = this.$router.resolvePath('/test/demo/user', { id: 0, name: 'kevin', married: false, }); this.$router.push(url);
- resolvePath的參數(shù)都有類型約束和智能提示,并且與業(yè)務(wù)類型保持一致
3. 獲取參數(shù)
const id = this.$query.id; const name = this.$query.name; const married = this.$query.married;
- 直接通過
this.$query
獲取參數(shù)值,有明確的類型,并且不需要處理缺省值
總結(jié)
從上面的示例對比可以看出,采用IOC容器,可以實(shí)現(xiàn)定義
與使用
的分離,而且定義
側(cè)可以通過工具來創(chuàng)建腳手架,進(jìn)一步簡化定義
的書寫。由于TS類型和缺省值等規(guī)范性代碼都在定義
側(cè)完成了,那么在使用
側(cè)代碼就更加簡潔直觀了。不知您的代碼風(fēng)格偏好是什么,是否還有更好的表達(dá)方式,歡迎在評論區(qū)交流。
參考資料
到此這篇關(guān)于在Vue3中如何為路由Query參數(shù)標(biāo)注類型的文章就介紹到這了,更多相關(guān)Vue3路由Query參數(shù)標(biāo)注類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue?element-plus中el-input修改邊框border的方法
element樣式還是蠻好的,只是有時(shí)候我們需要做一些調(diào)整,比如el-input的邊框,下面這篇文章主要給大家介紹了關(guān)于vue?element-plus中el-input修改邊框border的相關(guān)資料,需要的朋友可以參考下2022-09-09Element-ui 自帶的兩種遠(yuǎn)程搜索(模糊查詢)用法講解
這篇文章主要介紹了Element-ui 自帶的兩種遠(yuǎn)程搜索(模糊查詢)用法講解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01vue中el-tab如何點(diǎn)擊不同標(biāo)簽觸發(fā)不同函數(shù)的實(shí)現(xiàn)
el-tab本身的功能是點(diǎn)擊之后切換不同頁,本文主要介紹了vue中el-tab如何點(diǎn)擊不同標(biāo)簽觸發(fā)不同函數(shù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03vue使用Echarts設(shè)置數(shù)據(jù)無效問題記錄及解決方法
這篇文章主要介紹了vue使用Echarts設(shè)置數(shù)據(jù)無效問題記錄,本文通過場景分析給大家分享解決方法,需要的朋友可以參考下2022-08-08Vue使用wavesurfer.js實(shí)現(xiàn)音頻可視化的示例詳解
WaveSurfer.js是一個(gè)開源的音頻可視化庫,用于創(chuàng)建交互式、可定制的波形,本文將為大家簡單介紹了Vue如何使用wavesurfer.js實(shí)現(xiàn)音頻可視化功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04在vue中獲取token,并將token寫進(jìn)header的方法
今天小編就為大家分享一篇在vue中獲取token,并將token寫進(jìn)header的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09Vue-input框checkbox強(qiáng)制刷新問題
這篇文章主要介紹了Vue-input框checkbox強(qiáng)制刷新問題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04