일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- React Native
- 코딩기초
- 타입스크립트
- 리액트 네이티브
- 프론트엔드
- react-router
- 깃
- 코딩초보
- TypeScript
- 코딩독학
- useEffect
- scss
- 참조자료형
- 코린이
- 자바스크립트
- 비동기
- async
- 사용하는 이유
- redux
- html기초
- JavaScript
- 코딩공부
- http
- 리액트
- react
- SasS
- git
- 리덕스
- Vue3
- CSS
Archives
- Today
- Total
맨 땅에 프론트엔드 개발자 되기
React 체크박스 전체 선택/해제 기능 구현하기 본문
728x90
체크박스 전체 선택 / 해제 기능에서 구현해야할 기능 목록
1. 최상단 체크 박스 클릭 시 전체 선택 / 해제 토글 기능
2. 전체 선택 시에 하나라도 체크가 해제되면 최상단 체크 박스 선택 해제
3. 모든 체크박스가 선택될 경우 최상단 체크 박스 선택 활성화
import { useState } from 'react';
import styled from 'styled-components';
export default function Sample() {
const data = [
{id: 0, title: '선택 1'},
{id: 1, title: '선택 2'},
{id: 2, title: '선택 3'},
{id: 3, title: '선택 4'}
];
// 체크된 아이템을 담을 배열
const [checkItems, setCheckItems] = useState([]);
// 체크박스 단일 선택
const handleSingleCheck = (checked, id) => {
if (checked) {
// 단일 선택 시 체크된 아이템을 배열에 추가
setCheckItems(prev => [...prev, id]);
} else {
// 단일 선택 해제 시 체크된 아이템을 제외한 배열 (필터)
setCheckItems(checkItems.filter((el) => el !== id));
}
};
// 체크박스 전체 선택
const handleAllCheck = (checked) => {
if(checked) {
// 전체 선택 클릭 시 데이터의 모든 아이템(id)를 담은 배열로 checkItems 상태 업데이트
const idArray = [];
data.forEach((el) => idArray.push(el.id));
setCheckItems(idArray);
}
else {
// 전체 선택 해제 시 checkItems 를 빈 배열로 상태 업데이트
setCheckItems([]);
}
}
return (
<StyledTable>
<thead>
<tr>
<th>
<input type='checkbox' name='select-all'
onChange={(e) => handleAllCheck(e.target.checked)}
// 데이터 개수와 체크된 아이템의 개수가 다를 경우 선택 해제 (하나라도 해제 시 선택 해제)
checked={checkItems.length === data.length ? true : false} />
</th>
<th className='second-row'>목록</th>
</tr>
</thead>
<tbody>
{data?.map((data, key) => (
<tr key={key}>
<td>
<input type='checkbox' name={`select-${data.id}`}
onChange={(e) => handleSingleCheck(e.target.checked, data.id)}
// 체크된 아이템 배열에 해당 아이템이 있을 경우 선택 활성화, 아닐 시 해제
checked={checkItems.includes(data.id) ? true : false} />
</td>
<td className='second-row'>{data.title}</td>
</tr>
))}
</tbody>
</StyledTable>
)
}
const StyledTable = styled.table`
text-align: center;
border-collapse: collapse;
thead{
tr{
th{
padding: 10px 15px;
background-color: #888;
color: #fff;
font-weight: 700;
}
}
}
tbody{
tr{
td{
padding: 7px 15px;
border-bottom: 1px solid #eee;
}
}
}
.second-row{
width: 150px;
}
`;
오늘의 TIL 기록 끝!
728x90
'코딩 공부 일지 > React JS' 카테고리의 다른 글
Redux-Saga 사용방법 정리 (0) | 2022.07.13 |
---|---|
React 로컬 스토리지를 이용하여 하루 동안 보이지 않기 구현하기 (0) | 2022.07.08 |
Redux 미들웨어란? (0) | 2022.06.19 |
React state 변경 비동기 처리에 관하여 / 여러 개 state 변경 에러 해결하기 (0) | 2022.06.11 |
React 부모 컴포넌트에서 자식 컴포넌트 함수 호출하기 - useImperativeHandle (4) | 2022.06.11 |