Estoy creando un componente React que acepta una fuente de datos JSON y crea una tabla ordenable.
Cada una de las filas de datos dinámicos tiene asignada una clave única, pero sigo recibiendo un error de:
Cada niño en una matriz debe tener un accesorio "clave" único.
Verifique el método de renderizado de TableComponent.
Mi TableComponent
método de renderizado devuelve:
<table>
<thead key="thead">
<TableHeader columns={columnNames}/>
</thead>
<tbody key="tbody">
{ rows }
</tbody>
</table>
El TableHeader
componente es una sola fila y también tiene asignada una clave única.
Cada uno row
de rows
se construye a partir de un componente con una clave única:
<TableRowItem key={item.id} data={item} columns={columnNames}/>
Y se TableRowItem
ve así:
var TableRowItem = React.createClass({
render: function() {
var td = function() {
return this.props.columns.map(function(c) {
return <td key={this.props.data[c]}>{this.props.data[c]}</td>;
}, this);
}.bind(this);
return (
<tr>{ td(this.props.item) }</tr>
)
}
});
¿Qué está causando el error único de prop de clave?
javascript
reactjs
Brett DeWoody
fuente
fuente
key
propiedad única . Ayudará a ReactJS a encontrar referencias a los nodos DOM apropiados y actualizar solo el contenido dentro del marcado, pero no volver a representar toda la tabla / fila.rows
matriz o más preferiblemente un jsfiddle? No necesita unakey
propiedad enthead
ytbody
por cierto.Respuestas:
Debe agregar una clave a cada elemento secundario , así como a cada elemento dentro de los elementos secundarios .
De esta forma, React puede manejar el mínimo cambio de DOM.
En su código, cada uno
<TableRowItem key={item.id} data={item} columns={columnNames}/>
está tratando de representar a algunos niños dentro de ellos sin una clave.Mira este ejemplo .
Intente eliminar el
key={i}
del<b></b>
elemento dentro de la div (y comprobar la consola).En la muestra, si no le damos una clave al
<b>
elemento y queremos actualizar solo elobject.city
, React necesita volver a representar toda la fila frente al elemento.Aquí está el código:
La respuesta publicada por @Chris en la parte inferior entra en mucho más detalle que esta respuesta. Por favor, eche un vistazo a https://stackoverflow.com/a/43892905/2325522
Reaccione la documentación sobre la importancia de las claves en la reconciliación: claves
fuente
key
valor de la utilería sea único para cada elemento y coloque lakey
utilería en el componente más cercano a los límites de la matriz. Por ejemplo, en React Native, primero estaba tratando de ponerkey
prop al<Text>
componente. Sin embargo, tuve que ponerlo en el<View>
componente principal<Text>
. si Matriz == [(Ver> Texto), (Ver> Texto)] necesita ponerlo a Ver. No texto¡Tenga cuidado al iterar sobre matrices!
Es un error común pensar que usar el índice del elemento en la matriz es una forma aceptable de suprimir el error con el que probablemente esté familiarizado:
Sin embargo, en muchos casos no lo es. Este es un antipatrón que en algunas situaciones puede conducir a un comportamiento no deseado .
Entendiendo el
key
accesorioReact utiliza la
key
utilería para comprender la relación del elemento componente al elemento DOM, que luego se utiliza para el proceso de reconciliación . Por lo tanto, es muy importante que la clave siempre permanezca única , de lo contrario, hay una buena posibilidad de que React mezcle los elementos y mute el incorrecto. También es importante que estas claves permanezcan estáticas en todos los renders para mantener el mejor rendimiento.Dicho esto, no siempre es necesario aplicar lo anterior, siempre que se sepa que la matriz es completamente estática. Sin embargo, se recomienda aplicar las mejores prácticas siempre que sea posible.
Un desarrollador de React dijo en este número de GitHub :
En resumen, a
key
debería ser:Usando el
key
accesorioSegún la explicación anterior, estudie cuidadosamente las siguientes muestras e intente implementar, cuando sea posible, el enfoque recomendado.
Malo (potencialmente)
Este es posiblemente el error más común visto al iterar sobre una matriz en React. Este enfoque no es técnicamente "incorrecto" , es simplemente ... "peligroso" si no sabe lo que está haciendo. Si está iterando a través de una matriz estática, este es un enfoque perfectamente válido (por ejemplo, una matriz de enlaces en su menú de navegación). Sin embargo, si agrega, elimina, reordena o filtra elementos, debe tener cuidado. Eche un vistazo a esta explicación detallada en la documentación oficial.
Mostrar fragmento de código
En este fragmento estamos usando una matriz no estática y no nos estamos restringiendo a usarla como una pila. Este es un enfoque inseguro (verá por qué). Observe cómo a medida que agregamos elementos al comienzo de la matriz (básicamente sin desplazamiento), el valor de cada uno
<input>
permanece en su lugar. ¿Por qué? Porque elkey
no identifica de forma única cada elemento.En otras palabras, al principio
Item 1
tienekey={0}
. Cuando agregamos el segundo elemento, el elemento superior se convierteItem 2
, seguido porItem 1
el segundo elemento. Sin embargo, ahoraItem 1
tienekey={1}
ykey={0}
ya no . En cambio,Item 2
ahora tienekey={0}
!!Como tal, React piensa que los
<input>
elementos no han cambiado, ¡porque laItem
tecla with0
siempre está en la parte superior!Entonces, ¿por qué este enfoque solo a veces es malo?
Este enfoque solo es arriesgado si la matriz se filtra, reorganiza o se agregan / eliminan elementos. Si siempre es estático, entonces es perfectamente seguro de usar. Por ejemplo, un menú de navegación como
["Home", "Products", "Contact us"]
puede iterarse de forma segura con este método porque probablemente nunca agregará nuevos enlaces ni los reorganizará.En resumen, aquí es cuando puede usar el índice de manera segura como
key
:Si, en cambio, en el fragmento anterior, empujáramos el elemento agregado al final de la matriz, el orden de cada elemento existente siempre sería correcto.
Muy mal
Si bien este enfoque probablemente garantizará la unicidad de las claves, siempre obligará a reaccionar a volver a representar cada elemento de la lista, incluso cuando no sea necesario. Esta es una solución muy mala, ya que afecta en gran medida el rendimiento. Sin mencionar que no se puede excluir la posibilidad de una colisión de teclas en el caso de que
Math.random()
produzca el mismo número dos veces.Muy bien
Este es posiblemente el mejor enfoque porque utiliza una propiedad que es única para cada elemento del conjunto de datos. Por ejemplo, si
rows
contiene datos obtenidos de una base de datos, uno podría usar la Clave primaria de la tabla ( que generalmente es un número de incremento automático ).Bueno
Este también es un buen enfoque. Si su conjunto de datos no contiene datos que garanticen la unicidad ( por ejemplo, una matriz de números arbitrarios ), existe la posibilidad de una colisión de teclas. En tales casos, es mejor generar manualmente un identificador único para cada elemento del conjunto de datos antes de iterar sobre él. Preferiblemente al montar el componente o cuando se recibe el conjunto de datos ( por ejemplo, desde
props
o desde una llamada API asíncrona ), para hacer esto solo una vez , y no cada vez que el componente se vuelve a representar. Ya hay un puñado de bibliotecas que pueden proporcionarle esas claves. Aquí hay un ejemplo: react-key-index .fuente
toString()
para convertir en cadena en lugar de dejar como número. ¿Es importante recordar esto?key
. No estoy seguro de por qué lo están convirtiendo.key
siempre termina siendo una Cadena de todos modos.Esto puede o no ayudar a alguien, pero puede ser una referencia rápida. Esto también es similar a todas las respuestas presentadas anteriormente.
Tengo muchas ubicaciones que generan listas usando la estructura a continuación:
Después de un poco de prueba y error (y algunas frustraciones), agregar una propiedad clave al bloque más externo lo resolvió. También tenga en cuenta que la etiqueta <> ahora se reemplaza con la etiqueta ahora.
Por supuesto, he estado usando ingenuamente el índice iterativo (index) para completar el valor clave en el ejemplo anterior. Idealmente, usaría algo que sea exclusivo del elemento de la lista.
fuente
Advertencia: cada elemento secundario en una matriz o iterador debe tener un accesorio "clave" único.
Esta es una advertencia ya que los elementos de la matriz sobre los que vamos a iterar necesitarán un parecido único.
React maneja la representación iterativa de componentes como matrices.
Una mejor manera de resolver esto es proporcionar un índice sobre los elementos de la matriz sobre los que va a iterar, por ejemplo:
El índice es React props incorporado.
fuente
Simplemente agregue la clave única a sus Componentes
fuente
Comprobar: clave = undef !!!
También recibiste el mensaje de advertencia:
si su código está completo bien, pero si está activado
someValue es indefinido !!! Por favor verifique esto primero. Puedes ahorrar horas.
fuente
La mejor solución para definir una clave única en reaccionar: dentro del mapa inicializó la publicación del nombre y luego definió la clave por clave = {post.id} o en mi código verá que defino el elemento de nombre y luego defino clave por clave = {item.id }:
fuente
Esta es una advertencia, pero abordar esto hará que Reacts se vuelva mucho MÁS RÁPIDO ,
Esto se
React
debe a que necesita identificar de forma única cada elemento de la lista. Digamos que si el estado de un elemento de esa lista cambia en Reacts,Virtual DOM
entonces React necesita averiguar qué elemento se cambió y en qué parte del DOM debe cambiar para que el DOM del navegador esté sincronizado con el DOM virtual de Reacts.Como solución, simplemente introduzca un
key
atributo para cadali
etiqueta. Estokey
debería ser un valor único para cada elemento.fuente
key
accesorio. Si no proporciona uno, React asignará uno automáticamente (el índice actual de la iteración).key={i}
. Por lo tanto, depende de los datos que contenga su matriz. Por ejemplo, si tiene la lista["Volvo", "Tesla"]
, entonces, obviamente, el Volvo se identifica con la clave0
y el Tesla con1
, porque ese es el orden en que aparecerán en el bucle. Ahora, si reordena la matriz, las claves se intercambian. Para React, dado que "objeto"0
todavía está en la parte superior, más bien interpretará este cambio como un "cambio de nombre", en lugar de un reordenamiento. Las claves correctas aquí tendrían que ser, en orden,1
entonces0
. No siempre se reordena a mitad del tiempo de ejecución, pero cuando lo hace, es un riesgo.Esto aliviará el problema.
fuente
Me encontré con este mensaje de error debido a
<></>
que me devolvieron algunos elementos de la matriz cuando, en cambio,null
es necesario devolverlos.fuente
Lo arreglé usando Guid para cada clave como esta: Generando Guid:
Y luego asignando este valor a los marcadores:
fuente
Básicamente, no debe usar el índice de la matriz como una clave única. En su lugar, puede usar a
setTimeout(() => Date.now(),0)
para establecer la clave única o un líquido no líquido o cualquier otra forma que genere una identificación única, pero no el índice de la matriz como la identificación única.fuente