3.React

2022. 9. 6. 17:29프론트엔드

2022.09.06.화


1.props_state

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
    <div id="root"></div>

    <script type="text/babel">
        //1.props
        // const Component = props => {
        //     console.log(props);
        //     return (
        //         <div>
        //             <h1>It's a {props.value}</h1>
        //         </div>
        //     )
        // }

        //별도로 지정한 props가 없을 때 defaultProps를 지정하고자 할때
        // Component.defaultProps = {
        //     value: 'default value',
        // }

        // ReactDOM.render(<Component />, document.getElementById('root'));

        //2.before state
        // let count = 0;
        // const BeforeState = props => {
        //     const clickHandler = () => { //click event를 처리할 핸들러(담당자)
        //         // console.log('button clicked');
        //         count++;
        //         console.log(count);
        //     }

        //     return (
        //         <div>
        //             <p>You clicked {count} times</p>
        //             <button onClick={clickHandler}>Click me</button>    
        //         </div>
        //     )
        // }

        // ReactDOM.render(<BeforeState />, document.getElementById('root'));

        //3.state
        // console.log(React);

        const { useState } = React; //React객체에서 useState라는 이름의 프로퍼티 추출(import useState)
        //console.log(useState)

        const Example = () => {
            console.log('rendered');

            //우리의 관심사는 count값(하나의 state)
            //-> 특정 컴포넌트에서 관리하고자 하는 값들을 state개념으로 관리할 수 있음

            //useState hook의 원형 : [state, setState] = useState(initialState);
            const [count, setCount] = useState(0); //count라는 state의 초기값을 0으로 지정 useState(초기값 or initialState)

            const clickHandler = () => {
                //count += 1; //count is read only
                setCount(count + 1); //setCount()를 통해 count(state 값)을 변경
                //state(Example 컴포너틑 맥락에서 state는 count)가 변경되면 
                //React는 변경 내역 감지하고, 해당 컴포넌트를 새로 렌더링 시킴(re-rendering)
            }

            return (
                <div>
                     <p>You clicked {count} times</p>
                     <button onClick={clickHandler}>Click me</button>    
                </div>
            )
        }
        ReactDOM.render(<Example />, document.getElementById('root'));

    </script>
</body>
</html>

2.event_handling

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
    <div id="root"></div>

    <script type="text/babel">
        const { useState } = React; 

        const Toggle = () => {
            //useState hook의 원형 : [state, setState] = useState(initialState);
            const [isOn, setIsOn] = useState(false);

            const clickHandler = () => {
               setIsOn(!isOn)

            //    document.getElementById('button').innerHTML = isOn ? 'Off' : 'On';
            //    document.getElementById('img').src = isOn ? 'pic_bulbon.gif' : 'pic_bulboff.gif';

            }

            return (
                <>
                     <button id='button' onClick={clickHandler}>{isOn ? 'Off' : 'On'}</button>
                     <img id='img' src={isOn ? 'pic_bulbon.gif' : 'pic_bulboff.gif'} />
                </>
            )
        }
        ReactDOM.render(<Toggle />, document.getElementById('root'));
    </script>
</body>
</html>

3.conditional_rendering

 -login_state

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
    <div id="root"></div>

    <script type="text/babel">
        //로그인 상태일 때 사용할 컴포넌트
        const UserGreeting = props => {
            return <h1>Welcome back!</h1>;
        }

        //비로그인 상태일 때 사용할 컴포넌트
        const GuestGreeting = props => {
            return <h1>Please sign up!</h1>;
        }

        //로그인 여부를 알려주는 최상위 컴포넌트
        const Greeting = props => {
            // if(props.isLoggedIn) {
            //     return <UserGreeting />; 
            // }
            // return <GuestGreeting />;
            //삼항 연산자로 변경
            return props.isLoggedIn ? <UserGreeting /> : <GuestGreeting />;
        }

        ReactDOM.render(<Greeting isLoggedIn={false}/>, document.getElementById('root'));
    </script>
</body>
</html>

 -login_control

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <title>Document</title>
</head>
<body>
    <div id="root"></div>
    
    <script type="text/babel">
        // 함수형 컴포넌트로 LoginControl이라는 컴포넌트 생성

        // 현재 LoginControl이 최상위 컴포넌트.
        const { useState } = React;

        const LoginControl = () => {
            const [isLoggedIn, setIsLoggedIn] = useState(false);
            // is it Logged in? true or false

            const loginButtonHandler = () => {
                setIsLoggedIn(!isLoggedIn)
            };

            return (
                <>
                    <Greeting isLoggedIn={isLoggedIn}/>
                    {isLoggedIn ? <LogoutButton onClick={loginButtonHandler}/> : <LoginButton onClick={loginButtonHandler}/>}
                </>
            )
        }

        // 인사 메시지를 처리하는 별도의 컴포넌트 생성
        const Greeting = (props) => {
            return props.isLoggedIn ? <UserGreeting /> : <GuestGreeting />
        }

        const UserGreeting = () => {
            return <h1>Welcome back!</h1>
        }

        // GuestGreeting.jsx, GuestGreeting.js
        const GuestGreeting = () => {
            return <h1>Please sign in!</h1>
        }

        // props로 함수를 전달받아서, 그 함수를 호출해서 Login or Logout text 및
        // Greeting 텍스트도 변경하려면 어떻게 해야할까?
        const LoginButton = (props) => {
            return <button onClick={props.onClick}>Login</button>
        };
        
        const LogoutButton = (props) => {
            return <button onClick={props.onClick}>Logout</button>
        };

        ReactDOM.render(<LoginControl />, document.getElementById('root'));
    </script>
</body>
</html>

4.list_key

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
    <div id="root"></div>

    <script type="text/babel">
        //1.map() basic
        const numbers = [1, 2, 3, 4, 5];

        //map() Array 사용가능
        //Array.prototype.map(callbackFn)
        const doubled = numbers.map(number => number * 2);
        //numbers배열에 있는 요소(item or number)를 하나씩 number 배열에 할당 
        //number * 2 연산 처리 후에 새로운 배열로 반환

        //2.map() in react
        const NumberList = (props) => {
            const numbers = props.numbers;
            const listItems = numbers.map((number, index) => <li key={index}>{number}</li>);
            console.log(listItems);
            return (
                <ul>
                    {listItems}
                </ul>
            )
        }

        ReactDOM.render(<NumberList numbers={numbers}/>, document.getElementById('root'));
    </script>
</body>
</html>

5.form

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
    <div id="root"></div>

    <script type="text/babel">

        const Form = (props) => {
            const submitHandler = (event) => { //submit 이벤트를 처리할 핸들러 작성
                event.preventDefault(); //form의 기본 동작(reloading)을 제어하기 위한 코드
                console.log('You clicked submit');
            }

            return (
                <form onSubmit={submitHandler}>
                    <button type="submit">Submit</button>    
                </form>
            )
        }

        ReactDOM.render(<Form />, document.getElementById('root'));
    </script>
</body>
</html>

 

 

'프론트엔드' 카테고리의 다른 글

4.React CSS  (0) 2022.09.07
2.React  (0) 2022.09.05
1.CSS  (0) 2022.08.17
0.HTML/CSS  (0) 2022.08.16