[DAY - 72] checkbox, useEffect

2023. 6. 15. 21:16·🔥 부트캠프-웹 개발 🔥/React
  • checkbox
  • useEffect

 

 

1) checkbox

import React, { useState } from 'react';

const dataList = [
    { id: 1, name: 'chk1', text: "연령( 만 14세 이상 ) 확인 ( 필수 )", isChk: true },
    { id: 2, name: 'chk2', text: "연독스 이용약관 ( 필수 )", isChk: false },
    { id: 3, name: 'chk3', text: "개인정보 수집 및 이용에 대한 동의 ( 필수 )", isChk: false },
    { id: 4, name: 'chk4', text: "이벤트 우대혜택 동의 안내 ( 선택 )", isChk: false },
]

const Test1 = () => {
    const [data, setData] = useState(dataList);
    const changeInput = (e) => {
        const { name, checked } = e.target
        if (name === 'all') {
            setData(data.map(item => {
                return {
                    ...item,
                    isChk: checked
                }
            }))
        } else {
            setData(data.map(item =>  item.name === name ? { ...item, isChk: checked } : item ))
        }
    }
    return (
        <div style={{ margin: 30 }}>
            <p>
                <input type="checkbox" name="all" id="" onChange={changeInput} checked={data.filter(item=>item.isChk === false).length < 1}/>
                <label htmlFor=""> 전체동의</label>
            </p>
            <hr />
            {
                data.map(item => <p key={item.id}>
                    <input type="checkbox" name={item.name} id="" checked={item.isChk} onChange={changeInput} />
                    <label htmlFor=""> {item.text}</label>
                </p>)
            }
            <hr />
        </div>
    );
};

export default Test1;

checkbox

 

체크박스를 구현해 봤는데 전체동의를 새롭게 배웠다.

 

        if (name === 'all') {
            setData(data.map(item => {
                return {
                    ...item,
                    isChk: checked
                }
            }))
        } else {
            setData(data.map(item =>  item.name === name ? { ...item, isChk: checked } : item ))
        }

 

만약 클릭한 checkbox의 name이 all인 경우 모든 checkbox의 isChk 상태를 checked로 바꿔주고 아닐 경우 해당하는 checkbox의 isChk만 checked로 바꾸어주게 된다.

 

            <p>
                <input type="checkbox" name="all" id="" onChange={changeInput} checked={data.filter(item=>item.isChk === false).length < 1}/>
                <label htmlFor=""> 전체동의</label>
            </p>

 

그리고 모든 checkbox가 true일 경우 전체동의 박스도 checkde가 된다.

 

 

2) useEffect

useEffect 훅을 사용하면 단순히 함수 결과값을 출력하는 것 외에도 다른 효과가 가능하다.

import React from 'react';
import { useEffect } from 'react';
import { useRef } from 'react';
import { useState } from 'react';

const Test2 = () => {
    const [count, setCount] = useState(1)
    const ref1 = useRef()
    const ref2 = useRef()
    const onColor = () => {
        setCount(count + 1)
        ref1.current.style.backgroundColor = 'tan'
        ref2.current.style.backgroundColor = 'lightgray'
    }
    useEffect(() => {
        console.log("useEffect")
        ref1.current.style.backgroundColor = 'orange'
    })
    useEffect(() => {
        console.log("useLayoutEffect")
        ref2.current.style.backgroundColor = 'tomato'
    })

    return (
        <div>
            <h2>카운트 : {count}</h2>
            <h2 ref={ref1}> useEffect</h2>
            <h2 ref={ref2}> useLayoutEffect</h2>
            <button onClick={onColor}>카운트 + 컬러</button>
        </div>
    );
};

export default Test2;

useEffect
useEffect

 

버튼을 클릭할 때마다 background-color가 tan, lightgray로 바뀌어야 하지만 useEffect 때문에 바뀌는 순간이 눈에 보이지 않는다.

useEffect는 화면에 출력 된 후 실행이 되고, useLayoutEffect는 화면에 출력 전 실행이 된다.

 

 

import React from 'react';
import { useEffect } from 'react';
import { useRef } from 'react';
import { useState } from 'react';

const Test3 = () => {
    const [text, setText] = useState('')
    const textRef = useRef()

    const changeInput = e => {
        setText(e.target.value)
    }
    useEffect(()=>{
        console.log('useEffect');
        textRef.current.focus()
    },[])

    return (
        <div>
            <h2>useEffect</h2>
            <input type="text" ref={textRef} value={text} onChange={changeInput}/>
        </div>
    );
};

export default Test3;

 

이전 코드처럼 계속해서 effect가 발생하는 것을 막기 위해 한 번만 실행이 되도록 대괄호를 넣어줘야 한다

 

    useEffect(()=>{
        console.log('useEffect');
        textRef.current.focus()
    },[])

 

이렇게 하면 처음 한 번만 실행이 된다.

 

'🔥 부트캠프-웹 개발 🔥/React' 카테고리의 다른 글
  • [DAY - 74] bootstrap, material, styled
  • [DAY - 73] 회원 관리 예제, 장바구니 예제, JS 예제 React 변환
  • [DAY - 71] 탭 메뉴(class, 상태변수)
  • [DAY - 70] vanilla.js 예제 React.js 변환
Yeonhub
Yeonhub
✨ https://github.com/yeonhub 📧 lsy3237@gmail.com
  • Yeonhub
    비 전공자의 Be developer
    Yeonhub
  • 전체
    오늘
    어제
    • 전체보기 (169)
      • 🔍 Tech 🔍 (19)
        • Front-End (11)
        • Back-End (4)
        • AI (1)
        • Server (1)
        • Etc (2)
      • 💡 원티드 프리온보딩 챌린지 💡 (14)
        • PRE-ONBOARDING_AI (11월) (1)
        • PRE-ONBOARDING_FE (2월) (2)
        • PRE-ONBOARDING_FE (1월) (2)
        • PRE-ONBOARDING_FE (12월) (9)
      • 🔥 부트캠프-웹 개발 🔥 (118)
        • HTML5 (7)
        • CSS3 (21)
        • JavaScript (27)
        • JavaScript_advanced (9)
        • React (24)
        • Next (1)
        • MYSql (5)
        • Node (5)
        • 오늘하날(개인프로젝트) (12)
        • 이젠제주투어(팀프로젝트) (7)
      • 💻 CS 💻 (1)
        • 알고리즘 (1)
      • ⚡ 코딩테스트 ⚡ (11)
        • JavaScript (11)
      • 📚 Books 📚 (6)
        • 클린 아키텍처 (2)
        • 인사이드 자바스크립트 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    라스콘4
    python node
    컴파운드 컴포넌트 패턴
    react native firebase analytics
    react native admob
    react native analytics
    expo 길찾기
    expo google map
    expo deep linking
    bottom sheet
    react vite
    expo fcm
    node fcm
    라스콘
    react native bottom sheet
    expo node fcm
    react native expo fcm
    rn bottom sheet
    expo fcm push
    expo admob
    Node
    php node
    rn admob
    node crontab
    javascript fcm
    node cron
    expo 지도
    프론트엔드 테스트코드
    node.js fcm
    expo map
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Yeonhub
[DAY - 72] checkbox, useEffect
상단으로

티스토리툴바