const list = [
{ id: '1', value: '수영하기' },
{ id: '1', value: '요가하기' },
{ id: '1', value: '헬스하기' },
];
<ul>
{list.map((item) => {
return <li key={item.id}>{item.value}</li>
})}
</ul>
import { useState } from "react";
function List2() {
const [inputValue, setInputValue] = useState("");
const [list, setList] = useState(["수영하기", "요가하기"]);
const addTodoList = () => {
setList((prevList) => {
return [inputValue, ...prevList];
});
setInputValue("");
};
return (
<>
<input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
<button onClick={addTodoList}>추가</button>
<ul>
{list.map((item) => {
return <li>{item}</li>;
})}
</ul>
</>
);
}
export default List2;


위 처럼 코드를 작성하면 key를 추가해달라고 경고가 발생함
key를 추가하지 않은 상태에서 list에 하나의 항목을 추가하면
모든 li element들이 DOM 상에서 업데이트가 됨
각 list 항목에 key를 추가해주지 않았기 때문에
React는 어떤 항목이 업데이트 되었는지 알지 못해서 모든 항목들을 전부 업데이트 시켜준 것임
만약 규모가 큰 작업이라면 새로운 것을 추가할때마다 모든 항목들이 DOM 상에서 업데이트 되기 때문에 굉장히 비효율적임 -> 각 항목에 key를 넣어주자!


key값을 index로 준 경우
return (
<>
<input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
<button onClick={addTodoList}>추가</button>
<ul>
{list.map((item, index) => {
return (
<div key={index}>
<li>{item}</li>
<input />
</div>
);
})}
</ul>
</>
);
}

key값을 item으로 준 경우
return (
<>
<input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
<button onClick={addTodoList}>추가</button>
<ul>
{list.map((item, index) => {
return (
<div key={item}>
<li>{item}</li>
<input />
</div>
);
})}
</ul>
</>
);
}

- 결론 : 동적인 list를 만들 때는 index를 key값으로 사용하지 않기!
function List2() {
const [inputValue, setInputValue] = useState("");
const [list, setList] = useState(["수영하기", "요가하기"]);
const addTodoList = () => {
setList((prevList) => {
return [inputValue, ...prevList];
});
setInputValue("");
};
return (
<>
<input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
<button onClick={addTodoList}>추가</button>
<ul>
{list.map((item) => {
return <li key={item}>{item}</li>;
})}
</ul>
</>
);
}


해결방법
function List2() {
const [inputValue, setInputValue] = useState("");
const [list, setList] = useState([
{
id: "1",
value: "수영하기",
},
{
id: "2",
value: "요가하기",
},
]);
const addTodoList = () => {
setList((prevList) => {
return [
{
id: list.length + 1 + "",
value: inputValue,
},
...prevList,
];
});
setInputValue("");
};
return (
<>
<input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
<button onClick={addTodoList}>추가</button>
<ul>
{list.map((item) => {
return <li key={item.id}>{item.value}</li>;
})}
</ul>
</>
);
}