Si has trabajado con React más de cinco minutos, probablemente ya viste este warning:
Warning: Each child in a list should have a unique "key" prop.
Quizá pensaste: "pongo key={index} y sigo". Pero espera: las keys de React son más que silenciar warnings de consola. Veamos por qué importan y cómo usarlas bien.
¿Qué son las keys de React?
Las keys son atributos especiales que ayudan a React a identificar qué items de una lista cambiaron, se añadieron o se eliminaron. Piensa en ellas como IDs únicos para tus list items.
// ❌ Without keys
const TodoList = ({ todos }) => (
<ul>
{todos.map(todo => (
<li>{todo.text}</li>
))}
</ul>
);
// ✅ With keys
const TodoList = ({ todos }) => (
<ul>
{todos.map(todo => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
);
Por qué importan: la historia del Virtual DOM
React usa un Virtual DOM para actualizar el DOM real con eficiencia. Cuando renderizas una lista, React necesita saber qué cambió entre renders. Sin keys, React tiene que adivinar, y no siempre acierta.
El problema sin keys
Imagina una lista de usuarios:
const users = [
{ name: "Alice", id: 1 },
{ name: "Bob", id: 2 },
{ name: "Charlie", id: 3 }
];
Ahora añades un usuario nuevo al principio:
const users = [
{ name: "David", id: 4 }, // New user added at the start
{ name: "Alice", id: 1 },
{ name: "Bob", id: 2 },
{ name: "Charlie", id: 3 }
];
Sin keys, React piensa:
- El primer item cambió de "Alice" a "David"
- El segundo cambió de "Bob" a "Alice"
- El tercero cambió de "Charlie" a "Bob"
- El cuarto es nuevo: "Charlie"
¡Eso significa que React actualizará cada item en vez de solo añadir uno nuevo al principio!
La solución con keys
Con keys correctas, React sabe:
- El item con
key={4}es nuevo (añádelo) - Los items con
key={1},key={2},key={3}no cambiaron (déjalos)
Mucho más eficiente.
Errores comunes con keys
1. Usar el índice del array como key
// ❌ Don't do this
{todos.map((todo, index) => (
<li key={index}>{todo.text}</li>
))}
Por qué está mal: Cuando reordenas o añades items, el índice cambia, causando re-renders innecesarios y bugs potenciales.
2. Usar keys no únicas
// ❌ Don't do this
{todos.map(todo => (
<li key={todo.category}>{todo.text}</li>
))}
Por qué está mal: Varios items pueden tener la misma categoría, lo que lleva a warnings de React y comportamiento impredecible.
3. Usar valores aleatorios
// ❌ Don't do this
{todos.map(todo => (
<li key={Math.random()}>{todo.text}</li>
))}
Por qué está mal: Las keys cambian en cada render, obligando a React a recrear elementos sin necesidad.
Buenas prácticas con keys de React
1. Usa IDs estables y únicos
// ✅ Perfect
{todos.map(todo => (
<li key={todo.id}>{todo.text}</li>
))}
2. Crea keys compuestas cuando haga falta
// ✅ Good for nested data
{categories.map(category =>
category.items.map(item => (
<li key={`${category.id}-${item.id}`}>
{item.name}
</li>
))
)}
3. Usa librerías para casos complejos
Para escenarios complejos sin IDs naturales, considera usar librerías como uuid:
import { v4 as uuidv4 } from 'uuid';
// Generate IDs when creating data
const createTodo = (text) => ({
id: uuidv4(),
text,
completed: false
});
Ejemplo real: Todo App
Un ejemplo completo de uso correcto de keys:
import React, { useState } from 'react';
const TodoApp = () => {
const [todos, setTodos] = useState([
{ id: 1, text: "Learn React", completed: false },
{ id: 2, text: "Build a project", completed: true }
]);
const addTodo = (text) => {
const newTodo = {
id: Date.now(), // Simple ID generation
text,
completed: false
};
setTodos([newTodo, ...todos]);
};
const toggleTodo = (id) => {
setTodos(todos.map(todo =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo
));
};
return (
<div>
<ul>
{todos.map(todo => (
<li
key={todo.id}
onClick={()=> toggleTodo(todo.id)}
style={{
textDecoration: todo.completed ? 'line-through' : 'none'
}}
>
{todo.text}
</li>
))}
</ul>
</div>
);
};
Impacto en performance
Las keys correctas mejoran la performance de forma significativa, sobre todo con:
- Listas grandes (100+ items)
- Updates frecuentes
- Items complejos con formularios o animaciones
- Operaciones de reordenado
Conclusiones clave
- Usa siempre keys al renderizar listas en React
- Usa identificadores estables y únicos como keys
- Evita los índices salvo que la lista nunca cambie
- Las keys ayudan a React a optimizar los updates del DOM
- Piensa en las keys como IDs de tus list items
Las keys de React parecen un detalle pequeño, pero son cruciales para apps performantes y sin bugs. Tómate el tiempo de implementarlas bien, y tu yo futuro (y tus usuarios) te lo agradecerán.
¿Te has topado con escenarios tricky de keys en tus proyectos React? ¡Me encantaría leerlos! Escríbeme y comparte tus experiencias.