import { Button, Input } from 'antd'; import React, { useEffect, useRef, useState, useCallback, FunctionComponent, FormEvent } from 'react'; import { registerComponent, XComponent, XForm } from '../packages/react/src/index'; import { IReactComponentProps, IRuleTrigger, ISchema, IValidateResult } from '../packages/types/src/index'; class ClassComponent extends XComponent { constructor(props: IReactComponentProps) { super(props); this.state = { value: this.props.value }; } validate(trigger: IRuleTrigger, value: any) { console.log(trigger, value); } reset() { this.setState({ value: '' }); } onInput(e: any) { const value = e.target.value; this.setState({ value }); this.props.onChange(value); } onBlur() { this.props.onBlur(); } render() { const { value } = this.state; return ( this.onInput(e)} onBlur={() => this.onBlur()}/> ); } } const FunctionComponent: FunctionComponent = ({ field, value: defaultValue, onChange, onBlur }) => { const [value, setValue] = useState(''); const onInput = useCallback( (e: FormEvent) => { const { value } = e.target as HTMLInputElement; // 需要手动触发onChange事件,并且把值传递过去 onChange(value); }, [onChange] ); const onValidate = useCallback(async (trigger, value) => { let message = ''; let valid = true; if (trigger === 'submit' && !Number.isInteger(Number(value))) { valid = false; message = '请输入数字'; } const status = valid ? 'normal' : 'error'; return { valid, message, status } as IValidateResult; },[]); // 需要手动触发onBlur事件,主要用于校验时候的blur场景 const onBlur2 = useCallback(() => { onBlur(); }, [onBlur]); // 触发验证,如果不需要 rules 校验,想要在组件内自行实现错误提示的,可以通过这个事件取到校验的时机 // trigger 类型有 change、submit、blur // 最后需要设置下 valid、message、status // 触发重置,用于获取重置时机,更新组件值 const onReset = useCallback(() => { setValue(''); }, []); // 按照需求自由订阅事件 useEffect(() => { field.onValidate(onValidate); // field.on('VALIDATE', onValidate); field.on('RESET', onReset); return () => { field.removeListener('RESET', onReset); }; }, []); useEffect(() => { setValue(defaultValue); }, [defaultValue]); return ; }; registerComponent('ClassComponent', ClassComponent); registerComponent('FunctionComponent', FunctionComponent); const schema: ISchema = [ { key: 'classComponent', type: 'ClassComponent', ui: { label: '自定义Class组件' }, value: '测试', rules: [ { type: 'email', trigger: 'change', message: '必须为邮箱' } ] }, { key: 'functionComponent', type: 'FunctionComponent', ui: { label: '自定义Function组件' }, value: '测试' } ]; export default function() { const formRef = useRef(null); const onSubmit = () => { formRef.current.submit().then((data: any) => { console.log(data); }); }; const onReset = () => { formRef.current.reset(); }; const onEmpty = () => { formRef.current.empty(); }; return ( <>
); }