setState로 array,object 변경

EVELO·2023년 9월 16일
0

개발지식

목록 보기
8/11

setState 특징 - 기존의 state와 신규 state를 비교해서 두개의 값이 다를경우에만 변경하고 리렌더링됨.

*** array/object를 다룰땐 원본은 보존하고 복사본을 활용해서 변경하는게 좋음

array/object는 변수에 해당 값을 직접 저장하는게 아니라 값을 저장한 메모리의 주소를 가지고있기 때문에 새로운 변수 = 기존배열 과 같이 입력하면 새로운 변수에는 주소값이 할당됨
즉 setState(새로운변수)로 사용해도 state 값은 같은 주소값을 가지고 있기 때문에 변경을 인식하지 못해서 리랜더링이 발생하지 않음
이럴땐 새로운 변수 = [...기존배열] 과 같이 새로운 변수에 직접 값을 할당해줘야함. .

코드 예시


let [string, setString] = useState("기존값");
  const changeString = () => {
    setString("변경값");
  };
  
  
  let [array, setArray] = useState(["기존배열"]);
  const changeArray = () => {
    let copy = array;
    copy[0] = "새로운배열";
    setArray(copy);
  };
  
  let [array2, setArray2] = useState(["기존배열2"]);
  const changeArray2 = () => {
    let copy = [...array2];
    copy[0] = "새로운배열2";
    setArray2(copy);
  };
  
<div className="App">
        <div>{string}</div>
        <button onClick={changeString}>문자값 변경하기</button>
        <div>{array}</div>
        <button onClick={changeArray}>배열값1 변경하기</button>
        <div>{array2}</div>
        <button onClick={changeArray2}>배열값2 변경하기</button>
</div>

배열값 1 변경하기버튼은 눌러도 리렌더링이 발생하지않음.

profile
스펀지가 되고싶은 개발자

0개의 댓글