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

字節(jié)封裝React組件手機號自動校驗格式FormItem

 更新時間:2022年08月16日 14:43:27   作者:一袋米要扛幾樓  
這篇文章主要為大家介紹了字節(jié)封裝React組件手機號自動校驗格式FormItem,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Situation 背景

  • 多人開發(fā)的老項目里面,很多地方都寫了驗證手機格式的需求,代碼各有千秋、百花齊放
  • 實現(xiàn):有的寫在公共組件庫里,有的是單獨開發(fā)局部組件支持,有的直接手寫不復用,有的抽離正則到utils再引入
  • 正則:正則校驗也各有千秋,比如/^\d{11}/、/1\d10/、/1[2−9]\d9/、/^1\d{10}/、/^1[2-9]\d{9}/、/1\d10/、/1[2−9]\d9/、/^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/等等。
  • 長度限制:有的地方限制maxLength=11,而有的地方?jīng)]限制
  • 輸入格式:有的地方滿足334格式(181 2222 3333)手機號碼輸入, 而有的地方只允許輸入純數(shù)字

Target 目標

  • 實現(xiàn)一個易用的手機號碼公共組件
  • 使用較為寬松的正則校驗并與后端達成一致
  • 不再限制輸入長度但會報錯提示
  • 支持334的格式輸入,并自動去除所有空格
  • 寫好參數(shù)說明,方便開發(fā)使用
  • 盡可能的保持靈活,適用更多場景

Action 行動

import type {
  FormItemProps,
  InputProps,
  RulesProps,
} from '@arco-design/web-react';
import { Form, Input } from '@arco-design/web-react';
import { usePersistCallback } from '@byted/hooks';
import type { ReactNode } from 'react';
import { useMemo } from 'react';
export type VerifyInputProps = {
  /** ?? 綁定屬性 */
  field: string;
  /** ?? 顯示標簽文字 */
  label: string;
  /** 標簽前面是否顯示必填*號 */
  labelRequired?: boolean;
  /** ?? rules是否加入必填校驗(為true時無需再設置labelRequired=true) */
  phoneRequired?: boolean;
  /** 除檢驗手機號格式外其他規(guī)則,默認添加正則檢驗/^1[2-9]\d{9}$/ */
  rules?: RulesProps<any>[];
  /** 顯示提示文字 */
  placeholder?: string;
  /** 是否禁用input */
  disabled?: boolean;
  /** phone輸入框onChange事件 */
  onChange?: InputProps['onChange'];
  /** FormItem其他屬性 */
  formItemProps?: FormItemProps;
  /** Input其他屬性 */
  inputProps?: InputProps;
};
/** 手機號表單(帶有 Form.Item) */
export const VerifyPhoneInput = (props: VerifyInputProps) => {
  const {
    field,
    label,
    placeholder,
    rules = [],
    labelRequired = false,
    phoneRequired = false,
    disabled,
    onChange,
    formItemProps,
    inputProps,
  } = props;
  const resultRules = useMemo(() => {
    const arr = [
      {
        validator(val: string | undefined, cb: (error?: ReactNode) => void) {
          const realVal = (`${val}` as any).replaceAll(' ', '');
          if (!val || /^1[2-9]\d{9}$/.test(realVal)) {
            cb();
          } else {
            cb(`請輸入正確的${label}`);
          }
        },
      },
      ...rules,
    ];
    if (phoneRequired) {
      arr.unshift({
        validator(val: string | undefined, cb: (error?: ReactNode) => void) {
          if (!val) {
            cb(`請輸入${label}`);
          } else {
            cb();
          }
        },
      });
    }
    return arr;
  }, [rules, phoneRequired, label]);
  const normalize = usePersistCallback((val: string | undefined) => {
    if (val) {
      const realVal = (`${val}` as any).replaceAll(' ', '');
      if (val !== realVal) {
        return realVal;
      }
    }
    return val;
  });
  const resultInputProps = {
    disabled,
    onChange,
    allowClear: true,
    placeholder: placeholder || `請輸入${label}`,
    ...inputProps,
  };
  return (
    <Form.Item
      required={labelRequired || phoneRequired}
      field={field}
      label={label}
      formatter={normalize}
      rules={resultRules}
      {...formItemProps}
    >
      <Input {...resultInputProps} />
    </Form.Item>
  );
};
  • 定義入?yún)㈩愋蚔erifyInputProps,并按使用頻率對屬性排序并加以說明
  • 將是否必填從rules中移出變成phoneRequired參數(shù),錯誤提示也根據(jù)label自動拼接請輸入正確的${label},封裝復雜、暴露簡單
  • placeholder默認根據(jù)label自動拼接成(請輸入${label}),提高易用性
  • 將FormItem其他屬性收斂到formItemProps中,方便開發(fā)同學擴展,提高通用性
  • 默認allowClear=true,可以通過inputProps進行覆蓋
  • 通過formatter自動去掉所有空格,支持334格式
  • 將Input其他屬性收斂到inputProps中,方便開發(fā)同學擴展,提高通用性
  • 暴露rules,支持自定義遠程驗證等規(guī)則
  • 暴露常用的disabled、onChange在最外層方便使用

Result 結果

  • 已經(jīng)投入使用,測試符合預期,提供給其他同事使用,后續(xù)繼續(xù)完善

Review 復盤

  • 問題1:使用normalize去空格后,input下面的錯誤驗證并沒有重新觸發(fā)導致輸入框數(shù)據(jù)已經(jīng)是對的,而錯誤提示還存在的現(xiàn)象。
    • 解決:第一種方案將form傳入,在formatter之后通過form?.validate(field)來重新觸發(fā)驗證;第二種方案將rules改為validator的實現(xiàn)方式手動去空格。不希望引入更多參數(shù),最終采用第二種。
  • 問題2:正則格式到底怎么定義才能平衡正確性和普適性
    • 解決:和后端協(xié)商使用適用目前所有可見場景下的最嚴格的驗證格式/^1[2-9]\d{9}$/
  • 問題3:老代碼治理
    • 解決:一次性將所有手機號碼相關的代碼全部改掉,需要測試介入帶來大量的回歸測試時間,而收益很小。所以新需求使用此組件,老需求改動的時候再改成此組件的方案代價更小。
  • 問題4:還能再豐富一哈嗎?
    • 支持151****2222的顯示與編輯時未修改不校驗,保證手機號私密性
  • 問題5:VerifyPhoneInput實際是個FormItem組件,且api與FormItem原本的有很大區(qū)別,會不會給使用者帶來心智負擔?
    • 解決:
import type { FormItemProps, InputProps } from '@arco-design/web-react';
import { Form, Input } from '@arco-design/web-react';
import { usePersistCallback } from '@byted/hooks';
import type { ReactNode } from 'react';
import { useMemo } from 'react';
const defaultLabel = '手機號碼';
export type PhoneFormItemProps = {
  /** ?? rules是否加入必填校驗(為true時無需再設置labelRequired=true) */
  phoneRequired?: boolean;
  /** ?? rules是否加入正則校驗(/^1[2-9]\d{9}$/),默認true */
  phoneFormatCheck?: boolean;
  /** Input其他屬性 */
  inputProps?: InputProps;
} & FormItemProps;
/** 手機號表單(帶有 Form.Item) */
export const PhoneFormItem = (props: PhoneFormItemProps) => {
  const {
    phoneRequired = false,
    phoneFormatCheck = true,
    inputProps,
    ...formItemProps
  } = props;
  const resultRules = useMemo(() => {
    const arr = [...(formItemProps.rules || [])];
    if (phoneFormatCheck) {
      arr.unshift({
        validator(val: string | undefined, cb: (error?: ReactNode) => void) {
          const realVal = (`${val}` as any).replaceAll(' ', '');
          if (!val || /^1[2-9]\d{9}$/.test(realVal)) {
            cb();
          } else {
            cb(`請輸入正確的${formItemProps?.label || defaultLabel}`);
          }
        },
      });
    }
    if (phoneRequired) {
      arr.unshift({
        validator(val: string | undefined, cb: (error?: ReactNode) => void) {
          if (!val) {
            cb(`請輸入${formItemProps.label || defaultLabel}`);
          } else {
            cb();
          }
        },
      });
    }
    return arr;
  }, [
    formItemProps.rules,
    formItemProps.label,
    phoneFormatCheck,
    phoneRequired,
  ]);
  const normalize = usePersistCallback((val: string | undefined) => {
    if (val) {
      const realVal = (`${val}` as any).replaceAll(' ', '');
      if (val !== realVal) {
        return realVal;
      }
    }
    return val;
  });
  const resultInputProps = {
    allowClear: true,
    ...inputProps,
    placeholder:
      inputProps?.placeholder || `請輸入${formItemProps.label || defaultLabel}`,
  };
  return (
    <Form.Item
      normalize={normalize}
      rules={resultRules}
      {...formItemProps}
      required={formItemProps.required || phoneRequired}
    >
      <Input {...resultInputProps} />
    </Form.Item>
  );
};

以前都是用vue,來字節(jié)之后天天react,感覺自己變菜了好多,又或許我原本就菜的離譜。

以上就是字節(jié)封裝React組件手機號自動校驗格式FormItem的詳細內容,更多關于React封裝手機號校驗格式的資料請關注腳本之家其它相關文章!

相關文章

  • React + webpack 環(huán)境配置的方法步驟

    React + webpack 環(huán)境配置的方法步驟

    本篇文章主要介紹了React + webpack 環(huán)境配置的方法步驟,詳解的介紹了開發(fā)環(huán)境的配置搭建,有興趣的可以了解一下
    2017-09-09
  • React中style的使用及注意事項(推薦)

    React中style的使用及注意事項(推薦)

    React中style的使用和直接在HTML中使用有些不同,第一,React中必須是style="opacity:{this.state.opacity};"這種寫法,第二如果設置多個style格式如下,多個style中間使用逗號分割,這篇文章主要介紹了React中style的使用注意事項,需要的朋友可以參考下
    2023-02-02
  • 詳解React項目的服務端渲染改造(koa2+webpack3.11)

    詳解React項目的服務端渲染改造(koa2+webpack3.11)

    本篇文章主要介紹了詳解React項目的服務端渲染改造(koa2+webpack3.11),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • React ant 點擊導航條閃爍問題解決

    React ant 點擊導航條閃爍問題解決

    很多小伙伴反饋React ant 點擊導航條閃爍,沒有傳遞具體的參數(shù)給點擊事件 , 導致在函數(shù)內部無法準確判斷要展示哪個子菜單,可能導致頁面狀態(tài)的短暫變化,出現(xiàn)閃爍效果,下面給大家分享解決方法,感興趣的的朋友跟隨小編一起看看吧
    2024-04-04
  • React使用UI(Ant?Design)框架的詳細過程

    React使用UI(Ant?Design)框架的詳細過程

    Ant?Design主要用于中后臺系統(tǒng)的使用,它提供了豐富的組件和工具,可以幫助開發(fā)人員快速構建出美觀、易用的界面,同時,Ant?Design還提供了詳細的文檔和示例,方便開發(fā)者學習和使用,這篇文章主要介紹了React使用UI(Ant?Design)框架,需要的朋友可以參考下
    2023-12-12
  • React中useEffect函數(shù)的使用詳解

    React中useEffect函數(shù)的使用詳解

    useEffect是React中的一個鉤子函數(shù),用于處理副作用操作,這篇文章主要為大家介紹了React中useEffect函數(shù)的具體用法,希望對大家有所幫助
    2023-08-08
  • react?+?vite?+?ts項目中優(yōu)雅使用.svg文件

    react?+?vite?+?ts項目中優(yōu)雅使用.svg文件

    這篇文章主要為大家介紹了react?+?vite?+?ts項目中優(yōu)雅使用.svg文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • webpack+react+antd腳手架優(yōu)化的方法

    webpack+react+antd腳手架優(yōu)化的方法

    本篇文章主要介紹了webpack+react+antd腳手架優(yōu)化的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • React根據(jù)配置生成路由的示例代碼

    React根據(jù)配置生成路由的示例代碼

    React路由看似只能由Route組件包裹組件的結構來構成,但是其實也可以通過編寫路由數(shù)組配置然后通過數(shù)組循環(huán)來生成Route組件包裹組件的結構,所以本文給大家介紹了React根據(jù)配置生成路由的方法,需要的朋友可以參考下
    2024-11-11
  • React中useState原理的代碼簡單實現(xiàn)

    React中useState原理的代碼簡單實現(xiàn)

    要實現(xiàn)useState的背后原理,則需要深入了解狀態(tài)是如何在函數(shù)組件的渲染周期中保持和更新的,本文將通過一段代碼簡單闡述useState鉤子函數(shù)的實現(xiàn)思路,希望對大家有所幫助
    2023-12-12

最新評論

九江县| 景宁| 鄂伦春自治旗| 齐河县| 界首市| 门源| 淮阳县| 化州市| 宁波市| 竹溪县| 仁寿县| 安乡县| 临颍县| 德化县| 黎川县| 丽江市| 香格里拉县| 庆阳市| 额敏县| 西吉县| 达孜县| 泰安市| 曲沃县| 涿州市| 扶风县| 永州市| 涞水县| 岳阳县| 河津市| 公安县| 台东县| 德清县| 白银市| 当阳市| 皮山县| 乌兰浩特市| 鄂尔多斯市| 大理市| 商河县| 临夏市| 岳西县|