[React] 단위변환기 완성 (minute&hours, km&miles)

2026. 2. 7. 17:04·Frontend/React
니콜라스 쌤의 노마드코더 'ReactJS로 영화 웹 서비스 만들기' 보면서 공부한 내용입니다.
부족한 내용이나 잘못된 내용은 댓글남겨주시면 감사하겠습니다!

출처 : https://nomadcoders.co/react-for-beginners

 

이전글에 이어,

[React] input state () - 단위변환기1 Warning : Invalid DOM property

[React] 분 <-> 시, 리셋기능 - 단위변환기2

 

이번에는 km to miles 거리 변환기를 추가하여 단위변환기를 완성해보겠습니다.

 

1.  거리 변환기

- 기존 시간 변환이랑 소스 형태는 거의 동일합니다.

setUnit를 이용하여 km, miles의 상태를 변환시켜주고, setFlipped를 이용하여 km, miles를 전환시킬 수 있게 해줍니다.

onChange는 사용자가 입력을 하면 반응하고, onFlip는 Flip인 km, miles전환 시 반응, reset은 초기화버튼과 onFlip전에 사용됩니다.

// 거리 변환기
function KmToMiles () {
    const [unit, setUnit] = React.useState(0); // km, miles 상태
    const [flipped, setFlipped] = React.useState(false); 
    // km 상태 변경
    const onChange = (event) => {
        setUnit(event.target.value);
    }

    // flipped 상태 변경
    const onFlip = () => {
        reset();
        setFlipped((current) => !current); 
    }

    const reset = () => setUnit(0);

    return  (
        <div>
            <h3>Km to Miles</h3>
            <div>
                <label htmlFor="km">Km</label>
                <input 
                    value={flipped ? unit * 1.609 : unit}
                    id="km" 
                    placeholder="Km" 
                    type="number"
                    onChange={onChange}
                    disabled={flipped}
                />
            </div>
            <div>
                <label htmlFor="miles">Miles</label>
                <input 
                    value={flipped ? unit : unit / 1.609}
                    id="miles" 
                    placeholder="Miles" 
                    type="number"
                    onChange={onChange}
                    disabled={!flipped}
                />
            </div>
            <button onClick={reset}>Reset</button>
            <button onClick={onFlip}>Flip</button> 
        </div>
    );
}

2. 완성 코드

<!--Divide 분할 정복 - 작은 컴포넌트로 분할-->
<!DOCTYPE html>
<html>
    <body>
        <div id="root"></div>
    </body>
    <script src="https://unpkg.com/react@17.0.2/umd/react.development.js"></script> 
    <script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <script type="text/babel">
        // 시간 변환기
        function MinutesToHours () {
            const [amount, setAmount] = React.useState(0); // 분, 초 상태
            const [flipped, setFlipped] = React.useState(false); 
            // minutes 상태 변경
            const onChange = (event) => {
                setAmount(event.target.value);
            }
            // flipped 상태 변경 / t -> f / f -> t
            //const onFlip = () => setFlipped(!flipped); 
            const onFlip = () => {
                reset();
                setFlipped((current) => !current); 
            }
            
            const reset = () => setAmount(0);
            return (
                <div>
                    <h3>Minutes to Hours</h3>
                    <div>
                        <label htmlFor="minutes">Minutes</label>
                        <input 
                            value={flipped ? amount * 60 :amount}
                            id="minutes" 
                            placeholder="Minutes" 
                            type="number"
                            onChange={onChange}
                            // disabled={flipped === true}
                            disabled={flipped}
                        />
                    </div>
                    <div>
                        <label htmlFor="hours">Hours</label>
                        <input 
                            value={flipped ? amount : Math.round(amount / 60)}
                            id="hours" 
                            placeholder="Hours" 
                            type="number"
                            //disabled={flipped === false}
                            disabled={!flipped}
                            onChange={onChange}
                        />
                    </div>
                    <button onClick={reset}>Reset</button>
                    <button onClick={onFlip}>Flip</button>
                </div>
            );
        }
        
        // 거리 변환기
        function KmToMiles () {
            const [unit, setUnit] = React.useState(0); // km, miles 상태
            const [flipped, setFlipped] = React.useState(false); 
            // km 상태 변경
            const onChange = (event) => {
                setUnit(event.target.value);
            }

            // flipped 상태 변경
            const onFlip = () => {
                reset();
                setFlipped((current) => !current); 
            }

            const reset = () => setUnit(0);

            return  (
                <div>
                    <h3>Km to Miles</h3>
                    <div>
                        <label htmlFor="km">Km</label>
                        <input 
                            value={flipped ? unit * 1.609 : unit}
                            id="km" 
                            placeholder="Km" 
                            type="number"
                            onChange={onChange}
                            disabled={flipped}
                        />
                    </div>
                    <div>
                        <label htmlFor="miles">Miles</label>
                        <input 
                            value={flipped ? unit : unit / 1.609}
                            id="miles" 
                            placeholder="Miles" 
                            type="number"
                            onChange={onChange}
                            disabled={!flipped}
                        />
                    </div>
                    <button onClick={reset}>Reset</button>
                    <button onClick={onFlip}>Flip</button> 
                </div>
            );
        }
        function App () {
            const [index, setIndex] = React.useState("xx");
            const onSelect = (event) => {
                setIndex(event.target.value);
            }
            return (
                <div>
                    <h1 className="hi">Super Converter</h1>    
                    <select value={index} onChange={onSelect}>
                        <option value="xx">Select your units</option>
                        <option value="0">Minutes & Hours</option>
                        <option value="1">Km & Miles</option>
                    </select>                
                    <hr/>
                    {index === "xx" ? "Please select your units" : null}
                    {index === "0" ? <MinutesToHours /> : null}
                    {index === "1" ? <KmToMiles /> : null}
                </div>
            );
        }
        
        const root = document.getElementById("root");
        ReactDOM.render(<App/>, root);
        
    </script>
</html>

 

JSX의 state를 알아보기 위한 예제였던 단위변환기는 여기서 마무리 짓고 

 

다음 글에서는 Props에 대해 공부해보겠습니다.

[React] 함수형 컴포넌트의 props 사용

 

읽어주셔서 감사합니다.

'Frontend > React' 카테고리의 다른 글

[React] React.memo() : 리렌더링 방지 방법  (0) 2026.02.08
[React] 함수형 컴포넌트의 props 사용  (0) 2026.02.07
[React] Divide : 작은 컴포넌트로 분할 - 단위변환기 3  (0) 2026.02.07
[React] 분 <-> 시, 리셋기능 - 단위변환기2  (0) 2026.02.03
[React] input state () - 단위변환기1 Warning : Invalid DOM property  (0) 2026.02.02
'Frontend/React' 카테고리의 다른 글
  • [React] React.memo() : 리렌더링 방지 방법
  • [React] 함수형 컴포넌트의 props 사용
  • [React] Divide : 작은 컴포넌트로 분할 - 단위변환기 3
  • [React] 분 <-> 시, 리셋기능 - 단위변환기2
min_sol
min_sol
  • min_sol
    비글개발연구소🐾
    min_sol
  • 전체
    오늘
    어제
    • 분류 전체보기 (278)
      • Programming (128)
        • Algorithm (52)
        • JAVA (40)
        • GIS (5)
        • PyQt (10)
        • C# (11)
        • Mobile (6)
        • AI (4)
      • Backend (36)
        • Spring (14)
        • JSP (11)
        • Network (5)
      • Frontend (29)
        • React (11)
        • Vue (13)
        • Next.js (4)
      • Database (10)
        • PostgreSQL (1)
        • Oracle (8)
        • Elasticsearch (1)
      • DevOps (8)
        • Linux (7)
        • Mac (1)
      • Tools (31)
        • IntelliJ (1)
        • GitHub (10)
        • RPA (20)
      • Security (9)
      • etc (21)
        • ERROR (5)
        • 세미나 | 교육 (10)
        • 자격증 (1)
        • 일상 (2)
        • 2021 (2)
  • 인기 글

  • 태그

    명품자바에센셜
    계산기
    코딩테스트
    VUE
    vue.js
    스윙
    PyQt5
    spring
    알고리즘
    자료구조
    자동화
    PyQt
    jsp
    자바
    이클립스
    연습문제
    백준
    생능출판
    Java
    RPA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
min_sol
[React] 단위변환기 완성 (minute&hours, km&miles)
상단으로

티스토리툴바