提问人:Saif eldeen Adel 提问时间:2/18/2021 更新时间:2/19/2021 访问量:1901
AntDesign 表单中的自定义输入字段 - “组件正在更改要控制的不受控制的输入。
Custom Input field inside AntDesign form - "A component is changing an uncontrolled input to be controlled."
问:
所以我喜欢使用 AntDesign 的表单,因为我喜欢它们的验证工作方式。但是,我想更改组件以使其更加个性化。所以我制作了我的组件,并用他们的组件替换了它。一切正常。我的价值观被它们的功能和一切所捕捉。但是,不知道为什么控制台对我生气并一直告诉我有一个不受控制的输入组件。Input
CustomInput
Input
onFinish
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>
奇怪的是,当我向输入字段添加属性时,它不会拾取它。就像我添加一样,它不会显示出来,它会让我正常输入字段......发生了什么value
value='this'
答:
1赞
trixn
2/18/2021
#1
问题在于您的输入没有提供初始值,无论是在 上还是在 上。因此,当您第一次输入一个值时,它会从其他值更改为其他值,将其从不受控制的输入切换到受控输入。initialValues
Form
initialValue
Form.Item
undefined
React 认为这是一个潜在的错误,因为输入应该被控制(总是提供一个值而不是 ),或者永远不要给出任何值(在这种情况下,值由输入元素本身管理)。在安装时,它们不应从一个更改为另一个。undefined
在 或 中提供初始值:initialValues
initialValue
<Form
name="normal_login"
className="login-form"
initialValues={{
remember: true,
Username: '',
password: '',
}}
onFinish={onFinish}
>
或
<Form.Item name="username" initialValue="">{/* ... */}</Form.Item>
您还可以使用该组件,该组件还根据类型在基础输入元素上设置一个合理的初始值(如果未提供)。Input
antd
评论
1赞
Saif eldeen Adel
2/18/2021
谢谢你,太好了。我刚刚意识到我可以这样做,从而从antd Input组件继承所有内容。您的解决方案同样有效const CustomInput = styled(Input)
0赞
trixn
2/19/2021
@SaifeldeenAdel 很高兴它有所帮助。
评论
CustomInput
value
<input />
undefined
CustomInput