Form getFieldDecorator 传入函数组件控制台报错探究

使用 antd3 的 Form 进行开发时经常需要自定义一些组件,之前都是使用类组件实现,没有问题,但是自从 hooks 发布后,目前开发基本转向了函数组件,但是 Form getFieldDecorator 传入函数组件控制台会出现错误提示。

假如我们定义如下的组件:

import React, {
    useRef } from "react";
import {
    Form, Input } from 'antd';

const TextInput = () => {
   
    return <Input />
}

function TextInputWithFocusButton(props) {
   
    return (
        <Form.Item label="input">
            {
   props.form.getFieldDecorator('inputValue')(
                <TextInput />
            )}
        </Form.Item>
    );
}

export default Form.create()(TextInputWithFocusButton);

控制台会出现下面的错误提示:
在这里插入图片描述
该提示是 react 内部的校验提示,通过查看源码,发现 react 在测试环境中会对函数组件进行校验,如果函数组件上存在 ref,便会出现该提示,具体源码参看 ReactFiberBeginWork.new.js

这时我们会感到很疑惑, 明明没有传递 ref 属性,怎么会有这个提示?

初步猜想是 getFieldDecorator 捣的鬼,这个函数是一个 HOC,会不会是它给我们的函数组件上添加了 ref 属性?通过查看源码,我们发现其内部确实会生成一个 inputProps 对象并挂载 ref 属性,具体源码参看 createBaseForm.js

也就是说只要被 getFieldDecorator 包裹后的组件,都会被添加一个 ref 属性,通过 debug 验证我们的猜想
在这里插入图片描述
那么如何来解决这个问题,答案很简单,使用 React.createRef 包裹一下即可:

import React, {
    useRef } from "react";
import {
    Form, Input } from 'antd';

const TextInput = React.forwardRef((props, ref) => {
   
    return <Input />
})

function TextInputWithFocusButton(props) {
   
    return (
        <Form.Item label="input">
            {
   props.form.getFieldDecorator('inputValue')(
                <TextInput />
            )}
        </
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值