reactjs - Ant design 4.0.1 - 从父组件访问类组件内子窗体的方法
问题描述
从 ant v3.x 迁移到 v4.0.1 后,我无法再从其父组件访问子窗体的方法。
在 3.x 版本中,我可以执行类似于以下的操作:
//Parent component - TestParent
import * as React from 'react';
import {createRef} from 'react';
export default class TestParent extends React.Component<{}, {}> {
private formRef = createRef<any>();
getFields = () => {
const {form} = formRef.current.props;
form.validateFields... ///etc
}
render() {
return (
<FormComponent
wrappedComponentRef={this.formRef}
/>
<Button onClick={() => {this.getFields()}>Button<Button/>
);
}
}
//Child component - FormComponent
import React from 'react';
import {Input, Form} from 'antd';
interface IProps {
form: any;
}
class FormComponentContainer extends React.Component<Props, {}> {
constructor(props: IProps) {
super(props);
}
render() {
const {form} = this.props;
const {getFieldDecorator} = form;
return (
<Form>
<Form.Item label="Full Name" colon={false}>
{getFieldDecorator('name', {
rules: [{required: true, message: 'Please enter your name'}]
})(<Input placeholder="Please enter your name" />)}
</Form.Item>
</Form>
);
}
}
export const FormComponent: any = Form.create<Props>({
name: 'form'
})(FormComponentContainer);
我可以使用formRef
.
但是,自从迁移到 ant 4.0.1 后,我无法再使用ref
新 Form 组件上的 prop 访问表单字段:
//Parent component - TestParent
import * as React from 'react';
import {createRef} from 'react';
export default class TestParent extends React.Component<{}, {}> {
private formRef = createRef<any>();
getFields = () => {
const {form} = formRef.current.props;
form.validateFields... ///etc
}
render() {
return (
<FormComponent
formRef={this.formRef}
/>
<Button onClick={() => {this.getFields()}>Button<Button/>
);
}
}
//Child component - FormComponent
import React from 'react';
import {Input, Form} from 'antd';
interface Props {
formRef: any;
}
export default class FormComponentContainer extends React.Component<Props, {}> {
constructor(props: Props) {
super(props);
}
render() {
return (
<Form ref={this.props.formRef}>
<Form.Item
label="Full Name"
colon={false}
name="name"
rules={[{required: true, message: 'Please enter your name'}]}
>
<Input placeholder="Please enter your name" />
</Form.Item>
</Form>
);
}
}
有什么我想念的吗?父级和子级都需要是类组件,而不是功能组件。
解决方案
如果这是在您的最终代码中,则不是,
但
formRef.current
已经是 ref 的形式,
所以使用它应该只是
getFields = () => {
const form = formRef.current;
form.validateFields... ///etc
}
见https://ant.design/components/form/#components-form-demo-control-ref
此外,如果您只想验证,您可以使用新的onFinish
回调
推荐阅读
- css - 我想在不使用 vanilla CSS 的情况下将字体真棒图标(如星星颜色)更改为红色(默认为黑色)
- python - Discord.py - 如何获取与我的机器人在语音频道中的所有成员的数量?
- vaadin - 编辑网格时是否可以在 GridPro 上的 Vaadin 14 中显示保存/取消按钮
- c - strace:ld-linux 无法运行简单的测试二进制文件
- google-cloud-functions - 当我们在firebase功能+带有缓存的firebase托管上部署服务器端渲染(例如nuxt ssr)时如何解决版本不匹配问题
- sas - 数据步骤内的宏执行
- php - Content-Disposition 不接受变量
- angular - 我是否需要完成一个仅用于组成另一个 Observable 的主题?
- javascript - 同一脚本中不同点的同一变量的不同值 Vanilla Javascript
- .net - 将项目添加到元组列表时出现 VB.NET NullReferenceException