본문 바로가기
JavaScript

[JavaScript] ReactJS: STATE(2)

by busybee-busylife 2024. 10. 22.
반응형

💻미션: Unit Conversion(minutes -> hours) App 만들기💻

 

DOM(Document Object Model) 

 - 웹페이지 HTML elements를 트리 구조로 표현한 것 
 - DOM 구조 내 원하는 element에 접근해서 수정 가능

 

Virtual DOM 
 - 실제 DOM의 복사본 
 - JavaScript의 메모리에 저장된 JavaScript 객체에 불과: 실제 UI에 영향을 미치지 못함 
 - Reconciliation(재조정): 변경된 element만 실제 브라우저 화면에 적용 
 - 항상 2개의 가상DOM이 존재: 변경 이전 & 변경 이후 

 - 매번 DOM을 조작할때마다 브라우저 화면의 UI를 새롭게 그릴 필요가 없음 

 

https://ko.legacy.reactjs.org/docs/faq-internals.html

 

조건부 삼항연산자( ? : ) 

value={inverted ? amount * 60 : amount}

 - inverted가 true일 때: amount * 60 값을 value로 사용 

 - inverted가 false일 때: amount 값을 value로 사용 

 

이전과 마찬가지로 변경된 값만 리렌더링되고 있다 

 

km/miles 추가 👇

<!DOCTYPE html>
<html>
    <body>
        <div id="root"></div>
    </body>
    <script src="https://unpkg.com/react@18.3.1/umd/react.production.min.js"></script>  
    <script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <script type="text/babel">
        function App() {
            const [amount, setAmount] = React.useState("");  
            const [inverted, setInverted] = React.useState(false);
            const [isTimeMode, setIsTimeMode] = React.useState(true);  // state to track conversion mode

            const onChange = (event) => {
                setAmount(event.target.value);
            };
            const reset = () => setAmount("");  
            const onFlip = () => {
                reset(); 
                setInverted((current) => !current);  
            };  
            const switchMode = (event) => {  // Function to switch between Time and Distance modes
                reset();
                setIsTimeMode(event.target.value === "time");  // Set mode based on select value
                setInverted(false);  // Reset inverted state when switching mode
            };

            return(
            <div>
                <h1>Super Converter</h1>

                <label htmlFor="modeSelect">Choose conversion type: </label>
                <select id="modeSelect" onChange={switchMode}>
                    <option value="time">Minutes/Hours</option>
                    <option value="distance">Km/Miles</option>
                </select>

                {isTimeMode ? (
                    <div>
                        <div>
                            <label htmlFor="minutes">Minutes</label>
                            <input 
                            value={inverted ? amount * 60 : amount}  
                            id="minutes" 
                            placeholder="Minutes" 
                            type="number"
                            onChange={onChange}
                            disabled={inverted}  
                            />
                        </div>

                        <div>    
                            <label htmlFor="hours">Hours</label>
                            <input 
                            value={inverted ? amount : (amount / 60).toFixed(1)}  
                            id="hours" 
                            placeholder="Hours" 
                            type="number"
                            disabled={!inverted}  
                            onChange={onChange}
                            />
                        </div>
                    </div>
                ) : (
                    <div>
                        <div>
                            <label htmlFor="km">Kilometers</label>
                            <input 
                            value={inverted ? amount * 1.609 : amount}  
                            id="km" 
                            placeholder="Kilometers" 
                            type="number"
                            onChange={onChange}
                            disabled={inverted}  
                            />
                        </div>

                        <div>    
                            <label htmlFor="miles">Miles</label>
                            <input 
                            value={inverted ? amount : (amount / 1.609).toFixed(2)}  
                            id="miles" 
                            placeholder="Miles" 
                            type="number"
                            disabled={!inverted}  
                            onChange={onChange}
                            />
                        </div>
                    </div>
                )}

                <button onClick={reset}>Reset</button>
                <button onClick={onFlip}>{inverted ? "Turn back" : "Invert"}</button>  
            </div>
            );
        }
        const root = document.getElementById("root");
        ReactDOM.render(<App />, root);
    </script>
</html>
반응형

'JavaScript' 카테고리의 다른 글

[JavaScript] ReactJS: Create React App  (1) 2024.10.25
[JavaScript] ReactJS: Props / React.memo  (0) 2024.10.24
[JavaScript] ReactJS: STATE(1)  (0) 2024.10.21
[JavaScript] ReactJS: Basics  (0) 2024.10.21
[JavaScript] 크롬 앱 만들기: Weather  (1) 2024.09.11