
1. 초기 상태
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { return ( <div> <h1>단위 계산기</h1> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>
2. 시간, 분을 입력받을 수 있는 input 태그 만들기
- JSX는 HTML 코드와 비슷함
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { return ( <div> <h1>단위 계산기</h1> <input placeholder="Minutes" type="number" /> <input placeholder="Hours" type="number" /> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>

3. label 추가하기
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { return ( <div> <h1>단위 계산기</h1> <label for="minutes">Minutes</label> <input id="minutes" placeholder="Minutes" type="number" /> <label for="hours">Hours</label> <input id="hours" placeholder="Hours" type="number" /> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>

4. JS와 React.JS의 차이점
- for은 JS가 사용하는 것으로 JSX에서는 틀렸음
- for 속성 : JS에서 예약어로 사용 JSX에서는 htmlFor를 사용
- class 속성: JS에서 예약어로 사용 JSX에서는 className을 사용해야 합니다.
- 이벤트 핸들러: 이벤트 이름이 카멜 케이스로 작성해야 함
- style 속성: 객체 형태로 전달하고, CSS 속성도 카멜 케이스로 작성해야 함
- 자체 닫는 태그: HTML에서는 <img>같은 태그를 닫지 않아도 됨 JSX에서는 모든 태그가 닫혀 있어야 함
- 중괄호 {} 사용: JSX에서는 JS 표현식을 사용하려면 중괄호 {}로 감싸야 함
5. input의 value는 우리가 통제할 수 없으니 state 만들기
- useState는 현재값이 첫번째 요소가 되는 배열을 제공해줌
- input의 value와 state의 value가 같음
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { const [minutes, setMinutes] = React.useState(); const onChange = () => { console.log("누가 입력했어요~"); }; return ( <div> <h1>단위 계산기</h1> <label htmlfor="minutes">Minutes</label> <input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={onChange} /> <label htmlfor="hours">Hours</label> <input id="hours" placeholder="Hours" type="number" /> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>
- 하나하나 입력이 될때마다 감지됨

6. input의 값 가져오기
- JS처럼 event 사용하기
- event 정보 가져오기
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { const [minutes, setMinutes] = React.useState(); const onChange = (event) => { console.log(event); }; return ( <div> <h1>단위 계산기</h1> <label htmlfor="minutes">Minutes</label> <input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={onChange} /> <label htmlfor="hours">Hours</label> <input id="hours" placeholder="Hours" type="number" /> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>

<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { const [minutes, setMinutes] = React.useState(); const onChange = (event) => { console.log(event.target.value); }; return ( <div> <h1>단위 계산기</h1> <label htmlfor="minutes">Minutes</label> <input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={onChange} /> <label htmlfor="hours">Hours</label> <input id="hours" placeholder="Hours" type="number" /> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>

7. 화면에 값 띄우기
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { const [minutes, setMinutes] = React.useState(""); const onChange = (event) => { setMinutes(event.target.value); }; return ( <div> <h1>단위 계산기</h1> <label htmlFor="minutes">Minutes</label> <input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={onChange} /> <h4>당신이 변환하길 원하는 분 단위는 {minutes}</h4> <label htmlFor="hours">Hours</label> <input id="hours" placeholder="Hours" type="number" /> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>

8. 입력된 분을 시간으로 표시하기
- 시간 = 분 / 60
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { const [minutes, setMinutes] = React.useState(0); const [hours, setHours] = React.useState(0); const handleMinutesChange = (event) => { setMinutes(event.target.value); }; const handleHoursChange = (event) => { setHours(event.target.value); }; return ( <div> <h1>단위 계산기</h1> <label htmlFor="minutes">Minutes</label> <input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={handleMinutesChange} /> <h4>당신이 변환하길 원하는 분 단위는 {minutes}</h4> <label htmlFor="hours">Hours</label> <input value={minutes/60} id="hours" placeholder="Hours" type="number" onChange={handleHoursChange} /> <h4>입력된 분이 시간 단위로는 {minutes/60}</h4> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>

9. 반올림하기
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { const [minutes, setMinutes] = React.useState(0); const [hours, setHours] = React.useState(0); const handleMinutesChange = (event) => { setMinutes(event.target.value); }; const handleHoursChange = (event) => { setHours(event.target.value); }; return ( <div> <h1>단위 계산기</h1> <label htmlFor="minutes">Minutes</label> <input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={handleMinutesChange} /> <label htmlFor="hours">Hours</label> <input value={Math.round(minutes/60)} id="hours" placeholder="Hours" type="number" onChange={handleHoursChange} /> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>

10. 초기화 버튼 추가하기
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { const [minutes, setMinutes] = React.useState(0); const [hours, setHours] = React.useState(0); const handleMinutesChange = (event) => { setMinutes(event.target.value); const reset = () => setMinutes(0); return ( <div> <h1>단위 계산기</h1> <label htmlFor="minutes">Minutes</label> <input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={handleMinutesChange} /> <label htmlFor="hours">Hours</label> <input value={Math.round(minutes/60)} id="hours" placeholder="Hours" type="number" disabled} /> <button onClick={reset}>초기화 </button> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>



11. 전환하기
- hours의 input의 상태를 false와 true로 전환하기
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { const [minutes, setMinutes] = React.useState(0); const [flipped, setFlipped] = React.useState(false); const handleMinutesChange = (event) => { setMinutes(event.target.value); }; const reset = () => setMinutes(0); const onFlip = () => setFlipped((current) => !current); return ( <div> <h1>단위 계산기</h1> <label htmlFor="minutes">Minutes</label> <input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={handleMinutesChange} /> <label htmlFor="hours">Hours</label> <input value={Math.round(minutes/60)} id="hours" placeholder="Hours" type="number" disabled = {true} /> <button onClick={reset}>초기화</button> <button onClick={onFlip}>전환</button> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>

- minutes와 hours의 disabled 상태를 버튼으로 조절하기
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { const [minutes, setMinutes] = React.useState(0); const [flipped, setFlipped] = React.useState(false); const handleMinutesChange = (event) => { setMinutes(event.target.value); }; const reset = () => setMinutes(0); const onFlip = () => setFlipped((current) => !current); return ( <div> <h1>단위 계산기</h1> <label htmlFor="minutes">Minutes</label> <input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={handleMinutesChange} disabled = {flipped === true} /> <label htmlFor="hours">Hours</label> <input value={Math.round(minutes/60)} id="hours" placeholder="Hours" type="number" disabled = {flipped === false} /> // disabled = {!flipped} />와 같음 <button onClick={reset}>초기화</button> <button onClick={onFlip}>전환</button> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>


12. hours input에 입력하기
- 삼항 연산자 사용하기
- minutes에 입력하면 hours는 변환된 값이 표시
- minutes를 amount로 변경
- hours에 입력하면 그 입력된 값이 표시
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> function App() { const [amount, setAmount] = React.useState(0); const [flipped, setFlipped] = React.useState(false); const handleMinutesChange = (event) => { setAmount(event.target.value); }; const reset = () => setAmount(0); const onFlip = () => setFlipped((current) => !current); return ( <div> <h1>단위 계산기</h1> <label htmlFor="minutes">Minutes</label> <input value={flipped ? amount * 60 : amount} id="minutes" placeholder="Minutes" type="number" onChange={handleMinutesChange} disabled={flipped} /> <label htmlFor="hours">Hours</label> <input value={flipped ? amount : amount / 60} id="hours" placeholder="Hours" type="number" disabled={!flipped} /> <button onClick={reset}>초기화</button> <button onClick={onFlip}>전환</button> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>


- onChange 함수로 minutes와 hours 사용하기
<!DOCTYPE html> <html lang="en"> <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@6.26.0/babel.min.js"></script> <script type="text/babel"> 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>단위 계산기</h1> <label htmlFor="minutes">Minutes</label> <input value={flipped ? amount * 60 : amount} id="minutes" placeholder="Minutes" type="number" onChange={onChange} disabled={flipped} /> <label htmlFor="hours">Hours</label> <input value={flipped ? amount : Math.round(amount / 60)} id="hours" placeholder="Hours" type="number" disabled={!flipped} onChange={onChange} /> <button onClick={reset}>초기화</button> <button onClick={onFlip}>전환</button> </div> ); } const root = document.getElementById("root"); ReactDOM.render(<App />, root); </script> </html>




Share article