【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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...