Estoy tratando de encontrar la mejor manera de eliminar un elemento de una matriz en el estado de un componente. Como no debería modificar la this.state
variable directamente, ¿hay una forma mejor (más concisa) de eliminar un elemento de una matriz que la que tengo aquí ?:
onRemovePerson: function(index) {
this.setState(prevState => { // pass callback in setState to avoid race condition
let newData = prevState.data.slice() //copy array from prevState
newData.splice(index, 1) // remove element
return {data: newData} // update state
})
},
Gracias.
actualizado
Esto se ha actualizado para usar la devolución de llamada en setState. Esto debe hacerse al hacer referencia al estado actual mientras se actualiza.
javascript
reactjs
aherriot
fuente
fuente
Respuestas:
La forma más limpia de hacer esto que he visto es con
filter
:fuente
_
veces se usa para representar un argumento no utilizado. Aquí, es el elemento actual en la matriz.this.state
como entradathis.setState()
, incluso de forma inmutable. consulte mi respuesta anterior para obtener una referencia a los documentos oficiales de React sobre este tema.Podría usar el
update()
ayudante de inmutabilidadreact-addons-update
, que efectivamente hace lo mismo debajo del capó, pero lo que está haciendo está bien.fuente
react-addons-update
ahora está en desuso (2016).immutability-helper
está disponible como reemplazo. github.com/kolodny/immutability-helper También vea mi respuesta a continuación sobre no mutar this.state directamente dentro de this.setState ().Creo que no se recomienda hacer referencia al
this.state
interiorsetState()
( las actualizaciones de estado pueden ser asincrónicas ).Los documentos recomiendan usar
setState()
con una función de devolución de llamada para que se pase prevState en tiempo de ejecución cuando se produce la actualización. Así es como se vería:Usando Array.prototype.filter sin ES6
Uso de Array.prototype.filter con funciones de flecha ES6
Usando inmutability-helper
Usando Spread
Tenga en cuenta que en cada caso, independientemente de la técnica utilizada,
this.setState()
se pasa una devolución de llamada, no una referencia de objeto a la anteriorthis.state
;fuente
this.setState({ data: [...this.state.data.slice(0, index), ...this.state.data.slice(index + 1)] });
¿Es incorrecto usar enthis.state
lugar de laprevState
opción de devolución de llamada mostrada por @ user1628461?Aquí hay una manera de eliminar el elemento de la matriz en el estado utilizando la sintaxis de propagación ES6.
fuente
Quiero intervenir aquí aunque @pscl ya haya respondido correctamente a esta pregunta en caso de que alguien más se encuentre con el mismo problema que yo. De los 4 métodos proporcionados, elegí usar la sintaxis es6 con funciones de flecha debido a su concisión y falta de dependencia de bibliotecas externas:
Uso de Array.prototype.filter con funciones de flecha ES6
Como puede ver, hice una ligera modificación para ignorar el tipo de índice (
!==
a!=
) porque en mi caso estaba recuperando el índice de un campo de cadena.Otro punto útil si está viendo un comportamiento extraño al eliminar un elemento en el lado del cliente es NUNCA usar el índice de una matriz como la clave para el elemento :
Cuando React difiere con el DOM virtual en un cambio, observará las claves para determinar qué ha cambiado. Entonces, si está utilizando índices y hay uno menos en la matriz, eliminará el último. En su lugar, use las identificaciones del contenido como claves, como esta.
Lo anterior es un extracto de esta respuesta de una publicación relacionada .
¡Feliz codificación para todos!
fuente
Puede usar esta función, si desea eliminar el elemento (sin índice)
fuente
Como se mencionó en un comentario a la respuesta de ephrion anterior, filter () puede ser lento, especialmente con matrices grandes, ya que realiza un bucle para buscar un índice que parece haber sido determinado ya. Esta es una solución limpia pero ineficiente.
Como alternativa, uno simplemente puede 'cortar' el elemento deseado y concatenar los fragmentos.
¡Espero que esto ayude!
fuente
Puede hacer que el código sea más legible con una función auxiliar de una línea:
luego úsalo así:
fuente
Solo una sugerencia, en su código, en lugar de usar
let newData = prevState.data
, podría usar propagación, que se introduce en ES6, que puede usarlet newData = ...prevState.data
para copiar la matrizTres puntos ... representa operadores de dispersión o parámetros de descanso ,
Permite que una expresión de matriz o cadena o cualquier cosa que pueda iterarse se expanda en lugares donde se esperan cero o más argumentos para llamadas a funciones o elementos para matriz.
Además, puede eliminar el elemento de la matriz con los siguientes
Espero que esto contribuya !!
fuente
Aquí hay una manera simple de hacerlo:
¡¡¡Espero eso ayude!!!
fuente
delete
elimina el elemento pero los índices no se actualizan y, por lo tanto, este no sería un buen enfoque para las necesidades regulares.