인프런 커뮤니티 질문&답변

박진혁님의 프로필 이미지
박진혁

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

08-01-map-fruits

섹션 30 퀴즈

해결된 질문

작성

·

239

0

import styled from "@emotion/styled";
import { useState } from "react";

// 스타일
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
const Container = styled.div`
  display: flex;
  justify-content: center;
  padding: 100px;
`;
const Wrapper = styled.table`
  width: 600px;
`;
const MyTr = styled.tr`
  text-align: center;
`;
const MyTd = styled.td`
  padding: 20px 0 20px 0;
`;
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

export default function Quiz02() {
  // 리스트에 뿌려줄 목업 데이터
  // --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  const dataList = [
    { id: 1, data: "9월달 시스템 점검 안내입니다.", date: "2020.09.19" },
    { id: 2, data: "안녕하세요! 공지사항 전달드립니다.", date: "2020.09.17" },
    { id: 3, data: "개인정보 처리방침 변경 사전 안내", date: "2020.09.12" },
    { id: 4, data: "ios 10.0이하 지원 중단 안내", date: "2020.08.10" },
    { id: 5, data: "이용약관 변경 사전 안내", date: "2020.08.01" },
    { id: 6, data: "개인정보 처리방침 변경 사전 안내", date: "2020.07.19" },
  ];

  const [checkList, setCheckList] = useState([]);
  console.log("현재 체크리스트", checkList);

  const onClickCheckAll = () => {
    console.log("받아오는 데이터의 길이", dataList.length); 
    console.log("현재 체크리스트에 들어있는 데이터의 길이", checkList.length);
    if (checkList.length !== dataList.length) {
      setCheckList(dataList);                   //체크 리스트 크기와 데이터 크기가 같지않으면 체크리스트에 데이터를 넣는다.
    } else {
      setCheckList([]);
    }
  };

  const onCheckedItem = (list) => {
    console.log("내가 누른 체크리스트가 뭔가?", list);
    // 모든 checkList.id 중에 체크한 list.id값이 없으면 CheckList에 list 값을 넣는다.
    if (checkList.every((cur) => cur.id !== list.id)) {
      setCheckList([...checkList, list]);
    } else {
      // 체크된것만 제외하고 배열에 담는다.
      const result = checkList.filter((cur) => cur.id !== list.id);
      setCheckList(result);
    }
  };

  const isChecked = (list) => {   // 체크박스에 체크할지 안할지 
    return checkList.some((cur) => cur.id === list.id); //list.id 요소와 checkList.id 요소와 겹치는게 있다면 true를 반환한다.
  };

  return (
    <Container>
      <Wrapper>
        <tr>
          <th>
            <input
              type="checkbox"
              onChange={onClickCheckAll}
              checked={checkList.length === dataList.length}
              style={{ marginTop: "5px" }}
            ></input>
          </th>
          <th>번호</th>
          <th>제목</th>
          <th>작성일</th>
        </tr>
        {dataList.map((list, index) => (  // 데이터 배열의 요소와 인덱스 가져오기
          <MyTr key={index}>              {/* 정적 데이터기 때문에 key값을 인덱스로 설정 */}
            <MyTd>
              <input
                type="checkbox"
                onChange={() => onCheckedItem(list)}
                checked={isChecked(list)}
                style={{ marginTop: "5px" }}
              />
            </MyTd>
            <MyTd>{list.id}</MyTd>
            <MyTd>{list.data}</MyTd>
            <MyTd>{list.date}</MyTd>
          </MyTr>
        ))}
      </Wrapper>
    </Container>
  );
}

섹션 30 퀴즈 레퍼런스 코드에서

onChange={() => onCheckedItem(list)}
  1. 이 부분 그냥 화살표 함수로 하는 이유가 있나요?

else {
      // 체크된것만 제외하고 배열에 담는다.
      const result = checkList.filter((cur) => cur.id !== list.id); 
      setCheckList(result);
    }
  1. 이 코드에서 선택한것을 체크해제 했을때 아무것도 체크 되어 있지 않다면 result는 빈값인가요?

답변 1

0

노원두님의 프로필 이미지
노원두
지식공유자

안녕하세요! 진혁님!

해당 코드는 레퍼런스 코드로, 정답이 아니며 참고용으로 사용해 주세요!

먼저 1번은, 이러한 방법도 가능함을 보여드린 것이며, 뒤쪽 최적화 수업에서 저 방법보다 험수 자체를 바인딩하는 방법이 더 좋은 이유에 대해 설명합니다!

다음으로 2번째는, 해당 로직상 빈 배열이 들어갈 것 같네요!^^

박진혁님의 프로필 이미지
박진혁

작성한 질문수

질문하기