React列表渲染时key值用index有什么问题?
我最近在用React写一个待办事项列表,发现用index当key的时候,删除中间某一项,后面的项动画会错乱,而且输入框内容好像会串掉。是不是不能用index做key啊?
我试过改成用id,但有些临时数据还没保存到后端,没有唯一id,这时候该怎么处理?
const TodoList = ({ todos, onDelete }) => {
return (
<ul>
{todos.map((todo, index) => (
<li key={index}>
<input defaultValue={todo.text} />
<button onClick={() => onDelete(index)}>删除</button>
</li>
))}
</ul>
);
};
已经在后端存过的数据就用后端id,纯前端临时数据生成一个就行,nanoid很轻量。
按照规范,key 应该是稳定、唯一、可预测的标识符。如果数据还没保存到后端、没有 id,那可以考虑在前端生成一个临时唯一 id,比如用 nanoid、uuid,或者简单点用时间戳加随机数(适合临时 demo)。比如:
然后渲染时:
删除时别用 index,直接传 id 过去,这样 React 才能准确追踪每个项,不会把输入框内容“张冠李戴”。
要是数据量小、又纯展示不修改,用 index 其实也行——但只要涉及增删改,还是老老实实用稳定 id 吧,省得后面踩坑。