最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

antd form表單中如何嵌套自定義組件

 更新時(shí)間:2023年03月12日 14:35:23   作者:wuliCaibao  
這篇文章主要介紹了antd form表單中如何嵌套自定義組件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

當(dāng)某些自定義的組合類組件,也希望能進(jìn)行表單元素的校驗(yàn),以及利用antd的form表單實(shí)例進(jìn)行數(shù)據(jù)的修改或者數(shù)據(jù)獲取,這招便可以派上用場(chǎng)啦~

表單部分

<Form.Item label="周期" labelAlign="right">
    {getFieldDecorator('cycle', {
        rules: [{ required: true, validator: checkCycle }],
        initialValue: cycle,
    })(<CycleInput cycleOptions={cycleOptions} />)}
</Form.Item>

表單部分可以引入自定義的校驗(yàn)邏輯,如上面的checkCycle :

可以像下面這樣,通過(guò)Promise.reject()返回錯(cuò)誤校驗(yàn)提示,通過(guò)Promise.resolve()正確通過(guò)校驗(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('請(qǐng)選擇周期!'));
     }
     const num = +format[0];
     if (num > 0 && format[1]) {
         return Promise.resolve();
     }
     return Promise.reject(new Error('請(qǐng)輸入大于 0 的數(shù)字!'));
 }, []);

有關(guān)校驗(yàn)的內(nèi)容,antd也是參考一個(gè)成熟的庫(kù) async-validator,上面這種寫法可以參考文檔這塊 asyncValidator

如果懶得看文檔直接看圖:

asyncValidator的用法

大概意思就是說(shuō),可以通過(guò)兩種方式來(lái)實(shí)現(xiàn)一些異步校驗(yàn):

(1)可以通過(guò)調(diào)用callback,即asyncValidator的第三個(gè)參數(shù),來(lái)完成校驗(yàn)

(2)可以通過(guò)返回Promise,來(lái)完成校驗(yàn)

自定義組件

注意value是該表單域的值,onChange是對(duì)應(yīng)可以改變?cè)摫韱斡虻闹档姆椒?/p>

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>
    );
};

可以看出,自定義部分邏輯也比較簡(jiǎn)單,通過(guò)value參數(shù)可以展示組件的值,通過(guò)onChange方法,可以改變表單域的值,實(shí)現(xiàn)了表單帶給我們的便捷功能。到此結(jié)束啦,快試試吧,實(shí)踐出真知呀!

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue單向數(shù)據(jù)流的深入理解

    vue單向數(shù)據(jù)流的深入理解

    隨著前端的項(xiàng)目的越來(lái)越復(fù)雜,出現(xiàn)了一堆概念來(lái)降低開發(fā)的復(fù)雜性,單向數(shù)據(jù)流就是其中一個(gè),下面這篇文章主要給大家介紹了關(guān)于vue單向數(shù)據(jù)流的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • vue實(shí)現(xiàn)前端保持篩選條件到url并進(jìn)行同步參數(shù)設(shè)計(jì)

    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編譯多頁(yè)面vue項(xiàng)目的配置問(wèn)題

    詳解webpack編譯多頁(yè)面vue項(xiàng)目的配置問(wèn)題

    本篇文章主要介紹了詳解webpack編譯多頁(yè)面vue項(xiàng)目的配置問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 詳解vuex 中的 state 在組件中如何監(jiān)聽(tīng)

    詳解vuex 中的 state 在組件中如何監(jiān)聽(tīng)

    本篇文章主要介紹了詳解vuex 中的 state 在組件中如何監(jiān)聽(tīng),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Vue Ajax跨域請(qǐng)求實(shí)例詳解

    Vue Ajax跨域請(qǐng)求實(shí)例詳解

    這篇文章主要介紹了Vue Ajax跨域請(qǐng)求實(shí)例詳解,需要的朋友可以參考下
    2017-06-06
  • 用Vue實(shí)現(xiàn)頁(yè)面訪問(wèn)攔截的方法詳解

    用Vue實(shí)現(xiàn)頁(yè)面訪問(wèn)攔截的方法詳解

    大家在做前端項(xiàng)目的時(shí)候,大部分頁(yè)面, 游客都可以直接訪問(wèn) , 如遇到 需要登錄才能進(jìn)行的操作,頁(yè)面將提示并跳轉(zhuǎn)到登錄界面,那么如何才能實(shí)現(xiàn)頁(yè)面攔截并跳轉(zhuǎn)到對(duì)應(yīng)的登錄界面呢,本文小編就來(lái)給大家介紹一下Vue實(shí)現(xiàn)頁(yè)面訪問(wèn)攔截的方法,需要的朋友可以參考下
    2023-08-08
  • vue使用highcharts自定義儀表盤圖表

    vue使用highcharts自定義儀表盤圖表

    這篇文章主要為大家詳細(xì)介紹了vue使用highcharts自定義儀表盤圖表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue中正確使用jsx語(yǔ)法的姿勢(shì)分享

    vue中正確使用jsx語(yǔ)法的姿勢(shì)分享

    這篇文章主要給大家介紹了關(guān)于vue中正確使用jsx的相關(guān)資料,JSX就是Javascript和XML結(jié)合的一種格式,React發(fā)明了JSX,利用HTML語(yǔ)法來(lái)創(chuàng)建虛擬DOM,當(dāng)遇到<,JSX就當(dāng)HTML解析,遇到{就當(dāng)JavaScript解析,需要的朋友可以參考下
    2021-07-07
  • Vue動(dòng)態(tài)生成el-checkbox點(diǎn)擊無(wú)法賦值的解決方法

    Vue動(dòng)態(tài)生成el-checkbox點(diǎn)擊無(wú)法賦值的解決方法

    這篇文章主要給大家介紹了關(guān)于Vue動(dòng)態(tài)生成el-checkbox點(diǎn)擊無(wú)法賦值的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • vue2.0父子組件間通信的實(shí)現(xiàn)方法

    vue2.0父子組件間通信的實(shí)現(xiàn)方法

    本篇文章主要介紹了vue2.0父子組件間通信的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04

最新評(píng)論

汶上县| 托克逊县| 贡山| 沭阳县| 禹州市| 兰西县| 和平县| 蓝山县| 浠水县| 洪湖市| 长葛市| 阜新市| 囊谦县| 綦江县| 乳山市| 宁蒗| 德令哈市| 大新县| 和龙市| 安国市| 奉节县| 伊金霍洛旗| 得荣县| 漳平市| 庄浪县| 德保县| 阜城县| 阳新县| 健康| 武平县| 景泰县| 肥城市| 安康市| 舒兰市| 云浮市| 山西省| 宁都县| SHOW| 垦利县| 长顺县| 卢龙县|