前端可視化搭建組件值校驗(yàn)規(guī)則詳解
正文
組件值校驗(yàn),即在組件值變化時(shí)判斷是否滿足校驗(yàn)邏輯,若不滿足校驗(yàn)邏輯,可以拿到校驗(yàn)錯(cuò)誤信息進(jìn)行錯(cuò)誤提示或其他邏輯處理。
聲明 valueValidator 可開啟值校驗(yàn):
import { ComponentMeta } from "designer";
const input: ComponentMeta = {
componentName: "input",
element: Input,
valueValidator: () => ({
required: true,
maximum: 10,
}),
};如上面的例子,相當(dāng)于對(duì)組件值做了 “不能為 undefined 且最大值為 10” 的限制。
- 可以內(nèi)置 JSONSchema validate 的全部校驗(yàn)規(guī)則作為內(nèi)置規(guī)則。
- 支持拓展自定義校驗(yàn)規(guī)則。
- 支持異步校驗(yàn)。
- 可以用 selector 綁定任意變量(如全局狀態(tài)
state或者當(dāng)前組件實(shí)例的props來(lái)靈活定義組件值校驗(yàn)規(guī)則)。
當(dāng)校驗(yàn)出錯(cuò)時(shí),框架也不會(huì)做任何處理,而是將錯(cuò)誤拋給業(yè)務(wù),由業(yè)務(wù)來(lái)判斷如何處理錯(cuò)誤。
接下來(lái)我們來(lái)詳細(xì)說(shuō)說(shuō)每一項(xiàng)特征。
錯(cuò)誤處理
定義了組件值校驗(yàn)后,當(dāng)校驗(yàn)錯(cuò)誤出現(xiàn)時(shí),可以通過(guò) selector 的 validateError 拿到錯(cuò)誤信息:
const input: ComponentMeta = {
componentName: "input",
element: Input,
valueValidator: () => ({
required: true,
maximum: 10,
}),
runtimeProps: ({ selector }) => ({
errorName: selector(({ validateError }) => validateError.ruleName),
errorMessage: selector(({ validateError }) => validateError.payload),
}),
};ruleName: 校驗(yàn)規(guī)則名稱。payload: 該規(guī)則未命中時(shí)的返回值,校驗(yàn)函數(shù)返回什么,這里拿到的就是什么。內(nèi)置的校驗(yàn)函數(shù)返回的是錯(cuò)誤信息文案。
拿到校驗(yàn)錯(cuò)誤后,通過(guò) runtimeProps 傳給組件,我們可通過(guò)組件自身或 element 增加統(tǒng)一的組件 React 容器層處理并展示這些錯(cuò)誤信息。
也可以使用 fetcher 接收這個(gè)錯(cuò)誤,并調(diào)整取數(shù)參數(shù)??傊С?selector 的地方都可以響應(yīng)校驗(yàn)錯(cuò)誤,如何使用完全由你決定。
自定義校驗(yàn)規(guī)則
createDesigner 傳遞的中間件可以拓展自定義校驗(yàn)規(guī)則:
import { createMiddleware } from "designer";
const myMiddleware = createMiddleware({
validateRules: {
// 自定義校驗(yàn)規(guī)則,判斷是否為空字符串
isEmptyString: (value, options?: { errorMessage?: string }) => {
if (value === "") {
return true;
}
return options.errorMessage;
},
},
});通過(guò) validateRules 定義自定義校驗(yàn)規(guī)則后,就可以在 valueValidator 中使用了:
const input: ComponentMeta = {
componentName: "input",
element: Input,
valueValidator: () => ({
isEmptyString: {
errorMessage: "字符串必須為空",
},
}),
};用 selector 綁定校驗(yàn)規(guī)則
利用 selector 將校驗(yàn)規(guī)則綁定到任意狀態(tài),比如:
const input: ComponentMeta = {
componentName: "input",
element: Input,
valueValidator: ({ selector }) => selector(({ props }) => props.validator),
};上面的例子,將所有組件名為 input 組件的校驗(yàn)規(guī)則綁定到當(dāng)前組件實(shí)例的 props.validator 上。
const input: ComponentMeta = {
componentName: "input",
element: Input,
valueValidator: ({ selector }) =>
selector(({ state }) => state.validatorInfo),
};上面的例子,將所有組件名為 input 組件的校驗(yàn)規(guī)則綁定綁定到全局狀態(tài) state.validatorInfo 上。
異步校驗(yàn)
將自定義校驗(yàn)函數(shù)定義為異步函數(shù),就可以定義異步校驗(yàn)。
const myMiddleware = createMiddleware({
validateRules: {
isEmptyString: async (value, options?: { errorMessage?: string }) => {
await wait(1000);
if (value === "") {
return true;
}
return options.errorMessage;
},
},
});如上所示,定義了 isEmptyString 的錯(cuò)誤校驗(yàn)規(guī)則,那么當(dāng)校驗(yàn)函數(shù)執(zhí)行完后,在 1s 后將會(huì)出現(xiàn)校驗(yàn)信息。
總結(jié)
組件值校驗(yàn)依然提供了強(qiáng)大的靈活拓展性,以下幾種定制能力相互正交,將靈活性成倍放大:
valueValidator利用selector綁定任意值,這樣既可以定義固定的校驗(yàn)規(guī)則,也可以定義跟隨全局狀態(tài)變化的校驗(yàn)規(guī)則,也可定義跟隨當(dāng)前組件實(shí)例 props 變化的校驗(yàn)規(guī)則。- 在此基礎(chǔ)上,還可以自定義校驗(yàn)規(guī)則,且支持異步校驗(yàn)。
- 更精彩的是,對(duì)值校驗(yàn)失敗時(shí),如何處理校驗(yàn)失敗的表現(xiàn)交給了業(yè)務(wù)層。我們?cè)俅我劳袕?qiáng)大的
selector設(shè)計(jì),將校驗(yàn)錯(cuò)誤傳給selector,就讓校驗(yàn)錯(cuò)誤的用法產(chǎn)生了無(wú)限可能。比如用在runtimeProps可以讓渲染響應(yīng)校驗(yàn)錯(cuò)誤,用在fetcher可以讓查詢響應(yīng)校驗(yàn)錯(cuò)誤。
討論地址是:精讀《組件值校驗(yàn)》· Issue #473 · dt-fe/weekly
以上就是前端可視化搭建組件值校驗(yàn)規(guī)則詳解的詳細(xì)內(nèi)容,更多關(guān)于前端可視化組件值校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ECMAScript 6對(duì)象的擴(kuò)展實(shí)現(xiàn)示例
這篇文章主要為大家介紹了ECMAScript 6對(duì)象的擴(kuò)展實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
自定義range?sliders滑塊實(shí)現(xiàn)元素拖動(dòng)方法
這篇文章主要為大家介紹了自定義range?sliders滑塊實(shí)現(xiàn)元素拖動(dòng)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
bigScreen大屏配置選項(xiàng)無(wú)法和畫布中心的展示聯(lián)動(dòng)解決
這篇文章主要為大家介紹了bigScreen大屏配置選項(xiàng)無(wú)法和畫布中心的展示聯(lián)動(dòng)解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
微信小程序返回多級(jí)頁(yè)面的實(shí)現(xiàn)方法
這篇文章主要介紹了微信小程序返回多級(jí)頁(yè)面的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10
Flutter?WebView性能優(yōu)化使h5像原生頁(yè)面一樣優(yōu)秀
這篇文章主要為大家介紹了Flutter?WebView性能優(yōu)化使h5像原生頁(yè)面一樣優(yōu)秀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
JS封裝轉(zhuǎn)換前后端接口數(shù)據(jù)格式工具函數(shù)下劃線<=>大寫
這篇文章主要為大家介紹了JS優(yōu)雅封裝轉(zhuǎn)換前后端接口數(shù)據(jù)格式工具函數(shù)下劃線<=>大寫實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

