![](/img/trans.png)
[英]Warning: A component is changing an uncontrolled input of type undefined to be controlled
[英]changing an uncontrolled input of type undefined to be controlled
我正在从官方文档中学习ReactJS,并试图编写一个温度计算器来计算在给定温度下水是否会沸腾。 ( 更多信息 )尽管以下代码按预期运行,但我得到警告
“ proxyConsole.js:56警告:TemperatureInput正在将类型为undefined的不受控制的输入更改为受控。输入元素不应从不受控制的状态切换为受控的状态”
谁能告诉我我错了吗? 非常感谢!
function BoilingVerdict(props) {
if (props.temperature >= 100) {
return <p>The water would boil</p>
} else {
return <p>The water would not boil</p>
}
}
class TemperatureInput extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
this.props.onTemperatureChange(e.target.value);
}
render() {
const temperature = this.props.temperature;
return (
<fieldset>
<legend>Please enter temperature in {Calculate.scaleNames[this.props.scale]}</legend>
<input value={temperature} onChange={this.handleChange} />
</fieldset>
)
}
}
class Calculate extends React.Component {
constructor(props) {
super(props);
this.state = {
temperature: "",
scale: "c"
}
this.handleCelciusChange = this.handleCelciusChange.bind(this);
this.handleFahrenheitChange = this.handleFahrenheitChange.bind(this);
}
static scaleNames = {
c: "Celcius",
f: "Fahrenheit"
}
static toCelsius(fahrenheit) {
return (fahrenheit - 32) * 5 / 9;
}
static toFahrenheit(celsius) {
return (celsius * 9 / 5) + 32;
}
static tryConvert(temp, convert) {
const input = parseFloat(temp);
if (Number.isNaN(input)) { return; }
const output = convert(input);
const rounded = Math.round(output * 1000) / 1000;
return rounded.toString();
}
handleCelciusChange(temperature) {
this.setState({
scale: 'c',
temperature: temperature
})
}
handleFahrenheitChange(temperature) {
this.setState({
scale: 'f',
temperature: temperature
})
}
render() {
const scale = this.state.scale;
const temperature = this.state.temperature;
const Celcius = scale === 'f' ? Calculate.tryConvert(temperature, Calculate.toCelsius) : temperature;
const Fahrenheit = scale === "c" ? Calculate.tryConvert(temperature, Calculate.toFahrenheit) : temperature;
return (
<div>
<TemperatureInput scale="c" onTemperatureChange={this.handleCelciusChange} temperature={Celcius} />
<TemperatureInput scale="f" onTemperatureChange={this.handleFahrenheitChange} temperature={Fahrenheit} />
<BoilingVerdict temperature={Celcius} />
</div>
)
}
}
ReactDOM.render(<Calculate />, document.getElementById('root'))
我认为问题出在tryConvert
函数上。
在初始状态下, temperature
以空字符串( ""
)初始化。 因此,当将此空字符串提供给tryConvert
方法的parseFloat
时,它将转换为NaN
。 然后,您处于Number.isNaN
条件,并且您的方法返回undefined
。
最后,当您在字段中输入值时,该值将变为实数浮点,并且输入从uncontrolled
值( undefined
值)切换为controlled
(有关受控制和不受控制的状态https:// facebook,请参阅此文档。 github.io/react/docs/forms.html#受控组件 )
您可以通过多种方式来修复代码。 您可以修复tryConvert
以始终返回有效数字(即使用户输入随机字符串),也可以修复状态的temperature
属性的初始值。
希望能帮助到你 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.