React List 그리고 Key

Chori·2022년 8월 18일
1

React

목록 보기
4/5
post-thumbnail

React List, Key

react에서 key는 항목을 변경, 추가, 삭제할지 식별할 때 사용된다.
key는 배열 내부 엘리먼트에 지정해야 한다.

const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
  <li key={number.toString()}>
    {number}
  </li>
);

key는 해당 항목을 고유하게 식별할 수 있는 문자열을 사용하는게 가장 좋다.
대부분 데이터 id를 key로 사용한다.
문자열을 사용 할 수 없다면, index를 사용할 수 있다.
다만 항목의 순서가 바뀔 수 있는 경우에는 index는 권장하지 않는다.
List에 key를 따로 명시하지 않으면 기본적으로 index를 key로 사용한다.

key 지정

key는 < li > 엘리먼트에 직접적으로 지정하는게 아니라, 엘리먼트의 함수를 사용하는 태그에서 지정한다.

function ListItem(props) {
  return <li>{props.value}</li>; // 여기 말고
}

function NumberList(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number) =>
    // 여기에 key를 지정한다.
    <ListItem key={number.toString()} value={number} />
  );
  return (
    <ul>
      {listItems}
    </ul>
  );
}

const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
  <NumberList numbers={numbers} />,
  document.getElementById('root')
);

key의 고유값 범위

key는 const, let 안에서 내부 배열이 아니라면 중복에서 사용해도 무방하다.
(다만 헷깔릴듯 하니 중복하지 말자)

function Blog(props) {
  const sidebar = (
    <ul>
      {props.posts.map((post) =>
        <li key={post.id}>
          {post.title}
        </li>
      )}
    </ul>
  );
  const content = props.posts.map((post) =>
    <div key={post.id}>
      <h3>{post.title}</h3>
      <p>{post.content}</p>
    </div>
  );
  return (
    <div>
      {sidebar}
      <hr />
      {content}
    </div>
  );
}

const posts = [
  {id: 1, title: 'Hello World', content: 'Welcome to learning React!'},
  {id: 2, title: 'Installation', content: 'You can install React from npm.'}
];
ReactDOM.render(
  <Blog posts={posts} />,
  document.getElementById('root')
);

같은 함수 안이어도, 기능이 다른 변수라면 key는 중복되어도 무방하다.

  • key를 컴포넌트로 전달하지는 않는다. 전달하려면 동일한 값을 담아 prop을 사용해 명시적으로 전달한다.
const content = posts.map((post) =>
  <Post
    key={post.id}
    id={post.id}
    title={post.title} />
);

post에 key를 담아 content에 초기화한다.

JSX 인라인 활용

  • JSX는 중괄호{} 안에 모든 표현식을 포함한다.
  • JSX 엘리먼트 내 map() 함수를 인라인으로 처리할 수 있다.
function NumberList(props) {
  const numbers = props.numbers;
  return (
    <ul>
      {numbers.map((number) =>
        <ListItem key={number.toString()}
                  value={number} />
      )}
    </ul>
  );
}

코드는 깔끔해지지만 남발하면 좋지 않다. map함수가 중첩되면 컴포넌트로 추출하는 것이 좋다.

추가 TIL

Tailwind css 활용

  • 필요할 때마 자동완성 기능을 사용해 Css 간편하게 적용하기.
  • 다만 어떤 css 코드가 적용되는지는 css코드를 확인하며 적용하기.(무작정 적용x)

HTML 드래그 앤 드롭 API 사용

(https://developer.mozilla.org/ko/docs/Web/API/HTML_Drag_and_Drop_API)

  • 사용자가 드래그 할 때 적절한 애니메이션을 준다.
  • 사용자가 드래그를 멈췄는지 확인한다. 여기도 애니메이션을 준다.
  • 클라이언트가 목록을 재정렬한 경우 항목의 위치를 새 항목으로 업데이트 한다.
  • 구현을 간단하게 도와주는 모듈 -> react-beautiful-dnd
  • npm 설치
    - npm install react-beautiful-dnd --save -f
profile
꾸준한 성장

0개의 댓글