ㅇㅇㅈ Blog

프론트엔드 수행중

0%

React-key

Key 와 리렌더링

Key는 React가 어떤 항목을 변경, 추가 또는 삭제할지 식별하는 것을 돕습니다. key는 엘리먼트에 안정적인 고유성을 부여하기 위해 배열 내부의 엘리먼트에 지정해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
const todos = [
[
{ id: 1, value: 'Wash dishes' },
{ id: 2, value: 'Clean the bed' },
{ id: 3, value: 'Running' },
{ id: 4, value: 'Learning' }
],
[
{ id: 4, value: 'Learning' },
{ id: 1, value: 'Wash dishes' },
{ id: 2, value: 'Clean the bed' },
{ id: 3, value: 'Running' },
]
,
[
{ id: 2, value: 'Clean the bed' },
{ id: 4, value: 'Learning' },
{ id: 1, value: 'Wash dishes' },
{ id: 3, value: 'Running' },
]
,
[
{ id: 2, value: 'Clean the bed' },
{ id: 3, value: 'Running' },
{ id: 4, value: 'Learning' },
{ id: 1, value: 'Wash dishes' },
]
]

function App() {
const [items, setItems] = React.useState(todos[0])
React.useEffect(() => {
const interval = setInterval(() => {
const random = Math.floor(Math.random() * 3)
setItems(todos[random])
}, 1000)
return () => {
clearInterval(interval)
}
}, [])
const handleDoneClick = (todo) => {
setItems(items => items.filter(item => item !== todo))
}
const handleRestoreClick = () => {
setItems(items => [...items, todos.find(item => !items.includes(item))])
}
return (
<>
{items.map((todo,index) => (
<div key={todo.id}>
<button onClick={() => handleDoneClick(todo)}>{todo.value}</button>
</div>
))}
<br />
<br />
<button onClick={handleRestoreClick}>Restore</button>
</>
);
}

ReactDOM.render(<App />, root)
  • Key를 선택하는 가장 좋은 방법은 리스트의 다른 항목들 사이에서 해당 항목을 고유하게 식별할 수 있는 문자열을 사용하는 것입니다. 대부분의 경우 데이터의 ID를 key로 사용합니다.
  • 항목의 순서가 바뀔 수 있는 경우 key에 인덱스를 사용하는 것은 권장하지 않는다. 이로 인해 성능이 저하되거나 컴포넌트의 state와 관련된 문제가 발생할 수 있다.
  • 리스트 항목에 명시적으로 key를 지정하지 않으면 React는 기본적으로 인덱스를 key로 사용한다