let [title, setTitle] = useState( ['강남 맛집', '강북 맛집', '강동 맛집'] );
제목이라는 배열의 state가 있다
제목 변경을 클릭해서 배열의 첫번째인 강남 맛집을 변경한다고 보면
<h4 onClick={ () => { setTitle(['강서 맛집', '강북 맛집', '강동 맛집']) } }>제목변경</h4>
이런 식으로 변경할 수 있다
+ setTitle('강서 맛집') 은 안된다 3개 전부 적용시키던 배열들을 강서 맛집 하나로 전부 넣는다는 꼴
변경함수라는게 아예 useState를 갈아치운다고 생각하면 된다
하지만 위에 배열들을 전부 넣는것도 확장성이 부족한 잘못된 코드
<button onClick={ () => {
let copy = title;
copy[0] = '강서 맛집';
setTitle(copy)
} }>제목변경</button>
이렇게 카피본을 만들고 카피본의 데이터를 바꾸고 적용시키는게 원본을 해치지 않는 좋은 코드이다
하지만 여기서도 제목변경을 누른다고 제목이 변경되지 않는다
<button onClick={ () => {
let copy = [...title];
copy[0] = '강서 맛집';
setTitle(copy)
} }>제목변경</button>
이렇게 [...변수명] 으로 카피를 해줘야 한다
그 이유는 기존의 값과 새로운 값의 차이가 없을 경우 랜더링을 다시 안해준다
자세하게는
배열이나 객체를 생성시 램에 저장이 되고 배열과 객체를 가리키는 화살표만 담겨있다
배열을 그대로 복사한다는것은 그 화살표까지 가져와서 복사한다 똑같이
하지만 ... ( spread operator 문법 )을 사용하면 배열이나 객체의 내용을 개별 요소로 펼친다는 개념이다
그러므로 아예 새로운 배열이 생기게되고 그 값을 바꿔서 변경함수의 넣을 시 두 값이 다르기 때문에자동으로 재랜더링을 해준다
+ 가나다 순 정렬 버튼
<button
onClick={ ()=>{
let copy = [...title];
copy.sort();
setTitle(copy)
}} >가나다 순 정렬</button>
'REACT' 카테고리의 다른 글
useState, 버튼 기능 구현 (0) | 2024.10.06 |
---|---|
react 설치와 기본세팅 (2) | 2024.10.04 |