TIL

[React] props와 구조분해할당

기절초뿡 2022. 8. 4. 17:19

List 컴포넌트에서 dummyList를 받아 화면에 표시하기 위해서, App 컴포넌트에서 list라는 이름으로 dummyList를 props로 넘겨주었다.

const dummyList = [
  {
    id: 1,
    content: 'test1',
  },
  {
    id: 2,
    content: 'test2',
  },
  {
    id: 3,
    content: 'test3',
  },
];

function App() {
  return (
    <div className='App'>
      <List list={dummyList}/>
    </div>
  );
}

export default App;
const List = (list) => {
  return (
    <div className='List'>
      {list.map((i) => {
        return <div>{i.content}</div>;
      })}
    </div>
  );
};

export default List;

그런데 이렇게 했을 때, TypeError: list.map is not a function 에러가 떴다.

콘솔로 찍어보니 배열 List가 객체로 한 번 더 쌓인 후 반환되고 있었다. props는 객체형태로 전달되기 때문이다.

{List: Array(3)}  
List: Array(3)  
0: {id: 1, content: 'test1'}  
1: {id: 2, content: 'test2'}  
2: {id: 3, content: 'test3'}

즉, {list : [{id: 1, content: 'test1'},{id: 2, content: 'test2'},{id: 3, content: 'test3'}]} 의 형태로 props가 반환되었고, 객체에는 map 메서드가 없기 때문에 TypeError가 떴던 것이다. 그래서 점표기법을 한 번 더 사용하여 depth를 한 번 더 들어가도록 수정했다.

const List = (list) => {
  return (
    <div className='List'>
      //수정한 부분
      {list.list.map((i) => {
        return <div>{i.content}</div>;
      })}
    </div>
  );
};

export default List;

이렇게 수정하면 다음과 같이 정상적으로 return 되는 것을 확인할 수 있다.

하지만 depth를 두 번 들어가는 건 보기에도 좋지 않고, 번거로워 보였다.
그래서 구조분해할당을 이용해서 가장 바깥의 객체 껍질을 벗겨보았다.

//수정한 부분
const List = ({ list }) => {
  return (
    <div className='List'>
    //한 번만 들어가도 되도록 
      {list.map((i) => {
        return <div>{i.content}</div>;
      })}
    </div>
  );
};

export default List;

정상적으로 리턴되는 것을 확인할 수 있다.

콘솔로 list를 출력해보았다. list에는 더이상 객체가 아닌 배열이 담겨있다.

[{…}, {…}, {…}]

정리

 

기존 코드가

list = {list : [{id: 1, content: 'test1'},{id: 2, content: 'test2'},{id: 3, content: 'test3'}]} 였다면,

코드를

{ list } = {list : [{id: 1, content: 'test1'},{id: 2, content: 'test2'},{id: 3, content: 'test3'}]} 로 수정하였다.

이렇게 되면 비구조화할당을 통해서 변수 list에 변수 list와 같은 이름의 키(list)의 값이 할당되어 list에 [{id: 1, content: 'test1'},{id: 2, content: 'test2'},{id: 3, content: 'test3'}]가 할당되는 것이다.