티스토리 뷰

728x90

 

 

 

1. 분을 시로 바꾸어보자 - 먼저 분이 잘 출력되는지 확인한다.

 

<!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@7.24.5/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 className="hi"> Super Converter </h1>
                    <label htmlFor="minutes">Minutes</label>
                    <input 
                        value={minutes}
                        id="minutes" 
                        placeholder="Minutes"
                        type="number" 
                        onChange={onChange}
                        />
                    <h4> You want to convert {minutes} </h4>
                    <label htmlFor="hours">Hours</label>
                    <input placeholder="Hours" type="number" />
                </div>
            );
        }
        const root = document.getElementById("root");
        ReactDOM.render(<App />, root);
    </script>
</html>

 

안돼면 script 바꿔주기

<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>

 

 

 

 

 

 

 

 

2. 분을 시로 바꾸어보자.

<!DOCTYPE html>
<html>
    <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@7.24.5/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 className="hi"> Super Converter </h1>
                    <div>
                        <label htmlFor="minutes">Minutes</label>
                        <input 
                            value={minutes}
                            id="minutes" 
                            placeholder="Minutes"
                            type="number" 
                            onChange={onChange}
                            />
                    </div>
                    <div>
                        <label htmlFor="hours">Hours</label>
                        <input 
                            value={minutes / 60}
                            // value={Math.round(minutes / 60)} 으로 하면 소수점 없이 반올림해줌
                            id="hours" 
                            placeholder="Hours"
                            type="number" 
                            />
                    </div>
                </div>
            );
        }
        const root = document.getElementById("root");
        ReactDOM.render(<App />, root);
    </script>
</html>

 

 

<!DOCTYPE html>
<html>
    <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@7.24.5/babel.min.js"></script>
    <script type="text/babel">
        function App() {
            const [minutes, setMinutes] = React.useState();
            const onChange = (event) => {
                setMinutes(event.target.value);
            };
            const reset = () => setMinutes(0);
            return (
                <div>
                    <h1 className="hi"> Super Converter </h1>
                    <div>
                        <label htmlFor="minutes">Minutes</label>
                        <input 
                            value={minutes}
                            id="minutes" 
                            placeholder="Minutes"
                            type="number" 
                            onChange={onChange}
                            />
                    </div>
                    <div>
                        <label htmlFor="hours">Hours</label>
                        <input 
                            value={Math.round(minutes / 60)}
                            id="hours" 
                            placeholder="Hours"
                            type="number" 
                            />
                    </div>
                    <button onClick={reset}>Reset</button>
                </div>
            );
        }
        const root = document.getElementById("root");
        ReactDOM.render(<App />, root);
    </script>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

3. 바꾸어서 시를 분으로 바꾸어보자.

<!DOCTYPE html>
<html>
    <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@7.24.5/babel.min.js"></script>
    <script type="text/babel">
        function App() {
            const [amount, setMinutes] = React.useState();
            const [flipped, setFlipped] = React.useState(false);
            const onChange = (event) => {
                setMinutes(event.target.value);
            };
            const reset = () => setMinutes(0);
            const onFlip = () => {
                reset();
                setFlipped((current) => !current); //!는 반대
            };
            return (
                <div>
                    <h1 className="hi"> Super Converter </h1>
                    <div>
                        <label htmlFor="minutes">Minutes</label>
                        <input 
                            value={flipped ? amount * 60 : amount}
                            // ? 는 ~가 된다면
                            id="minutes" 
                            placeholder="Minutes"
                            type="number" 
                            onChange={onChange}
                            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}
                            onChange={onChange}
                            />
                    </div>
                    <button onClick={reset}>Reset</button>
                    <button onClick={onFlip}>Flip</button>
                </div>
            );
        }
        const root = document.getElementById("root");
        ReactDOM.render(<App />, root);
    </script>
</html>

 

  • 버튼을 누르면 뒤로가기로 바꿀 수 있다.
<button onClick={onFlip}>{flipped ? "Turn back" : "Flip"}</button>

 

 

 

 

 

 

 

 

 

4. 킬로미터로 바꾸는 것도 추가해서 선택해 계산해 볼 수 있도록 하자

 

<!DOCTYPE html>
<html>
    <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@7.24.5/babel.min.js"></script>
    <script type="text/babel">
        function MinutesToHours() {
            const [amount, setMinutes] = React.useState();
            const [flipped, setFlipped] = React.useState(false);
            const onChange = (event) => {
                setMinutes(event.target.value);
            };
            const reset = () => setMinutes(0);
            const onFlip = () => {
                reset();
                setFlipped((current) => !current); //!는 반대
            };
            return (
                <div>
                    <div>
                        <label htmlFor="minutes">Minutes</label>
                        <input 
                            value={flipped ? amount * 60 : amount}
                            id="minutes" 
                            placeholder="Minutes"
                            type="number" 
                            onChange={onChange}
                            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}
                            onChange={onChange}
                            />
                    </div>
                    <button onClick={reset}>Reset</button>
                    <button onClick={onFlip}>{flipped ? "Turn back" : "Flip"}</button>
                </div>
            );
        }
        function KmToMiles() {
            return (
                <div>
                    <h1 className="hi"> Km To Miles </h1>
                </div>
            );
        }
        function App() {
            const [index, setindex] = React.useState("0");
            const onSelect = (event) => {
                setindex(event.target.value);
            };
            return (
                <div>
                    <h1 className="hi"> Super Converter </h1>
                    <select value={index} onChange={onSelect}>
                        <option value="0">Minutes To Hours</option>
                        <option value="1">Km To Miles</option>
                    </select>
                    <hr/>
                    {index === "0" ? <MinutesToHours /> : null}
                    {index === "1" ? <KmToMiles /> : null}
                </div>
            );
        }
        const root = document.getElementById("root");
        ReactDOM.render(<App />, root);
    </script>
</html>

 

 

 

 

 

 

 

 

 

5. Props 방식 : 부모 컴포넌트로 부터 자식 컴포넌트에 데이터를 보낼 수 있는 방식

 

<!DOCTYPE html>
<html>
  <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@7.24.5/babel.min.js"></script>
  <script type="text/babel">
    function SaveBtn() {
      return <button>Save Changes</button>;
    }
    function ConfirmBtn() {
      return <button>Confirm</button>;
    }
    function App() {
      return (
        <div>
        <SaveBtn />
        <ConfirmBtn />
        </div>
      );
    }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);
  </script>
</html>

 

 

처음에는 좀 못생긴 버튼이 생성된다. 이제 조금 이쁘게 만들어보자.

<script type="text/babel">
    function SaveBtn() {
      return <button style={{
        backgroundColor: "tomato",
        color: "white",
        padding: "10px 20px",
        border: 0,
        borderRadius: 10,
      }}>Save Changes</button>;
    }

 

 

이걸 여러 버튼에 적용하려면 다르게 해주어야 한다.

<img src="" >해주었던 것처럼 정의를 내려준다.

function App() {
      return (
        <div>
        <Btn banana= "SaveBtn" />
        <Btn banana= "ConfirmBtn" />
        </div>
      );

 

이런식으로 넣어주려고 한다.

 

<!DOCTYPE html>
<html>
  <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@7.24.5/babel.min.js"></script>
  <script type="text/babel">
    function Btn(props) { //props 는 언제나 하나만 받을 수 있다.
      return <button style={{
        backgroundColor: "tomato",
        color: "white",
        padding: "10px 20px",
        border: 0,
        borderRadius: 10,
      }}>
      {props.banana}
      </button>;
    }
    function App() {
      return (
        <div>
        <Btn banana= "SaveBtn" />
        <Btn banana= "ConfirmBtn" />
        </div>
      );
    }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);
  </script>
</html>

 

 

조건도 다르게 줄 수 있다.

<!DOCTYPE html>
<html>
  <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@7.24.5/babel.min.js"></script>
  <script type="text/babel">
    function Btn({banana, big}) { 
      return <button style={{
        backgroundColor: "tomato",
        color: "white",
        padding: "10px 20px",
        border: 0,
        borderRadius: 10,
        fontSize: big ? 20 : 10,
      }}>
      {banana}
      </button>;
    }
    function App() {
      return (
        <div>
        <Btn banana= "SaveBtn" big={true}/>
        <Btn banana= "ConfirmBtn" big={false}/>
        </div>
      );
    }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);
  </script>
</html>

 

 

 

 

 

 

 

 

 

 

 

6. 버튼을 클릭할 수 있는 것으로 바꾸기

 

클릭하면 이름이 바뀌는 것부터 만들어보자.

<!DOCTYPE html>
<html>
  <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@7.24.5/babel.min.js"></script>
  <script type="text/babel">
    function Btn({banana, onClick_1}) { 
      return <button 
        onClick={onClick_1}
        style={{
          backgroundColor: "tomato",
          color: "white",
          padding: "10px 20px",
          border: 0,
          borderRadius: 10,
        }}>
      {banana}
      </button>;
    }
    function App() {
      const [value, setValue] = React.useState("Save Changes");
      const changeValue = () => setValue("Revert Change");
      return (
        <div>
        <Btn banana= {value} onClick_1={changeValue}/>
        <Btn banana= "ConfirmBtn"/>
        </div>
      );
    }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);
  </script>
</html>

 

 

두개의 버튼이 모두 렌더링 되는게 아니라 하나의 버튼이 바뀔 때에만 렌더링을 하고 싶을 때 console.log 를 해서 나오는 것을 보자.

momo를 이용하여 바뀐 것만 렌더링해 log를 찍어 보여주는 것을 볼 수 있다. 

    function Btn({banana, onClick_1}) { 
      console.log(banana, "tt")
      return <button 
        onClick={onClick_1}
        style={{
          backgroundColor: "tomato",
          color: "white",
          padding: "10px 20px",
          border: 0,
          borderRadius: 10,
        }}>
      {banana}
      </button>;
    }
    const MemorizedBtn = React.memo(Btn);
    function App() {
      const [value, setValue] = React.useState("Save Changes");
      const changeValue = () => setValue("Revert Change");
      return (
        <div>
        <MemorizedBtn banana= {value} onClick_1={changeValue}/>
        <MemorizedBtn banana= "ConfirmBtn"/>
        </div>
      );
    }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);
  </script>
</html>

 

 

 

 

 

 

 

 

 

 

 

7. 실수 했을 때 console 로 확인하는 방법

 

잘못 입력을 했는데도 에러가 안뜨는 것을 볼 수 있다.

이럴 때 협업하면 에러를 찾아야 할 때 힘들다.

에러를 자동으로 console로 보여줄 수 있게 세팅해보자.

 

  <script src="https://unpkg.com/prop-types@15.7.2/prop-types.js"></script>

 

<!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/prop-types@15.7.2/prop-types.js"></script>
  <script src="https://unpkg.com/@babel/standalone@7.24.5/babel.min.js"></script>
  <script type="text/babel">
    function Btn({banana, fontSize}) { 
      return <button 
        style={{
          backgroundColor: "tomato",
          color: "white",
          padding: "10px 20px",
          border: 0,
          borderRadius: 10,
          fontSize,
        }}>
        {banana}
      </button>;
    }
    Btn.propTypes = {
      banana: PropTypes.string,
      fontSize: PropTypes.number,
    }
    function App() {
      return (
        <div>
          <Btn banana="Save Changes" fontSize={18}/>
          <Btn banana={14} fontSize={"tt"}/>
        </div>
      );
    }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);
  </script>
</html>

 

 

이렇게 되면 에러메세지는 띄워주는 것을 볼 수 있다.

만약 하나라도 안 썼을 때에도 에러가 뜨게 해주고 싶으면 isRequired 옵션을 넣어주면 된다.

Btn.propTypes = {
      banana: PropTypes.string,
      fontSize: PropTypes.number.isRequired,
    }
    function App() {
      return (
        <div>
          <Btn banana="Save Changes" fontSize={18}/>
          <Btn banana="ff"/>
        </div>
      );
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형
TAG
more
최근에 올라온 글