vue3實(shí)現(xiàn)H5表單驗(yàn)證組件的示例
效果圖
描述
基于vue.js
,不依賴其他插件或庫實(shí)現(xiàn);基礎(chǔ)功能使用保持和 element-ui 一致,內(nèi)部實(shí)現(xiàn)做了一些移動(dòng)端差異的調(diào)整。
當(dāng)前構(gòu)建平臺(tái)使用 uni-app 官方腳手架構(gòu)建,因?yàn)楫?dāng)下移動(dòng)端大多情況就h5
和微信小程序
兩種,所以一套代碼跑多端十分適合技術(shù)選型。
實(shí)現(xiàn)思路
核心api:使用 provide 和 inject ,對應(yīng)<form>
和<form-item>
。
在
<form>
組件中,內(nèi)部用一個(gè)變量(數(shù)組)去將所有<form-item>
實(shí)例儲(chǔ)存起來,同時(shí)把要傳遞的數(shù)據(jù)通過provide
暴露出去;<form-item>
組件則在內(nèi)部用inject
去接收父組件提供過來的數(shù)據(jù),最后把自身的屬性和方法提交到父組件去。<form>
中要做的事情就只有監(jiān)聽綁定的數(shù)據(jù),然后做調(diào)用對應(yīng)<form-item>
的各種驗(yàn)證方法;所以任何的驗(yàn)證狀態(tài)都寫在了<form-item>
中,包括樣式的展示;由于可以拿到父組件綁定的數(shù)據(jù),對于一些常見樣式設(shè)置自然就可以用computed
去優(yōu)先拿取自身組件prop
值或者父組件綁定的prop
值;對應(yīng)的,通過父組件綁定的表單數(shù)據(jù),就可以和自身prop
去驗(yàn)證當(dāng)前項(xiàng)了,最后由父組件去調(diào)用對應(yīng)方法即可,當(dāng)然,自身組件也可以調(diào)用。因?yàn)?code>vue3中移除了自定義派發(fā)事件
$on
、$off
、$emit
,所以這里改用uni.$on
、uni.$off
和uni.$emit
來代替;不同的是,這個(gè)事件派發(fā)機(jī)制是全局的,不是跟隨組件唯一性,所以在添加、移除事件時(shí),需要在事件名稱設(shè)置一個(gè)唯一值使用;這里我在<form>
組件中定義一個(gè)變量,每次調(diào)用時(shí)都累加1
,然后設(shè)為事件名稱再傳遞到<form-item>
內(nèi)部,這樣就可以保證<form>
和<form-item>
的確定性了。
與element-ui表單組件差異
表單驗(yàn)證不再設(shè)置輸入框和任何表單表單的樣式,而是通過自定義修改樣式去顯示驗(yàn)證提示;這十分有利于移動(dòng)端窮出不盡的UI設(shè)計(jì)稿的變化,例如同一個(gè)表單,有兩種不同樣式的輸入框;同時(shí)不影響和其他樣式庫的使用,因?yàn)楸韱悟?yàn)證的
<form-item>
不會(huì)影響到插槽內(nèi)的任何元素。表單校驗(yàn)數(shù)據(jù)選項(xiàng)只保留
4
個(gè)字段(見下面),因?yàn)橐瞥藢Ρ韱谓M件的驗(yàn)證狀態(tài),所以trigger
這個(gè)事件設(shè)置也不需要了;pattern
則換成了reg
,注意的是,在微信小程序中,任何組件的傳參都會(huì)被過濾剩下基礎(chǔ)json
類型,所以這個(gè)reg
在小程序環(huán)境中使用時(shí),要在末尾加上.toString()
,validator
同理。
/** 表單規(guī)則類型 */ export interface TheFormRulesItem { /** 是否必填項(xiàng) */ required?: boolean /** 提示字段 */ message?: string /** 指定類型 */ type?: "number" | "array" /** * 自定義的校驗(yàn)規(guī)則(正則) * - 考慮到微信一些特殊的抽風(fēng)機(jī)制,在微信小程序中,除`number|string|object|undefined|null`這幾個(gè)基礎(chǔ)類型外,其他類型是會(huì)被過濾掉,所以這里在寫正則的時(shí)候,在末尾加上`.toString()`即可 */ reg?: string // | RegExp } /** 表單規(guī)則類型 */ export type TheFormRules = { [key: string]: Array<TheFormRulesItem> };
不知道大家在以往的長表單驗(yàn)證中,有沒有遇到過點(diǎn)擊驗(yàn)證之后,因?yàn)轫撁孢^長,所以不知道那個(gè)表單項(xiàng)校驗(yàn)不通過,從而需要翻閱定位到對應(yīng)項(xiàng);為了優(yōu)化以往表單驗(yàn)證的體驗(yàn),這里加入了驗(yàn)證之后,滾動(dòng)到對應(yīng)位置的操作,更加符合移動(dòng)端的用戶體驗(yàn)。
表單驗(yàn)證的觸發(fā)機(jī)制:都知道
element-ui
的觸發(fā)機(jī)制是通過指定trigger
來選擇觸發(fā)的時(shí)機(jī),那這里我去掉之后,就意味著沒有這些操作去觸發(fā)了;而我選擇的是主動(dòng)調(diào)用validate
、validateField
這些驗(yàn)證方法時(shí)去觸發(fā)實(shí)時(shí)驗(yàn)證,當(dāng)驗(yàn)證不通過時(shí),把不通過的用變量儲(chǔ)存起來,然后每次數(shù)據(jù)變動(dòng)時(shí)去校驗(yàn),等到驗(yàn)證通過了,則移除實(shí)時(shí)驗(yàn)證項(xiàng);這樣相比于element-ui
綁定事件實(shí)時(shí)去驗(yàn)證會(huì)節(jié)省很多代碼調(diào)用和運(yùn)行的機(jī)制,同時(shí)代碼可以做到更高校和精簡。
非uni-app平臺(tái)的移植
除了更換標(biāo)簽之外,幾乎不用做任何的修改就可以復(fù)制粘貼到其他項(xiàng)目中去,唯一要修改的就是自定義事件uni.$on
、uni.$off
和uni.$emit
;這里可以自己實(shí)現(xiàn),又或者用其他庫去代替,js
實(shí)現(xiàn)自定義事件派發(fā)代碼如下:
function moduleEvent() { /** * 事件集合對象 * @type {{[key: string]: Array<Function>}} */ const eventInfo = {}; return { /** * 添加事件 * @param {string} name 事件名 * @param {Function} fn 事件執(zhí)行的函數(shù) */ on(name, fn) { if (!eventInfo.hasOwnProperty(name)) { eventInfo[name] = []; } if (!eventInfo[name].some(item => item === fn)) { eventInfo[name].push(fn); } }, /** * 解綁事件 * @param {string} name 事件名 * @param {Function} fn 事件綁定的函數(shù) */ off(name, fn) { const fns = eventInfo[name]; if (fns && fns.length > 0 && fn) { for (let i = 0; i < fns.length; i++) { const item = fns[i]; if (item === fn) { fns.splice(i, 1); break; } } } else { console.log("[moduleEvent] => 沒有要解綁的事件"); } }, /** * 調(diào)用事件 * @param {string} name 事件名 * @param {any} params 事件攜帶參數(shù) */ dispatch(name, params) { const fns = eventInfo[name]; if (fns && fns.length > 0) { for (let i = 0; i < fns.length; i++) { const fn = fns[i]; fn(params); } } else { console.log("[moduleEvent] => 沒有要執(zhí)行的事件"); } }, } }
調(diào)用moduleEvent()
之后,用變量調(diào)用即可,注意當(dāng)前變量要作為內(nèi)存常駐使用;
到此這篇關(guān)于vue3實(shí)現(xiàn)H5表單驗(yàn)證組件的示例的文章就介紹到這了,更多相關(guān)vue3 H5表單驗(yàn)證組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue前端RSA加密java后端解密的方法實(shí)現(xiàn)
本文主要介紹了vue前端RSA加密java后端解密的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02vue中使用vue-seamless-scroll插件實(shí)現(xiàn)列表無縫滾動(dòng)效果
這篇文章主要介紹了vue中使用vue-seamless-scroll插件無縫滾動(dòng),支持上下左右無縫滾動(dòng),單步滾動(dòng)停留時(shí)間,以及水平方向的手動(dòng)切換,需要的朋友可以參考下2022-06-06徹底搞懂并解決vue-cli4中圖片顯示的問題實(shí)現(xiàn)
這篇文章主要介紹了徹底搞懂并解決vue-cli4中圖片顯示的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08vue init webpack 建vue項(xiàng)目報(bào)錯(cuò)的解決方法
今天小編就為大家分享一篇vue init webpack 建vue項(xiàng)目報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09vue使用Proxy實(shí)現(xiàn)雙向綁定的方法示例
這篇文章主要介紹了vue使用Proxy實(shí)現(xiàn)雙向綁定的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03vue iview實(shí)現(xiàn)動(dòng)態(tài)路由和權(quán)限驗(yàn)證功能
這篇文章主要介紹了vue iview實(shí)現(xiàn)動(dòng)態(tài)路由和權(quán)限驗(yàn)證功能,動(dòng)態(tài)路由控制分為兩種:一種是將所有路由數(shù)據(jù)存儲(chǔ)在本地文件中,另一種則是本地只存儲(chǔ)基本路由,具體內(nèi)容詳情大家參考下此文2018-04-04