본문 바로가기

리액트 기기기초

#3.9 Final Practice and Recap

  • 컴포넌트는 그 안에 다른 컴포넌트를 렌더링 할 수 있음 
  • index안에 어떤 데이터가 있는지에 따라 Minutes & Hours를 그릴지 Km & Mile를 그릴지 결정함
  • {}안에는 JS를 쓸 수 있음 
  • App 컴포넌트가 state를 가지도록 만들자
<!DOCTYPE html>
<html>

<body>
    <div id="root"></div>
    <!-- ReactDom이 react element를 가져다 놓을 곳 -->
</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">

    function MinutesToHours() {
        const [amount, setAmount] = React.useState(0);
        const [inverted, setInverted] = React.useState(false); //flip은 boolean타입의 변수
        const onChange = (event) => {
            setAmount(event.target.value);
        };
        const reset = () => setAmount(0); //minutes의 값을 0으로 초기화
        const onInvert = () => {
            reset(); //flip누르면 변화된 값 그대로 가져오므로
            setInverted((current) => !current);
        };
        return (
            <div>
                <label for="minutes">Minutes</label>
                <input
                    value={inverted ? amount * 60 : amount} //value값을 state와 연결, 외부에서도 값을 변경해주기 위해
                    onChange={onChange} //데이터를 업데이트
                    id="minutes"
                    placeholder="Minutes"//label의 for과 id가 같으면 연결됨 
                    type="number"
                    disabled={inverted} //disabled={flipped===true}
                />
                <div>
                </div>
                <label for="hours">Hours</label>
                <input id="hours"
                    value={inverted ? amount : Math.round(amount / 60)}
                    placeholder="Hours"
                    type="number"
                    disabled={!inverted}
                    onChange={onChange}
                />
                <div>
                    <button onClick={reset}>Reset</button>
                    <button onClick={onInvert}>{inverted ? "Turn back" : "Invert"}</button>
                </div>
            </div>
        );
    }
    function KmToMiles() {
        return <h3>KM 2 M</h3>;
    }
    function App() { //root div를 그려주는 역할
        const [index, setIndex] = React.useState("xx");
        const onSelect = (event) => {
            setIndex(event.target.value);
        };
        console.log(index);
        return (
            <div>
                <h1>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 & Mile</option>
                </select>
                <hr/>
                {index === "xx" ? "Please select your unit" : null}
                {index === "0" ? <MinutesToHours /> : null}
                {index === "1" ? <KmToMiles/> : null}
            </div>
        );
    }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);

</script>

</html>

'리액트 기기기초' 카테고리의 다른 글

#4.1 Memo  (0) 2023.03.08
#4.0 Props  (0) 2023.03.08
#3.8 Recap  (0) 2023.03.07
#3.7 State Practice part Two  (0) 2023.03.05
#3.6 State Practice part One  (0) 2023.03.05