본문 바로가기

JavaScript/React JS

[React JS] state를 활용 해보기

지난번 배운 state기능과 input을 활용하여 분 -> 시간 변환을 만들어보았다.

<!DOCTYPE html>
<html lang="en">
<link rel="stylesheet" href="https://unpkg.com/mvp.css">
<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">
function App() {
        const [min, setMin] = React.useState();
        const onChange = (event) => {
            setMin(event.target.value);
        }
        return (
                <div>
                    <h1>Super Converter</h1>
                    <div>
                        <h3>Time</h3>
                        <label htmlFor="min">Min</label>
                        <input onChange={onChange} value={min} id="min" placeholder="Min" type="number" />
                        <label htmlFor="hour">Hour</label>
                        <input value={Math.round(min/60)} id="hour"placeholder="Hour" type="number" />
                    </div>                
                 </div>
            );
        }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);
 </script>
</html>

변환 설정 기준을 min으로 하여 useState 변수 설정을하고, onChange함수를 이용하여 input입력 숫자가 바뀔 때 마다

자동적으로 아래 시간input의 값이 바뀌게 설정하였다.

분 시간 변환기

이제 flip의 기능을 넣어서 버튼을 누르면 분 혹은 시간의 input을 disabled 하게 만든다.

const [flipped, setFlipped] = React.useState(false);

const onFlip = () => {
//setFlipped(!flipped);
setFlipped((current) => !current);   
}

<button onClick={onFlip}>Flip</button>

클릭 시 기능을 수행하는 onClick함수를 넣고 useState를 만들어줬다. 변수 값은 특정 숫자가 아닌 true, false를 넣었다.

onFlip 함수에서

setFlipped(!flipped); 보다는 
setFlipped((current) => !c

 현재 값을 기준으로 변경하는 것이 더 안전하기 때문에 current를 삽입했다.

그 다음 min hour input에

disabled={flipped}

를 넣으면 flipped의 기본값은 false. 따라서 disabled는 거짓으로 되어 적용되지 않는다.

disabled={flipped === false}.  

OR

disabled={!flipped}

이를 막기 위해서 다음과 같이 연산자를 넣어서 만약 flipped가 false라면 true로 변환되어 disabled가 적용되고, flip button을 누르면

disabled가 해제된다. 

 

그 다음 value 값에 삼항연산자를 넣어서

min =>

value={flipped ? time*60 : time}

hour =>

value={flipped ? time : time/60}

flip기능이 완성된다.

    function App() {
        const [time, setTime] = React.useState();
        const onChange = (event) => {
            setTime(event.target.value);
        }
        const [flipped, setFlipped] = React.useState(false);
        const reset = (event) => {
            setTime(0);
        }
        const onFlip = () => {
         //setFlipped(!flipped);
         reset();
         setFlipped((current) => !current);   
        }
        return (
                <div>
                    <h1>Super Converter</h1>
                    <div>
                        <h3>Time</h3>
                        <label htmlFor="min">Min</label>
                        <input disabled={flipped} onChange={onChange} value={flipped ? time*60 : time} id="min" placeholder="Min" type="number" />
                        <label htmlFor="hour">Hour</label>
                        <input disabled={!flipped} onChange={onChange} value={flipped ? time : time/60} id="hour"placeholder="Hour" type="number" />
                    </div>
                    <button onClick={reset}>Reset</button>
                    <button onClick={onFlip}>Flip</button>
                </div>
            );
        }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);

완성 화면

 

'JavaScript > React JS' 카테고리의 다른 글

[React JS] Memo  (0) 2022.01.20
[React JS] Props  (0) 2022.01.18
[React JS] state 활용하기2  (0) 2022.01.16
[React JS] setState  (0) 2021.11.14
[React JS] React JS, JSX  (0) 2021.11.13