React에서 Array의 map 함수를 사용하면 가끔가다 이런 경고가 보인다.
Warning: Each child in a list should have a unique "key" prop.
warning이라 당장은 실행이 가능하지만 개발을 하다보면 보기도 안좋고
잠재적으로 어떤 문제가 나올지 모르니 해결해주도록 하자.
원인 : 배열을 이용하여 요소를 그려줄 때는 key라는 고유한 값을 prop으로 전달 받아야 한다.
해결 : map을 이용해 그려주는 요소에 key 값을 부여하면 된다
아래부터는 이해를 돕기위한 설명들
이와 같이 코드를 입력하고 실행하니
Warning이 발생한다.
그럼 아무 키나 부여해보자
Encountered two children with the same key, `i'm Key!`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version.
내가 넣은 키값까지 언급하며 새로운 Waning을 뱉어준다
고유해야 한다는 걸 간과했다.
가장 간단하게 할 수 있는 map함수를 사용 할 경우 반환 받는 index를 넣어보았다.
Waning이 사라진다.
하지만 index를 key 값으로 넣는 것은 지양해야 하는 패턴이라 한다.
Why? 간단하게 설명하자면 배열에 추가와 삽입이 있을 경우에
index가 변하기 때문에 원하는 결과를 얻지 못 할 수 있다.
아래는 직접 문제점을 테스트 해 본 게시물이다.
React ) 배열의 map 함수를 쓸 때 index를 key값으로 넣으면 안된다?
https://boms-house.tistory.com/entry/Warning-Each-child-in-a-list-should-have-a-unique-key-prop Warning: Each child in a list should have a unique "key" prop. React에서 Array의 map 함수를 사용하면..
boms-house.tistory.com
그렇기 때문에 우리는 배열 내의 고유한 값인 id를 이용하여 key값으로 넣어주겠다.
이와 같이 수정해주면 문제 해결 !
나는 평소에 index를 key값으로 사용하는 습관이 있었다.
고유하면 되는거 아닌가 생각하여 human_${index} 이런식으로 사용하고는 했었는데.
게시물 작성을 위해 자료를 찾다보니
고유해야 하는 문제가 아닌 index 자체가 key 속성의 구성품이 되면 안된다는 것이었다.
평소에 크게 문제 되는 동작이 없어서 안일하게 생각 한 것 같다.
검색하다 보니 index를 키 값으로 사용해도 되는 경우가 있다고 하는데
아래 세가지의 조건을 모두 만족해야 한다
- 배열과 각 요소가 static이며 computed 되지 않고 변하지 않아야 한다.
- 데이터 내부에 id로 쓸만한 unique 값이 없을 경우
- 데이터가 결코 reordered or filtered 되지 않을 경우
앞으로 코드를 신경써서 작성해야겠다 ㅠ_ㅠ
참조 사이트
1) https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map
'etc > Waning&Error' 카테고리의 다른 글
[JWT] JsonWebTokenError: secret or public key must be provided (0) | 2023.03.02 |
---|