100일 챌린지/빅데이터기반 인공지능 융합 서비스 개발자

Day 78 - react 문법(2)

ksyke 2024. 11. 20. 12:29

목차

    useState

    import React, { useState } from 'react'
    
    export default function Ex01() {
    
        const [su,setSu]=useState(1111);
        const [obj,setObj]=useState({key1:'val1',su2:2222});
    
      return (
        <>
            <h2>state</h2>
            <div>su:{su}</div>
            <div>{obj.key1}:{obj.su2}</div>
            <button onClick={e=>{
                setSu(su+1);
                const obj2={...obj,su2:obj.su2+1};
                setObj(obj2);
            }}>click</button>
        </>
      )
    }

    useEffect

    import React, { useEffect, useState } from 'react'
    
    export default function Ex01() {
    
        const [su,setSu]=useState(1111);
        const [obj,setObj]=useState({key1:'val1',su2:2222});
    
        useEffect(()=>{
            console.log('effect taken on:',su);
            setTimeout(()=>setSu(su+1),1000);
        },[su]);
    
      return (
        <>
            <h2>state</h2>
            <div>su:{su}</div>
            <div>{obj.key1}:{obj.su2}</div>
            <button onClick={e=>{
                setSu(su+1);
            }}>click1</button>
            <button onClick={e=>{
                const obj2={...obj,su2:obj.su2+1};
                setObj(obj2);
            }}>click2</button>
        </>
      )
    }

    useRef

    import React, { useRef, useState } from 'react'
    
    function Ex02() {
    
        const [input1,setInput1]=useState('');
        const input2=useRef();
    
      return (
        <div>
            <input ref={input2} onChange={e=>{setInput1(e.target.value);}} value={input1}/>
            <button onClick={e=>{console.log(input2.current.value);}}>클릭</button>
        </div>
      )
    }
    
    export default Ex02

    memo()

    import React, { memo, useEffect } from 'react'
    
    function Ex04({obj}) {
        useEffect(()=>{
            console.log('ex04 rendering...'); // 로딩할때만 Ex04의 렌더링이 이루어진다.
        })
      return (
        <div>su2:{obj.su2}</div>
      )
    }
    
    export default memo(Ex04); // 변화가 없을때는 렌더링을 하지 않는다.
    import React, { useState } from 'react'
    import Ex04 from './Ex04';
    
    function Ex03() {
    
        const [su1,setSu1]=useState(1111);
        const [obj,setObj]=useState({su2:2222});
    
      return (
        <div>
            <div>su1:{su1}</div>
            <Ex04 obj={obj}/>
            <button onClick={e=>{
                setSu1(su1+1);
            }
            }>click1</button>
            <button onClick={e=>{
                setObj({...obj,su2:obj.su2+1});
            }
            }>click2</button>
        </div>
      )
    }
    
    export default Ex03

    useCallback

    import React, { memo, useEffect } from 'react'
    
    function Ex06({todos,addTodo}) {
    
        useEffect(()=>{
            console.log('ex06 rendering...');
        });
    
        return (
          <>
            <h2>My Todos</h2>
            {todos.map((todo, index) => {
              return <p key={index}>{todo}</p>;
            })}
            <button onClick={addTodo}>Add Todo</button>
          </>
        );
    }
    
    export default memo(Ex06);
    import React, { useCallback, useState } from 'react'
    import Ex06 from './Ex06';
    
    function Ex05() {
        const [count, setCount] = useState(0);
        const [todos, setTodos] = useState([]);
      
        const increment = () => {
          setCount((c) => c + 1);
        };
        const addTodo = useCallback(() => {
          setTodos((t) => [...t, "New Todo"]);
        },[todos]);
      
        return (
          <>
            <Ex06 todos={todos} addTodo={addTodo} />
            <hr />
            <div>
              Count: {count}
              <button onClick={increment}>+</button>
            </div>
          </>
        );
    }
    
    export default Ex05

    useMemo

    custom Hooks

    import React from 'react'
    
    export default ()=>{
      return (
        <div>Ex07</div>
      )
    }
    
    
    const Ex07=()=>{
      return (
        <div>Ex07</div>
      )
    }
    
    export default Ex07

    useReducer

    import React, { useReducer, useState } from 'react'
    
    let init={su:10};
    
    const PLUS='plus',MINUS='minus',PLUSPLUS='plusplus';
    
    const suReducer=(state,action)=>{
        console.log(state,action);
    
        switch(action.type){
            case PLUS:
                return {...state,su:state.su+1};
            case MINUS:
                return {...state,su:state.su-1};
            case PLUSPLUS:
                return {...state,su:state.su+action.value};
            default:
                return state;
        }
    };
    
    function Ex08() {
    
        // const [su,setSu]=useState(0);
        const [obj,dispatch]=useReducer(suReducer,init);
    
      return (
        <div>
            <h2>su:{obj.su}</h2>
            <button onClick={e=>dispatch({type:'plus'})}>plus</button>
            <button onClick={e=>dispatch({type:'plusplus',value:10})}>plus+10</button>
            <button onClick={e=>dispatch({type:'minus'})}>minus</button>
        </div>
      )
    }
    
    export default Ex08

    useContext