雖然 react 沒有內置的表單驗證邏輯,可是咱們可使用 react 組件庫 AntDesign 中的表單組件 Form
來實現這一需求。前端
具體地, AntDesign 中的表單組件 Form
與表單域 Form.Item
(用於包裹任意輸入控制的容器)配合使用:react
Form.Item
中設置校驗規則,在表單提交或表單輸入變化時,經過執行 this.props.form.validateFields()
來實現表單值的校驗。Form.Item
中放置一個被 getFieldDecorator
註冊的表單控件(子元素)來實現表單控件與表單的雙向綁定,實現表單值的收集。使用 Form
自帶的自動收集數據和校驗功能的關鍵是須要使用 Form.create()
包裝組件(傳送門👉AntDesign 官方文檔)。函數
Form.create()
是一個高階函數,經過傳入一個 react 組件,返回一個新的具備註冊、收集、校驗功能的 react 組件。使用方式以下:post
class CustomizedForm extends React.Component {} CustomizedForm = Form.create({})(CustomizedForm); export default CustomizedForm; 複製代碼
Form.create()
包裝過的組件會自帶 this.props.form
屬性,該屬性提供了許多 API 來處理數據,如上面介紹的 getFieldDecorator
方法 則是用於和表單進行雙向綁定。組件一旦通過 getFieldDecorator
的修飾,那麼該組件的值將徹底由 Form
接管。Form.create()
包裝組件的目的就是爲了使用第一種方式更新被包裝組件:
getFieldDecorator
修飾過的組件觸發onChange事件
,便會觸發這個父組件的的更新(forceUpdate),從而促使被包裝組件的更新。Form.create({})(CustomizedForm)
, CustomizedForm
就是咱們所說的被包裝組件。this.props.form
屬性提供的幾種 API 和使用方法,其餘 API 可具體查看文檔(傳送門👉AntDesign 官方文檔)。getFieldDecorator
方法的目的是爲了把須要收集的數據在實例中進行註冊,並把註冊的值同步到被 getFieldDecorator
修飾的表單控件上,因此該控件不能再經過 value
或 defaultValue
賦值,它的狀態將所有由 getFieldDecorator
託管,默認值設置能夠用 getFieldDecorator
裏的 initialValue
。 使用方式以下:// 語法:getFieldDecorator(id, options) <Form.Item {...layout} label="題目" extra={titleExtra}> {getFieldDecorator('name', { rules: [ { required: true, message: '記得填寫題目' }, { whitespace: true, message: '記得填寫題目' }, ], initialValue: name, // 默認值設置 })(<Input allowClear={true}/>)} </Form.Item> 複製代碼
getFieldValue
方法的做用是獲取一個輸入控件的值。使用方法以下:let options = this.props.form.getFieldValue('name'); // 使用getFieldDecorator方法修飾的id爲'name'的表單控件 複製代碼
setFieldsValue
方法用於動態設置一組輸入控件的值(⚠️注意:不要在 componentWillReceiveProps
內使用,不然會致使死循環)。使用方法以下:// 設置使用getFieldDecorator方法修飾的id爲'name'的表單控件的值 this.props.form.setFieldsValue({ name: undefined }); 複製代碼
validateFields
方法用於校驗並獲取一組輸入域的值與錯誤,使用方法以下(若 fieldNames 參數爲空,則校驗所有組件):/* 類型: ( [fieldNames: string[]], [options: object], callback(errors, values) ) => void */ const { form: { validateFields } } = this.props; validateFields((errors, values) => { // ... }); validateFields(['field1', 'field2'], (errors, values) => { // ... }); validateFields(['field1', 'field2'], options, (errors, values) => { // ... }); // 經過 validateFields 方法驗證表單是否完成填寫,經過便提交添加操做。 handleOk = () => { const { dispatch, form: { validateFields } } = this.props; validateFields((err, values) => { if (!err) { dispatch({ type: 'cards/addOne', payload: values, }); // 重置 `visible` 屬性爲 false 以關閉對話框 this.setState({ visible: false }); } }); } 複製代碼
getFieldDecorator(id, options)
方法中傳入的校驗規則參數 options.rules
來實現,下面就爲你們整理了一下 AntDesign 中經常使用的幾種表單輸入格式驗證。{getFieldDecorator('name', { rules: [{ required: true, message: '名稱不能爲空', }], })(<Input placeholder="請輸入名稱" />)} 複製代碼
{getFieldDecorator('password', { rules: [{ required: true, message: '密碼不能爲空', }, { min:4, message: '密碼不能少於4個字符', }, { max:6, message: '密碼不能大於6個字符', }], })(<Input placeholder="請輸入密碼" type="password"/>)} 複製代碼
{getFieldDecorator('nickname', { rules: [{ required: true, message: '暱稱不能爲空', }, { len: 4, message: '長度需4個字符', }], })(<Input placeholder="請輸入暱稱" />)} 複製代碼
{getFieldDecorator('passwordcomfire', { rules: [{ required: true, message: '請再次輸入密碼', }, { validator: passwordValidator }], })(<Input placeholder="請輸入密碼" type="password"/>)} // 密碼驗證 const passwordValidator = (rule, value, callback) => { const { getFieldValue } = form; if (value && value !== getFieldValue('password')) { callback('兩次輸入不一致!') } // 必須老是返回一個 callback,不然 validateFields 沒法響應 callback(); } 複製代碼
{getFieldDecorator('nickname', { rules: [{ whitespace: true, message: '不能輸入空格', } ], })(<Input placeholder="請輸入暱稱" />)} 複製代碼
{getFieldDecorator('age', { rules: [{ message:'只能輸入數字', pattern: /^[0-9]+$/ }], })(<Input placeholder="請輸入數字" />)} 複製代碼