【React實踐總結】Form表單即時校驗輸入值(基於Antd Design)

来源:https://www.cnblogs.com/zldmy/archive/2019/09/01/11441866.html
-Advertisement-
Play Games

1.判斷輸入值的長度 1.1 根據輸入值的類型不同,限制輸入值長度不同 此時需要使用自定義的校驗規則。 如長度要求:中文輸入5位,非中文10位 1 <FormItem label="名稱" {...formItemLayout}> 2 {getFieldDecorator('name', { 3 r ...


1.判斷輸入值的長度

1.1 根據輸入值的類型不同,限制輸入值長度不同

此時需要使用自定義的校驗規則。 如長度要求:中文輸入5位,非中文10位
 1 <FormItem label="名稱" {...formItemLayout}>
 2     {getFieldDecorator('name', {
 3         rules: [
 4             {
 5                 required: true,
 6                 message: "名稱不能為空",                                           
 7             },                    
 8             {
 9                 validator: async (rule, value, callback) => {
10                     const reg = new RegExp("[\\u4E00-\\u9FFF]+","g"); //正則校驗
11                     if(reg.test(value) && value.length > 5){
12                         callback("中文最多5位");
13                     }else if(value.length > 10){
14                         callback("非中文最多10位");
15                     } else{
16                         callback();
17                     }                                                                                            
18                 }
19             }
20         ],
21     })(
22         <Input placeholder="這裡輸入名稱" allowClear />,
23     )}
24 </FormItem>

1.2 不對輸入類型做區分,統一設置長度

如:

  • 輸入值長度最少5位,最大10位; 使用現有規則:min ,max
  • 長度只能為10位。 使用現有規則:len
 1 <FormItem label="名稱" {...formItemLayout}>
 2     {getFieldDecorator('name', {
 3         rules: [   
 4             //輸入值長度最少5位,最大10位               
 5             {
 6                min:3
 7                message: "最小5位",    
 8             },                    
 9             {
10                 max:15
11                message: "最大10位",    
12             }
13 
14             //輸入值長度需要為10位
15 //            {
16 //               len:10
17 //               message: "輸入長度不足10位",    
18 //            }
19 
20         ],
21     })(
22         <Input placeholder="這裡輸入名稱" allowClear />,
23     )}
24     </FormItem>

2. 判斷輸入值的有效性

方式一: 最簡單使用getFieldDecorator中的rules驗證

rules中定義校驗規則,message為校驗不通過時的提示文字

1 {getFieldDecorator('inputContent', {
2             rules: [{
3               required: true, 
4               message: '請輸入內容!',
5             }],
6           })(
7             <Input />
8 )}

方式二: 通過validateStatus+help 同時來控制。

antd提供了validateStatus,help,hasFeedback 等屬性,你可以不需要使用 Form.create 和 getFieldDecorator,自己定義校驗的時機和內容。

  • validateStatus: 校驗狀態,可選 'success', 'warning', 'error', 'validating'。
  • hasFeedback:用於給輸入框添加反饋圖標。
  • help:設置校驗文案。
註: 這種校驗方法有一個不足之處,就是不使用getFieldDecorator的話沒辦法設置欄位名,獲取輸入的值的時候不能用getFieldsValue和setFieldsValue等方法對錶單進行賦值和取值。

 例子:同時監測輸入框內容是否為空和是否有效

  • 設置了validateStatus,help,這個就不能使用方式三的validator方式校驗了,會衝突,使得validator不生效。
  • 且文案也只會顯示help設置的提示文案("名稱不能為空"),原先規則設置的message文案(message: "名稱需要輸入!")也不會生效。所以提示文案的變化也就只能用help來設置。
 1 <FormItem {...formItemLayout}
 2     label="名稱"
 3     validateStatus={this.state.showError ? "error" : (   
 4         this.state.inputEmpty? "error":"")}
 5     help={this.state.showError ? "輸入名稱不符合要求" : (
 6         this.state.inputEmpty? "名稱不能為空":"")}
 7 >
 8     {getFieldDecorator('name', {
 9         initialValue: "",
10         rules: [
11             {
12                 required: true,
13                 message: "名稱需要輸入!",
14             },{
15                 validator: async (rule, value, callback) => {
16                     if(!value){
17                         this.setState({
18                             inputEmpty: true
19                         })
20                     }else{
21                         this.setState({
22                             inputEmpty: false
23                         })
24                     }                                                 
25                     
26                 }
27             }                                     
28         ],
29 
30     })(
31         <Input
32             placeholder="這裡輸入名稱"
33             allowClear
34             onBlur={this.handleInputChange} />
35     )
36     }
37 </FormItem>

 輸入框的handleInputChange方法可自行實現,用來校驗輸入值是否符合要

方式三:使用getFieldDecorator的validator自定義校驗

ant.design內部使用了async-validator,通過閱讀async-validator的文檔,瞭解到每個rule其實都是可以定製validator。validator是個函數,其中有三個參數很重要:rule,value和callback。

  • rule:這個是規則,可以不用
  • value:這個是要驗證的值
  • callback:這個是回調函數,驗證出錯後可以把錯誤信息作為參數調用callback

舉例:

 1 <FormItem
 2     label="標簽"
 3     labelCol={{ span: 6 }}
 4     wrapperCol={{ span: 14 }}>
 5     {getFieldDecorator('tags', {
 6         rules: [{
 7             required: true,
 8             type:'array',
 9             message:'必填',
10         },{
11             validator(rule, values, callback){
12                 if(values && values.length>0){
13                     values.map((value,i)=>{
14                         if(value.name.length > 16 ){
15                             callback(`第${i+1}個標簽超過16個字元`);
16                         }else if(value.name.length == 0){    
17                             callback(`第${i+1}個標簽不能為空`);
18                         }else{    
19                             callback();
20                         }
21                     });
22                 }else{
23                     callback();
24                 }
25             }
26         }],
27     })(
28         <MyTag />
29     )}
30 </FormItem>
  還可以寫成:
 1 <FormItem
 2     label="標簽"
 3     labelCol={{ span: 6 }}
 4     wrapperCol={{ span: 14 }}>
 5     {getFieldDecorator('tags', {
 6         rules: [{
 7             required: true,
 8             type:'array',
 9             message:'必填',
10         },{
11             validator: async (rule, value, callback) => {
12                   callback('Something wrong!');
13                 }
14             }
15         }],
16     })(
17         <MyTag />
18     )}
19 </FormItem>

 還有種寫法: 單獨寫一個handleValidator方法來處理

 1 handleValidator = (rule, val, callback) => {
 2         if (!val) {
 3             callback();
 4         }
 5         let validateResult = ...;  // 自定義規則
 6         if (!validateResult) {
 7             callback('請輸入正確的內容!');
 8         }
 9         callback();
10     }
11     
12     
13 {getFieldDecorator('validator', {
14     rules: [{
15         required: true,
16         message: '請輸入內容'
17     }, {
18         validator: this.handleValidator
19     }]
20 })(
21     <input />
22 )}

 註意:一個 Form.Item 建議只放一個被 getFieldDecorator 裝飾過的 child,當有多個被裝飾過的 child 時,help required validateStatus 無法自動生成。此時可用下麵一種方法校驗。


 

       
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 溫習一下js中的迭代方法。 <script type="text/javascript"> var arr = [1, 2, 3, 4, 5, 4, 3, 2, 1]; //所有項為false,則為false //否則直到遍歷到第一個為true的值,返回true //類似於數學里的‘或’ conso ...
  • 前言 上傳文件在開發中是很常見的操作,今天我選擇使用koa-multer中間件來實現這一功能,除了上傳文件外,我還會對文件上傳進行限制,以及發生上傳錯誤時的處理。 由於原來的 koa-multer 已經停止維護,我們要使用最新的 @koa/multer 。這個模塊是 koa-multer 的一個分支 ...
  • 網站是分為網站的前臺和網站的後臺. 前臺--給用戶看的 例如:商城 後臺--給管理員看的 例如:商城後臺 目的:用來添加維護數據 BootStrap:jsp 頁面顯示,效果好,美觀,適合作為用戶界面. EasyUI : jsp頁面,快速開發,格式統一,美觀效果一般. EasyUI裡面有很多組件(功能... ...
  • 一. "Vue的介紹及安裝和導入" 二. "Vue的使用" 三. "Vue成員獲取" 四. "Vue中的迴圈以及修改差值表達式" 五. "vue中methods,computed,filters,watch的總結" 六. "Vue中組件" 七. "Vue中插槽指令" 八. "Vue部分編譯不生效,解 ...
  • 0901自我總結 Vue CLI項目路由案例彙總 router.js components/Nav.vue views/Course.vue components/CourseCard.vue vue <! 邏輯跳轉 {{ card.title }} <! 鏈接跳轉 <! 第一種 <! <route ...
  • 身份互聯網和物聯網之間有什麼區別? 顧名思義,物聯網是關於物的——設備、控制器、致動器等等。但這些東西會執行任務、收集數據、連接到其他設備。換句話說, 每個設備都會有帶多重屬性的一個身份,而這些屬性必須得到良好的理解,才可以驅動好事發生,而阻止壞事降臨。 因此, 身份互聯網IOI (Internet ...
  • 盒子模型:(重點) 盒子模型(CSS框模型)規定了元素框處理元素內容、內邊距、邊框、外邊框等樣式 記住上面這一張圖!一定要記住!一定!一定! 內邊距、邊框和外邊距是可選參數屬性,預設值:0 ;很多元素由用戶代理樣式表設置外邊距和邊框,通過將元素的 margin外邊距和padding內邊距設置為 0 ...
  • jQuery介紹 在說jQuery之前,先說一個概念吧,什麼是JavaScript框架庫,其實就是一個普通的js文件,裡面封裝了很多函數或者說封裝了很多相容的代碼;當然啦,jQuery就是眾多庫的一員,那麼我們為什麼要學習jQuery呢,那就講一下他的特點; 1. 很好的解決了不同瀏覽器之間的相容性 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...