본문 바로가기
개발/REACT

ReactJS 입문 with 니꼬쌤 3 - SUPER CONVERTER 코드

by 개발자 구리 2022. 3. 22.

분 <-> 시간 변환기를 개발해보자.

 

minutes와 hours를 id로 가지는 input 내에서 어떤 변경이 일어났을때 onChange 함수가 실행된다.

onChange 함수 내에서는 input value, 즉 event.target.value를 받아서 amount의 값에 업데이트해준다.

input의 value에 이러한 amount를 연결해줌으로써 input 값을 외부에서도 수정해줄 수 있게 되었다.

그리고 amount에 변경이 생기더라도 여전히 당연히 input value만 리렌더링 된다는 것을 기억하자.

해당 예제를 통해 state를 바탕으로 UI를 변경할 수 있다는 게 얼마나 유용한 것인지도 알게 되었다.

 

<!DOCTYPE html>
<html>
  <body>
    <div id="root"></div>
  </body>
  <script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
  <script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
  <script type="text/babel">
    const root = document.getElementById("root");
    function App() {
      const [amount, setAmount] = React.useState(0);
      const [flipped, setFlipped] = React.useState(false);
      const onChange = (event) => {
        setAmount(event.target.value);
      };
      const reset = () => setAmount(0);
      const onFlip = () => {
        reset();
        setFlipped((current) => !current);
      };
      return (
        <div>
          <h1>Super Converter</h1>
          <div>
            <label htmlFor="minutes">Minutes</label>
            <input
              value={flipped ? amount * 60 : amount}
              id="minutes"
              placeholder="Minutes"
              type="number"
              disabled={flipped}
              onChange={onChange}
            />
          </div>
          <div>
            <label htmlFor="hours">Hours</label>
            <input
              value={flipped ? amount : amount / 60}
              id="hours"
              placeholder="Hours"
              type="number"
              disabled={!flipped}
              onChange={onChange}
            />
          </div>
          <button onClick={reset}>Reset</button>
          <button onClick={onFlip}>{flipped ? "Turn back" : "Flip"}</button>
        </div>
      );
    }
    ReactDOM.render(<App />, root);
  </script>
</html>

 

value={flipped ? amount * 60 : amount}

disabled={flipped}

onChange={onChnage}

<button onClick={reset}>

 

이런식으로 그냥 작성했을때 text인 내용이 {} 안에 작성하면 JS로 써진다.

 

아래는 select를 사용해서 분 <-> 시간, 평 <-> 제곱미터 변환기를 선택할 수 있도록 한  code challenge이다.

 

<!DOCTYPE html>
<html>
  <body>
    <div id="root"></div>
  </body>
  <script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
  <script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
  <script type="text/babel">
    const root = document.getElementById("root");
    function MinutesToHours() {
      const [amount, setAmount] = React.useState(0);
      const [flipped, setFlipped] = React.useState(false);
      const onChange = (event) => {
        setAmount(event.target.value);
      };
      const reset = () => setAmount(0);
      const onFlip = () => {
        reset();
        setFlipped((current) => !current);
      };
      return (
        <div>
          <div>
            <label htmlFor="minutes">Minutes</label>
            <input
              value={flipped ? amount * 60 : amount}
              id="minutes"
              placeholder="Minutes"
              type="number"
              disabled={flipped}
              onChange={onChange}
            />
          </div>
          <div>
            <label htmlFor="hours">Hours</label>
            <input
              value={flipped ? amount : amount / 60}
              id="hours"
              placeholder="Hours"
              type="number"
              disabled={!flipped}
              onChange={onChange}
            />
          </div>
          <button onClick={reset}>Reset</button>
          <button onClick={onFlip}>{flipped ? "Turn back" : "Flip"}</button>
        </div>
      );
    }
    function PyungToSquareMeter() {
      const [amount, setAmount] = React.useState(0);
      const [flipped, setFlipped] = React.useState(false);
      const onChange = (event) => {
        setAmount(event.target.value);
      };
      const reset = () => setAmount(0);
      const onFlip = () => {
        reset();
        setFlipped((current) => !current);
      };
      return (
        <div>
          <div>
            <label htmlFor="pyung">Pyung</label>
            <input
              value={flipped ? amount / 3.31 : amount}
              id="pyung"
              placeholder="Pyung"
              type="number"
              disabled={flipped}
              onChange={onChange}
            />
          </div>
          <div>
            <label htmlFor="squareMeter">SquareMeter</label>
            <input
              value={flipped ? amount : amount * 3.31}
              id="squareMeter"
              placeholder="SquareMeter"
              type="number"
              disabled={!flipped}
              onChange={onChange}
            />
          </div>
          <button onClick={reset}>Reset</button>
          <button onClick={onFlip}>{flipped ? "Turn back" : "Flip"}</button>
        </div>
      );
    }
    function App() {
      const [index, setIndex] = React.useState("default");
      const onSelect = (event) => {
        setIndex(event.target.value);
      };
      return (
        <div>
          <h1>Super Converter</h1>
          <select onChange={onSelect}>
            <option value="default">Select Units</option>
            <option value="0">Minutes & Hours</option>
            <option value="1">Pyung & SquareMeter</option>
          </select>
          <hr />
          {index === "default" ? "Please select units" : null}
          {index === "0" ? <MinutesToHours /> : null}
          {index === "1" ? <PyungToSquareMeter /> : null}
        </div>
      );
    }
    ReactDOM.render(<App />, root);
  </script>
</html>