import React, { useCallback } from 'react' import { FormState, FieldState, ValueOf } from 'formstate-x' import { observer } from 'mobx-react' import { Tooltip } from 'react-icecream' import { AddThinIcon, CloseThinIcon } from 'react-icecream/icons' import { Form, FormItem, useFormstateX, TextInput } from 'react-icecream/form-x' type NumberState = FieldState // 构造单条手机号对应的表单状态 function createNumberState(initialValue = ''): NumberState { return new FieldState(initialValue).validators(validateNumber) } // 构造手机号列表对应的状态 function createNumbersState() { return new FormState([ createNumberState() ]).validators( numbers => numbers.length > 3 && '最多添加 3 个号码' ) } // 构造表单状态 function createFormState() { return new FormState({ numbers: createNumbersState() }) } // 表单中值的类型 type Value = ValueOf> export default observer(() => { const state = useFormstateX(createFormState, []) const numbersState = state.$.numbers const handleAddNumber = useCallback(() => { numbersState.$.push(createNumberState()) }, [numbersState]) const handleRemoveNumber = useCallback((index: number) => { numbersState.$.splice(index, 1) }, [numbersState]) const handleSubmit = useCallback((value: Value) => { console.log(`Submit with: ${JSON.stringify(value)}.`) return new Promise(resolve => setTimeout(resolve, 2000)) }, []) const numbersLabel = ( 手机号 ) return (
{numbersState.$.map((numberState, i) => (
{numbersState.$.length > 1 && ( handleRemoveNumber(i)} /> )}
))}
) }) function validateNumber(v: string) { if (!v) return '号码不可为空' if (!/^1\d{10}$/.test(v)) return '格式不正确' }