更改未定义类型的非受控输入以进行控制

时间:2017-05-25 20:37:03

标签: javascript reactjs

我正在从官方文件中学习ReactJS并尝试编写一个温度计算器来计算水是否会在给定温度下沸腾。 (more info)虽然以下代码按预期运行,但我收到警告

  

" proxyConsole.js:56警告:TemperatureInput正在改变   未控制的类型未定义的输入被控制。输入元素   不应该从不受控制的转为受控制的"

谁能告诉我哪里错了?非常感谢!

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'))

1 个答案:

答案 0 :(得分:1)

我认为问题出在tryConvert函数上。

初始状态,temperature以空字符串("")启动。因此,当这个空字符串被赋予parseFloat方法的tryConvert时,它会转换为NaN。然后,您处于Number.isNaN条件,您的方法将返回undefined

接下来,当您在字段中输入值时,该值将更改为实数浮点数,输入从uncontrolledundefined值)切换为controlled(请参阅此有关受控和非受控状态https://facebook.github.io/react/docs/forms.html#controlled-components

的更多信息,请参阅doc

您可以通过多种方式修复代码。您可以修复tryConvert以始终返回有效数字(即使用户输入随机字符串)或只修复您所在州的temperature属性的初始值。

希望有所帮助:)