antd组件库与TypeScript开发总结之问题解决一:Form表单报错

最近常使用ant design pro框架开发项目,画页面时主要用了antd组件库,常遇到些问题,分享一下解决方法。

1、使用getFieldDecorator时报错getFieldDecorator is not defined:

页面报错:ReferenceError: getFieldDecorator is not defined, 控制台报错:OpinionsComp.tsx:80 Uncaught ReferenceError: getFieldDecorator is not defined
解决方法:
(1)引入FormComponentProps :import { FormComponentProps } from 'antd/lib/form';
(2)使用ts定义类型时继承刚才的引入模块,如果没有使用ts,可以忽略该步骤:

interface Props extends FormComponentProps {
...
}
class Comp extends React.Component<Props, State>{...}//泛型继承上面的Props和State

(3)并在render函数中定义:

render() {
    const {
      form: { getFieldDecorator },
    } = this.props;
 }

(4)使用 Form.create() 包裹,不能直接export:
export default Form.create()(组件名)

2、在父组件中使用子组件,子组件名ts验证被划波浪线:

父组件中的调用,Request 是自己封装的子组件:

<Request 
            onCancel={this.cancelFirForm}
 />

(1)定位到子组件内部,在Props中定义父组件中使用的属性:

interface Props extends FormComponentProps {
	onCancel?:Function;//定义类型,不使用ts的伙伴可以忽略
}

(2)在Form.create()的圆括号前面添加<Props>

export default Form.create<Props>()(
  connect()(Comp)
);

3、表单中嵌套子表单时(子表单是封装的子组件),提交时子表单不被验证:

我这里的情形是子表单里的必填项没有被验证到,因为是公司项目,不可截图,这里以文字描述。解决方法:
(1)在父组件中的render函数中写:const {form}=this.props,并在使用子表单组件时,添加一个自定义属性:

<FormAddCom 
            formInstances={form}//form就是上面定义的常量
 />

FormAddCom 是我自定义的子组件。
(2)定位到子组件FormAddCom 内部,在Props中定义父组件中使用的属性formInstances:

interface Props extends FormComponentProps {
	formInstances?:any;//ts定义类型,不使用ts的伙伴可以忽略
}
class FormAddCom extends React.Component<Props>{...}

FormComponentProps是上面第一个报错类型中解释过要引入的表单模块。
(3)在render函数中使用:

render() { 
    const {formInstances:{getFieldDecorator}}=this.props;
    }

这样就可以被验证了。不要忘记第一种报错,再去检查一遍是否缺少代码。

这里我没有显示state,只为了更好的说明上述三个问题,state正常使用。如果有问题可以下方留意,看到会回复。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
是的,Antd组件Form表单组件提供了rules验证功能,该功能可以在用户输入内容时进行实时验证,并在输入框下方提示错误信息。如果您希望在用户输入内容之后才进行验证,可以使用Form的submit方法来触发验证,而不是使用实时验证。例如: ```jsx import { Form, Input, Button } from 'antd'; const Demo = () => { const onFinish = (values) => { console.log('Success:', values); }; const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); }; return ( <Form name="basic" initialValues={{ remember: true }} onFinish={onFinish} onFinishFailed={onFinishFailed} > <Form.Item label="Username" name="username" rules={[{ required: true, message: 'Please input your username!' }]} > <Input /> </Form.Item> <Form.Item label="Password" name="password" rules={[{ required: true, message: 'Please input your password!' }]} > <Input.Password /> </Form.Item> <Form.Item> <Button type="primary" htmlType="submit"> Submit </Button> </Form.Item> </Form> ); }; ``` 在上面的例子中,Form组件的onFinish和onFinishFailed方法分别在表单提交成功和失败时被调用。如果您希望在用户提交表单之前进行验证,您可以在onFinish方法中手动触发表单验证,如下所示: ```jsx const onFinish = (values) => { form .validateFields() .then(() => { console.log('Success:', values); }) .catch((errorInfo) => { console.log('Failed:', errorInfo); }); }; ``` 这将使Form组件在提交表单之前进行验证,并根据验证结果调用相应的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清颖~

您的鼓励让我们一起进步,加油!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值