AntDesign 表单中的自定义输入字段 - “组件正在更改要控制的不受控制的输入。

Custom Input field inside AntDesign form - "A component is changing an uncontrolled input to be controlled."

提问人:Saif eldeen Adel 提问时间:2/18/2021 更新时间:2/19/2021 访问量:1901

问:

所以我喜欢使用 AntDesign 的表单,因为我喜欢它们的验证工作方式。但是,我想更改组件以使其更加个性化。所以我制作了我的组件,并用他们的组件替换了它。一切正常。我的价值观被它们的功能和一切所捕捉。但是,不知道为什么控制台对我生气并一直告诉我有一个不受控制的输入组件。InputCustomInputInputonFinish

A component is changing an uncontrolled input to be controlled. 
This is likely caused by the value changing from undefined to a defined value, which should not happen. 
Decide between using a controlled or uncontrolled input element for the lifetime of the component.

我很想忽略它,因为它的工作方式实际上没有任何问题。

代码如下:

const CustomInput = styled.input`
    background-color: #f5f5f5;
    border: 0.2px solid #d1d1d1;
    border-radius: 4px;
    padding: 8px 18px;
    width: 290px;
    font-family: "Mulish", sans-serif;
    font-weight: 300;
    font-size: 13pt;
    outline: none;
    transition: 0.3s ease-in-out;

    &:hover {
        background-color: #f2f2f2;
    }

    &::placeholder {
        color: #ababab;
        font-weight: 200;
    }
`;

const CustomeBtn = styled.button`
    background-color: #293651;
    color: #f7f5fb;
    padding: 8px 20px;
    outline: none;
    border: none;
    border-radius: 20px;
    font-family: "Mulish", sans-serif;
    font-size: 13pt;
    font-weight: 300;
    margin-right: 10px;
    transition: 0.3s ease-in-out;

    &:hover {
        background-color: #ffbb33;
        color: black;
    }
`;

const CustomLink = styled(Link)`
    font-family: "Mulish", sans-serif;
    font-size: 12pt;
    font-weight: 400;
    color: #293651;
    text-align: center;

    &:hover {
        color: #ffbb33;
    }
`;

function Login() {
    const onFinish = (values) => {
        console.log("Received values of form: ", values);
    };

    return (
        <MainContainer>
            <Heading>Login</Heading>
            <LoginIcon />
            <Form
                name="normal_login"
                className="login-form"
                initialValues={{
                    remember: true,
                }}
                onFinish={onFinish}
            >
                <Form.Item
                    name="username"
                    rules={[
                        {
                            required: true,
                            message: "Please input your Username!",
                        },
                    ]}
                >
                    ---------My custom input-----------
                    <CustomInput placeholder="Username" autoComplete='on'/>
                </Form.Item>
                <Form.Item
                    name="password"
                    rules={[
                        {
                            required: true,
                            message: "Please input your Password!",
                        },
                    ]}
                >
                    -----------My custom input-------------
                    <CustomInput type="password" placeholder="Password" autoComplete='on' />
                </Form.Item>

                <Form.Item>
                    <CustomeBtn htmlType="submit">Login</CustomeBtn>
                    Or <CustomLink to="/register">register now!</CustomLink>
                </Form.Item>
            </Form>
        </MainContainer>

奇怪的是,当我向输入字段添加属性时,它不会拾取它。就像我添加一样,它不会显示出来,它会让我正常输入字段......发生了什么valuevalue='this'

reactjs 输入 antd

评论

0赞 trixn 2/18/2021
您忘记了代码中的重要部分,即 的代码。正如错误所说:如果您为内置元素提供道具,则它永远不会从其他内容更改为其他内容。CustomInputvalue<input />undefined
0赞 Saif eldeen Adel 2/18/2021
你是什么意思?我不需要为我的自定义输入提供更多代码。它是一个带有占位符的输入字段。还有什么?正如我所说,onFinish 方法捕获了我的值。控制台记录它们没有问题,从那里我可以使用它们。所以蚂蚁设计以某种方式照顾到了这一点。同样正如我所说,当我为自定义输入提供值属性时,它不会注册它。好像它根本不存在。
0赞 trixn 2/18/2021
我问的是你是否可以提供你的组件的代码。CustomInput
0赞 Saif eldeen Adel 2/18/2021
@trixn哦,没有代码。我使用样式组件。看看顶部,我在那里定义了它。它只是一个 html 输入字段

答:

1赞 trixn 2/18/2021 #1

问题在于您的输入没有提供初始值,无论是在 上还是在 上。因此,当您第一次输入一个值时,它会从其他值更改为其他值,将其从不受控制的输入切换到受控输入。initialValuesForminitialValueForm.Itemundefined

React 认为这是一个潜在的错误,因为输入应该被控制(总是提供一个值而不是 ),或者永远不要给出任何值(在这种情况下,值由输入元素本身管理)。在安装时,它们不应从一个更改为另一个。undefined

在 或 中提供初始值:initialValuesinitialValue

<Form
    name="normal_login"
    className="login-form"
    initialValues={{
        remember: true,
        Username: '',
        password: '',
    }}
    onFinish={onFinish}
>

<Form.Item name="username" initialValue="">{/* ... */}</Form.Item>

您还可以使用该组件,该组件还根据类型在基础输入元素上设置一个合理的初始值(如果未提供)。Inputantd

评论

1赞 Saif eldeen Adel 2/18/2021
谢谢你,太好了。我刚刚意识到我可以这样做,从而从antd Input组件继承所有内容。您的解决方案同样有效const CustomInput = styled(Input)
0赞 trixn 2/19/2021
@SaifeldeenAdel 很高兴它有所帮助。