D.evelop/React

[React]map함수 unique "key" prop 에러(Fragment에 속성 적용)

Danne 2021. 10. 23. 20:09

Warning: Each child in a list should have a unique "key" prop.

 

 

React에서 map함수를 사용하는 것에 재미가 들려 여기저기 사용해보던 중.

다음과 같은 코드에서 에러가 지속되었다.

index.js:1 Warning: Each child in a list should have a unique "key" prop.
<NavList
  onMouseEnter={this.isHoverMenu}
  onMouseLeave={this.isHoverMenu}
>
  {NAV_DATA.map(({ id, name, link, menu }) => {
    return (
      <>
        <List key={id} onMouseEnter={() => this.setHoverMenu(id)}>
          <NavLink to={link}>{name}</NavLink>
        </List>
        {id === hoveredMenuId && <SubMenu menu={menu} />}
      </>
    );
  })}
</NavList>

이리보고 저리보고 다시 봐도

나는 '각 자식 요소에 유니크한 키 값 key={id}부여하고 있었다. (고 생각했다.)

 

✅ map 함수의 규칙 : 사용될 요소의 최상위 요소에 key 값을 부여해야함.

 

기존의 코드를 다시 보면 key값이 부여된 요소인 <List> 는 최상위가 아니었다. 

최상위에 <></>가 있다. 즉, fragement가 최상위 요소였던 것.

 

 

❓ 그럼 저 빈 태그 모습을한 fragement에도 key값을 부여할 수 있는지?

'Fragments uniqe key' 검색

https://ko.reactjs.org/docs/fragments.html

 

fragement는

 <React.Fragment></React.Fragment>형식으로 사용 가능하다.

 

 

:: 수정한 코드

<NavList
  onMouseEnter={this.isHoverMenu}
  onMouseLeave={this.isHoverMenu}
>
  {NAV_DATA.map(({ id, name, link, menu }) => {
    return (
      <React.Fragment key={id}>
        <List onMouseEnter={() => this.setHoverMenu(id)}>
          <NavLink to={link}>{name}</NavLink>
        </List>
        {id === hoveredMenuId && <SubMenu menu={menu} />}
      </React.Fragment>
    );
  })}
</NavList>

 

 

반응형