반응형
ReactNative, Nest.js 등에서 useState의 state, setState로 배열([]) 혹은 객체({})의 값 변경
배열의 값([]) 변경
배열의 값 변경에 실패하는 경우
const [checkList, setCheckList] = useState<boolean[]>([]);
...
/**
* 체크박스 handler
* @param e: React.ChangeEvent<HTMLInputElement>
*/
const onCheckHandler = (e: React.ChangeEvent<HTMLInputElement>) => {
let changeList = checkList; // 배열의 주소를 공유하게 된다.
changeList[Number(e.target.id)] = true; // 객체의 주소를 공유하기 때문에 원본의 내용도 함께 바뀐다.
// setState는 기존값과 변경된 값을 비교해서 값이 다를 때만 작동하는데,
// 위에서 값이바꿨기 때문에 아래코드는 작동하지 않는다.
setCheckList(changeList);
};
배열의 값 변경에 성공하는 경우
const onClickEdit = (event: any)
const [checkList, setCheckList] = useState<boolean[]>([]);
...
/**
* 체크박스 handler
* @param e: React.ChangeEvent<HTMLInputElement>
*/
const onCheckHandler = (e: React.ChangeEvent<HTMLInputElement>) => {
const changeList = checkList;
changeList[Number(e.target.id)] = true;
// Spread(스프레드)를 사용, 새로운 배열(새로운 주소)가 만들어진다.
setCheckList([...aaa]);
};
이를 활용해 setState로 배열([])값을 변경하여 체크박스를 클릭 Handler를 구현할 수 있다.
const [checkList, setCheckList] = useState<boolean[]>([]);
...
/**
* 체크박스 handler
* @param e: React.ChangeEvent<HTMLInputElement>
*/
const onCheckHandler = (e: React.ChangeEvent<HTMLInputElement>) => {
let changeList = checkList;
changeList[Number(e.target.id)] = e.target.checked;
setCheckList( [...changeList ]);
};
객체의 값({}) 변경
객체의 값은 아래 코드처럼 Spread하여 변경 시켜주면 된다.
setCheckList({ ...checkList, [e.target.id]: e.target.checked });
출력값
{e.target.id1: e.target.checked1, e.target.id2: e.target.checked2, ...}
* e.target.id = 클릭 된 체크박스의 id
* e.target.checked = 클릭 여부 (true면 false로 false면 ture로 변경)
반응형
'개발 프레임워크 > Next.js' 카테고리의 다른 글
[React, Next.js] 모달(Modal) 구현_2 (recoil을 통한 제어) (0) | 2023.02.22 |
---|---|
[React, Next.js] 모달(Modal) 구현_1 (react-modal을 통한 생성) (0) | 2023.02.22 |
[Next.js] Warning: A component is Changing an uncontrolled input to be controlled Error (0) | 2023.02.09 |
[Next.js] Slug (0) | 2023.02.03 |
[Next.js] Routing_라우팅 (0) | 2023.02.03 |
댓글