React 리액트 - 중첩 객체의 state 변경

2021. 2. 20. 23:43Frontend/React

 

리액트 - 중첩된 객체 state 변경하기

 

일반 state는 setState를 통해 가볍게 state 수정이 가능하지만, 아래와 같이 중첩된 state의 경우엔 setState만으로 값이 변경되지 않습니다.

this.state = {
            tempList: {
                List1: [],
                List2: [],
                List3: []
            }
        };

 

state의 List1, List2, List3 ... 같이 중첩된 객체의 state를 변경하려면, 단순 setState만으로는 한계가 있습니다.
이는 setState의 비동기성으로 인해 발생하는 상황인데,
setState와 함께 업데이트 함수를 이용하여 state 값을 변경시킬 수 있습니다.

 

const newList = [1, 2, 3]

this.setState(prevState => {
	// Object.assign메소드로 tempList 변수를 복사
	let tempList = Object.assign({}, prevState.tempList);
    
	// tempList의 List1 속성을 바꾸고자 하는 상태(newList)로 업데이트
	tempList.List1 = newList;
    
	// 새로운 tempList 객체를 리턴
	return { tempList };
})  

아래처럼 사용할 수도 있습니다.

this.setState(prevState => ({
	
    tempList: {
		// tempList의 이전 상태를 모두 복사 후 
		...prevState.tempList,
        
		// 변경하고자 하는 key값(여기서는 List1)만 업데이트한다.
		List1: newList
    }
}))

 

결과적으로 state는 아래와 같은 상태가 됩니다.

this.state = {
            tempList: {
                List1: newList,
                List2: [],
                List3: []
            }
        };