2020年3月19日 星期四

[React] Celsius and Fahrenheit

import React, { Component } from 'react'

const sacleNames = {
  c: 'Celsius',
  f: 'Fahrenheit'
}

export class TemperatureInput extends 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;
    const scale = this.props.scale;
    return (
      <div>
        <fieldset>
          <legend>Enter temperature in {sacleNames[scale]}:</legend>
          <input type="text" value={temperature} onChange={this.handleChange}/>
        </fieldset>
      </div>
    )
  }
}

export default TemperatureInput
import React, { Component } from 'react'
import TemperatureInput from './TemperatureInput'

function BoilingVerdict (props) {
  if (props.celsius >= 100) {
    return <p>The water would boil</p>
  }
  return <p>The water would not boil</p>
}

function toCelsius(fahrenheit) {
  return (fahrenheit - 32) * 5 / 9
}

function toFahrenheit(celsius) {
  return ( celsius * 9 / 5 ) + 32
}

function tryConvert(temperature, convert) {
  const input = parseFloat(temperature)
  if (Number.isNaN(input)) return ''
  const output = convert(input)
  const rounded = Math.round(output * 1000) / 1000
  return rounded.toString()
}

export class Calculator extends Component {
  constructor(props) {
    super(props)
    this.handleCelsiusChange = this.handleCelsiusChange.bind(this)
    this.handleFahrenheitChange = this.handleFahrenheitChange.bind(this)
    this.state = {
       temperature: '',
       scale: 'c'
    }
  }

  handleCelsiusChange (temperature) {
    this.setState({ scale: 'c', temperature  });
  }
  handleFahrenheitChange (temperature) {
    this.setState({ scale: 'f', temperature  });
  }

  render() {
    const scale = this.state.scale
    const temperature = this.state.temperature
    const celsius = scale === 'f' ? tryConvert(temperature, toCelsius) : temperature
    const fahrenheit = scale === 'c' ? tryConvert(temperature, toFahrenheit) : temperature

    return (
      <div>
        <TemperatureInput
          scale="c"
          temperature={celsius}
          onTemperatureChange={this.handleCelsiusChange}
        ></TemperatureInput>
        <TemperatureInput
          scale="f"
          temperature={fahrenheit}
          onTemperatureChange={this.handleFahrenheitChange}
        ></TemperatureInput>
        <BoilingVerdict
          celsius={parseFloat(temperature)}
        ></BoilingVerdict>
      </div>
    )
  }
}

export default Calculator
Github連結

沒有留言:

張貼留言