antd form表單中如何嵌套自定義組件
前言
當(dāng)某些自定義的組合類組件,也希望能進(jìn)行表單元素的校驗(yàn),以及利用antd的form表單實(shí)例進(jìn)行數(shù)據(jù)的修改或者數(shù)據(jù)獲取,這招便可以派上用場啦~
表單部分
<Form.Item label="周期" labelAlign="right">
{getFieldDecorator('cycle', {
rules: [{ required: true, validator: checkCycle }],
initialValue: cycle,
})(<CycleInput cycleOptions={cycleOptions} />)}
</Form.Item>
表單部分可以引入自定義的校驗(yàn)邏輯,如上面的checkCycle :
可以像下面這樣,通過Promise.reject()返回錯(cuò)誤校驗(yàn)提示,通過Promise.resolve()正確通過校驗(yàn)。
/** 校驗(yàn)生命周期輸入內(nèi)容 */
const checkCycle = useCallback((_, value) => {
const format = value?.split(' ');
if (!format) return Promise.reject(new Error('周期不可為空!'));
/** always 永久保存選項(xiàng) */
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 的數(shù)字!'));
}, []);
有關(guān)校驗(yàn)的內(nèi)容,antd也是參考一個(gè)成熟的庫 async-validator,上面這種寫法可以參考文檔這塊 asyncValidator
如果懶得看文檔直接看圖:

大概意思就是說,可以通過兩種方式來實(shí)現(xiàn)一些異步校驗(yàn):
(1)可以通過調(diào)用callback,即asyncValidator的第三個(gè)參數(shù),來完成校驗(yàn)
(2)可以通過返回Promise,來完成校驗(yàn)
自定義組件
注意value是該表單域的值,onChange是對應(yīng)可以改變該表單域的值的方法
const CycleInput = ({ value, onChange, cycleOptions }) => {
const format = value?.split?.(' ');
const num = format?.[0];
const type = format?.[1];
const triggerChange = changedValue => {
onChange && onChange(changedValue);
};
/** 根據(jù)后端接口返回的數(shù)據(jù),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參數(shù)可以展示組件的值,通過onChange方法,可以改變表單域的值,實(shí)現(xiàn)了表單帶給我們的便捷功能。到此結(jié)束啦,快試試吧,實(shí)踐出真知呀!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)前端保持篩選條件到url并進(jìn)行同步參數(shù)設(shè)計(jì)
這篇文章主要為大家介紹了vue實(shí)現(xiàn)前端保持篩選條件到url并進(jìn)行同步參數(shù)設(shè)計(jì)思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
詳解webpack編譯多頁面vue項(xiàng)目的配置問題
本篇文章主要介紹了詳解webpack編譯多頁面vue項(xiàng)目的配置問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
詳解vuex 中的 state 在組件中如何監(jiān)聽
本篇文章主要介紹了詳解vuex 中的 state 在組件中如何監(jiān)聽,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
Vue動(dòng)態(tài)生成el-checkbox點(diǎn)擊無法賦值的解決方法
這篇文章主要給大家介紹了關(guān)于Vue動(dòng)態(tài)生成el-checkbox點(diǎn)擊無法賦值的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02

