由另一个控制器控制的UserForm在控制台上抱怨为
“警告:组件正在更改要控制的非受控输入。这可能是由于值从undefined更改为已定义的值而导致的,而这是不应该发生的。决定在部件的使用寿命内使用受控或非受控输入元件。More info:https://reactjs.org/link/controlled-components input span li ul..."**
以下是组件代码:
export default({user}) => {
if(!user) {
return <div></div>
} else {
const [name,setName] = useState(user.name|| "")
useEffect(() => {
setName(user.name);
}, [user])
return <form>
<fieldset>
<legend> Edit {user.name }</legend>
<p>
<label htmlFor={"name"}> Name </label>
<input id="name" value={name || ""} onChange={e => setName(e.target.value)} />
</p>
</fieldset>
</form>
}
}
我尝试了其他stackoverflow答案建议的所有修复,但仍然给出警告。
我是不是漏掉了什么?
4条答案
按热度按时间qco9c6ql1#
实际上在React当你面对这个,这是一个错误的控制和不受控制的组件,在简单的话:受控组件:是使用状态来更改其值的组件。示例:
而在不受控制的组件中,状态并不涉及那么多,您可以简单地使用defaultValue或ref。示例:
**记住:**如果你同时使用value和defaultValue,它会给予你错误,因为我们不能同时使用受控组件的value和非受控组件的defaultValue。
提示:你需要在受控和非受控组件之间进行选择,所以使用ref将是解决方案。或将value更改为defaultValue将解决此问题。
注:
defaultValue
仅用于初始负载。如果你想初始化输入,那么你应该使用defaultValue,但是如果你想使用state来改变值,那么你需要使用value。阅读本文了解更多React输入defaultValue不随状态更新我在输入中使用了下面的方法来消除该警告,通过使用Short-circuit求值来定义value属性,如下所示:
另一种方法
原因是,在您定义的状态中:
字段作为空白对象,因此在第一次渲染期间
this.state.fields.name
将是undefined
,并且输入字段将获得其值为:因此,输入字段将变得不受控制。
在input中输入任何值后,
fields
的状态将更改为:此时输入字段被转换为受控组件;这就是为什么你会得到错误:
组件正在更改要控制的文本类型的非受控输入。
可能的解决方案:
1-将
fields
的状态定义为:zpqajqem2#
我已经用这个工作示例更新了您的组件。
r7xajy2e3#
这个问题主要发生在你有一个未定义的属性值时,现在它可以是
checked
的<input />
字段或type
甚至value
属性。**解决方案:**添加默认值
||
。这里
state.bestSellerOnly
可能会在挂载时返回undefined,这可能会导致react警告。polkgigr4#
如果你有你的初始值
undefined
你可以使用或符号回退到一个初始的空字符串。