antd form表單中如何嵌套自定義組件
前言
當某些自定義的組合類組件,也希望能進行表單元素的校驗,以及利用antd的form表單實例進行數據的修改或者數據獲取,這招便可以派上用場啦~
表單部分
<Form.Item label="周期" labelAlign="right"> {getFieldDecorator('cycle', { rules: [{ required: true, validator: checkCycle }], initialValue: cycle, })(<CycleInput cycleOptions={cycleOptions} />)} </Form.Item>
表單部分可以引入自定義的校驗邏輯,如上面的checkCycle :
可以像下面這樣,通過Promise.reject()返回錯誤校驗提示,通過Promise.resolve()正確通過校驗。
/** 校驗生命周期輸入內容 */ const checkCycle = useCallback((_, value) => { const format = value?.split(' '); if (!format) return Promise.reject(new Error('周期不可為空!')); /** always 永久保存選項 */ if (format.length < 2 && format[0] === 'always') { return Promise.resolve(); } if (format[1] === 'undefined') { return Promise.reject(new Error('請選擇周期!')); } const num = +format[0]; if (num > 0 && format[1]) { return Promise.resolve(); } return Promise.reject(new Error('請輸入大于 0 的數字!')); }, []);
有關校驗的內容,antd也是參考一個成熟的庫 async-validator,上面這種寫法可以參考文檔這塊 asyncValidator
如果懶得看文檔直接看圖:
大概意思就是說,可以通過兩種方式來實現一些異步校驗:
(1)可以通過調用callback,即asyncValidator的第三個參數,來完成校驗
(2)可以通過返回Promise,來完成校驗
自定義組件
注意value是該表單域的值,onChange是對應可以改變該表單域的值的方法
const CycleInput = ({ value, onChange, cycleOptions }) => { const format = value?.split?.(' '); const num = format?.[0]; const type = format?.[1]; const triggerChange = changedValue => { onChange && onChange(changedValue); }; /** 根據后端接口返回的數據,type 有值,則為 day、week、month、year 其一 */ /** type 若為 undefined,則 num 為 always */ const [cycleOption, setCycleOption] = useState(type ?? num); const [cycleInputValue, setCycleInputValue] = useState( (typeof +num === 'number' && !_.isNaN(+num) && num) || '', ); const onCycleChange = cycleOption => { setCycleOption(cycleOption); triggerChange( cycleOption === 'always' ? cycleOption : `${cycleInputValue} ${cycleOption}`, ); }; const onInputChange = e => { const newNumber = parseInt(e.target.value || '0', 10); if (_.isNaN(newNumber)) { return; } setCycleInputValue(newNumber); triggerChange( cycleOption === 'always' ? cycleOption : `${newNumber} ${cycleOption}`, ); }; return ( <Input.Group> {cycleOption === 'always' ? ( <Select onChange={onCycleChange } defaultValue={cycleOption} style={{ width: 240 }} > {cycleOptions.map(item => ( <Select.Option key={item.value} value={item.value}> {item.label} </Select.Option> ))} </Select> ) : ( <span> <Input value={cycleInputValue} style={{ width: 156 }} onChange={onInputChange} /> <Select onChange={onCycleChange} defaultValue={cycleOption} style={{ width: 84 }} > {cycleOptions.map(item => ( <Select.Option key={item.value} value={item.value}> {item.label} </Select.Option> ))} </Select> </span> )} </Input.Group> ); };
可以看出,自定義部分邏輯也比較簡單,通過value參數可以展示組件的值,通過onChange方法,可以改變表單域的值,實現了表單帶給我們的便捷功能。到此結束啦,快試試吧,實踐出真知呀!
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue2+elementui的el-table固定列會遮住橫向滾動條及錯位問題解決方案
這篇文章主要介紹了vue2+elementui的el-table固定列會遮住橫向滾動條及錯位問題解決方案,主要解決固定列錯位后, 接下來就是把固定列往上提滾動條的高度就不會影響了,需要的朋友可以參考下2024-01-01