개발자
import _ from 'lodash'; import React from 'react'; export default function Test() { return _.map([1, 2, 3, 4, 5], (value, index) => { return ( <> <p>{index + 1} 번</p> <p>{value}</p> </> ); }); } 이렇게 코드를 작성하면 콘솔창에 Warning: Each child in a list should have a unique "key" prop. 이 뜹니다. 근데 <> 부분에 key props를 사용하면 사용할 수가 없다고 나옵니다. 어떻게 해야할까요?!
답변 2
아마 빈 태그를 사용하신 이유는 저 부분을 묶어주기 위해서 사용한 것인데 사실 빈 태그는 React의 Fragment의 단축문법 입니다. 위의 map을 통해 key를 사용해야한다면 Fragment를 사용해주어야한다고 공식문서에 나와있습니다. https://ko.reactjs.org/docs/fragments.html#keyed-fragments Fragment는 props로 key를 유일하게 받을 수 있습니다 위의 코드를 좀 수정하면 아래와 같이 되겠네요 import _ from 'lodash'; import React, { Fragment } from 'react'; export default function Test() { return _.map([1, 2, 3, 4, 5], (value, index) => { return ( <Fragment key={index}> <p>{index + 1} 번</p> <p>{value}</p> </Fragment> ); }); }
익명
작성자
2022년 10월 18일
아하 감사합니다 수정해 주신 코드와 공식 문서 참고할게요!!
현재 렌더링 되고 있는 화면에서 키는 유일해야 합니다. (현재의 map 뿐만 아니라 전체에서) 따라서 단순히 index를 key로 사용한다면, 같은 오류를 볼 가능성이 매우 큽니다. 특히, array의 요소가 자주 빠졌다, 추가되는 상황이라면 더다욱 index를 key로 활용하면 좋지않은 결과를 볼 수 있습니다. 렌더링 시 가상돔을 비교하는 구문에서 내용이 바뀌지 않았음에도, index가 바껴서 ley가 달라졌다면, 해당 내용은 다시 렌더링이 됩니다.
익명
작성자
2022년 10월 18일
그렇군요 ㅠㅠ 말씀해 주신 부분 수정해 보겠습니다! 감사합니다!!
kim kim
개발 • 2022년 10월 19일
안녕하세요. 적어주신 답변을 읽어보다가 궁금한점이 생겨서 질문드립니다. 위에 있는 예시처럼 Array에 고유값이 없을때에는 index말고 키값을 라이브러리로 생성해서 넣어야하나요?
승주
백수 • 2022년 10월 31일
index로 키값을 지정해도 상관 없으나, React에서의 key는 주소라고 생각하시면 편합니다. 배열의 데이터를 렌더해주는 상황일때 배열 컴포넌트들의 데이터의 주소를 React는 알지 못해서 key값을 지정해주어야 React가 Update되는 타이밍에도 해당 키값으로 변경이 되었는지 안되었는지 구분을 할 수 있습니다 여기서 주의해야 할 점은 업데이트 되어서 렌더링 되는 시점에 키값이 동적으로 변해버리면 키값은 결국 유효하지 않는거죠 키값은 동적으로 변경되면 안되는게 주의해야할 사항입니다. 그래서 렌더링 할 당시의 키값을 index로 잡으면 안되는 이유입니다. (주소 index 1을 삭제했는데 삭제되면서 index가 1씩 밀리면서 삭제된듯 안된듯한 이상한 현상이 발생할 수 있음)
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!