인프런 커뮤니티 질문&답변

supbe0726님의 프로필 이미지
supbe0726

작성한 질문수

처음 만난 리액트(React)

(실습) 섭씨온도와 화씨온도 표시하기

변경된 input 값이 텍스트로 보이지 않습니다.

해결된 질문

작성

·

336

0

개발자 도구로 보면 섭씨에 값 입력 시 화씨 input에도 값이 담기고 변하는데 텍스트는 보이지 않습니다...

찾아보니 <input value="{props.temperature}"> 대신 <input defaultValue="{props.temperature}"> 를 쓰면 된대서 defaultValue를 쓰면 텍스트가 잘 나옵니다...

아래 사진은 <input defaultValue={props.temperature}>으로 수정했을 때 입니다.

 

왜 <input value=""> 대신 <input defaultValue="">를 사용해야 정상적으로 나오는지 궁금합니다.

 

 

TemperatureInput.jsx

const scaleNames = {
  c: "섭씨",
  f: "화씨",
};

function TemperatureInput(props) {
  const handleChange = (event) => {
    props.onTemperatureChange(event.target.value);
  };

  return (
    <fieldset>
      <legend>온도를 입력해주세요(단위: {scaleNames[props.scale]})</legend>
      <input vaule={props.temperature} onChange={handleChange} />
    </fieldset>
  );
}

export default TemperatureInput;

 

Calculator.jsx

import React, { useState } from "react";
import TemperatureInput from "./TemperatureInput";

function BoilingVerdict(props) {
  //물 끓음 감지
  if (props.celsius >= 100) {
    return <p>물이 끓습니다.</p>;
  }
  return <p>물이 끓지 않습니다.</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); //섭씨 or 화씨로 변환
  const rounded = Math.round(output * 1000) / 1000;
  return rounded.toString();
}

function Calculator(props) {
  const [temperature, setTemperature] = useState("");
  const [scale, setScale] = useState("c");

  const handleCelsiusChange = (temperature) => {
    setTemperature(temperature);
    setScale("c");
  };

  const handleFahrenheitChange = (temperature) => {
    setTemperature(temperature);
    setScale("f");
  };

  const celsius =
    scale === "f" ? tryConvert(temperature, toCelsius) : temperature;
  const fahrenheit =
    scale === "c" ? tryConvert(temperature, toFahrenheit) : temperature;

  return (
    <div>
      <TemperatureInput
        scale="c"
        temperature={celsius}
        onTemperatureChange={handleCelsiusChange}
      />

      <TemperatureInput
        scale="f"
        temperature={fahrenheit}
        onTemperatureChange={handleFahrenheitChange}
      />

      <BoilingVerdict celsius={parseFloat(celsius)} />
    </div>
  );
}

export default Calculator;

답변 1

0

Inje Lee (소플)님의 프로필 이미지
Inje Lee (소플)
지식공유자

안녕하세요, 소플입니다.

지금 올려주신 코드에서 아래 부분에 오타가 있습니다.

vaule => value

<input vaule={props.temperature} onChange={handleChange} />

먼저 오타를 수정해도 동일한 현상이 발생하는지 한 번 확인해보시기 바랍니다!

 

감사합니다.

supbe0726님의 프로필 이미지
supbe0726
질문자

오타 문제였군요...꼼꼼히 봐주셔서 감사합니다! 남은 강의도 감사히 잘 보겠습니다!

supbe0726님의 프로필 이미지
supbe0726

작성한 질문수

질문하기