Quiero agregar un elemento al final de una state
matriz, ¿es esta la forma correcta de hacerlo?
this.state.arrayvar.push(newelement);
this.setState({arrayvar:this.state.arrayvar});
Me preocupa que la modificación de la matriz in situ push
pueda causar problemas, ¿es seguro?
La alternativa de hacer una copia de la matriz, e setState
ing parece un desperdicio.
javascript
reactjs
fadedbee
fuente
fuente
Respuestas:
Los documentos de React dicen:
Su
push
va a mutar el estado directamente y que podría potencialmente conducir al código de error en decúbito prono, incluso si está "Reposición" el estado de nuevo después. F.ex, podría llevar a que algunos métodos de ciclo de vida comocomponentDidUpdate
no se activen.El enfoque recomendado en versiones posteriores de React es usar una función de actualización al modificar estados para evitar condiciones de carrera:
El "desperdicio" de memoria no es un problema en comparación con los errores que podría enfrentar al usar modificaciones de estado no estándar.
Sintaxis alternativa para versiones anteriores de React
Puede usar
concat
para obtener una sintaxis limpia ya que devuelve una nueva matriz:En ES6 puede usar el Operador Spread :
fuente
push
devuelve la nueva longitud de la matriz para que no funcione. Además,setState
es asíncrono y React puede poner en cola varios cambios de estado en un solo pase de renderizado.setState
dos veces, muestra dos ejemplos similares de configuración de matriz de estado sin mutarla directamente.let list = Array.from(this.state.list); list.push('woo'); this.setState({list});
modificar sus preferencias de estilo, por supuesto.Más fácil, si lo estás usando
ES6
.Nueva matriz será
[1,2,3,4]
para actualizar tu estado en React
Obtenga más información sobre la desestructuración de matrices
fuente
La forma más sencilla con
ES6
:fuente
tableData = [['test','test']]
Después empujó mi nueva matriztableData = [['test','test'],['new','new']]
. cómo impulsar esto @David y @Ridd[['test','test'],['new','new']]
probar:this.setState({ tableData: [...this.state.tableData, ['new', 'new']]
this.setState({ tableData: [...this.state.tableData ,[item.student_name,item.homework_status_name,item.comments===null?'-':item.comments] ] });
Inserta la nueva matriz dos veces.this.state.tableData.push([item.student_name,item.homework_status_name,item.comments===null?'-':item.comments]);
Logra lo que quiero. pero no es la forma correcta, creo.React puede realizar actualizaciones por lotes y, por lo tanto, el enfoque correcto es proporcionar a setState una función que realice la actualización.
Para el complemento React update, lo siguiente funcionará de manera confiable:
o para concat ():
A continuación se muestra lo que https://jsbin.com/mofekakuqi/7/edit?js,output como un ejemplo de lo que sucede si se equivoca.
La invocación setTimeout () agrega correctamente tres elementos porque React no procesará actualizaciones por lotes dentro de una devolución de llamada setTimeout (consulte https://groups.google.com/d/msg/reactjs/G6pljvpTGX0/0ihYw2zK9dEJ ).
El buggy onClick solo agregará "Third", pero el fijo agregará F, S y T como se esperaba.
fuente
this.setState( update(this.state, {array: {$push: ["First", "Second", "Third"]}}) )
state.array = state.array.concat([4])
esto muta el objeto de estado anterior.Como @nilgun mencionó en el comentario, puede usar los ayudantes de reacción de inmutabilidad . He encontrado que esto es súper útil.
De los documentos:
Empuje simple
initialArray sigue siendo [1, 2, 3].
fuente
Si está utilizando un componente funcional, utilícelo de la siguiente manera.
fuente
Para agregar un nuevo elemento a la matriz,
push()
debería ser la respuesta.Para eliminar el elemento y actualizar el estado de la matriz, el siguiente código funciona para mí.
splice(index, 1)
no puede trabajar.fuente
Estoy tratando de impulsar el valor en un estado de matriz y establecer un valor como este y definir la matriz de estado y el valor de inserción por función de mapa.
fuente
Esto funcionó para mí para agregar una matriz dentro de una matriz
fuente
Aquí hay un ejemplo de 2020, Reactjs Hook que pensé que podría ayudar a otros. Lo estoy usando para agregar nuevas filas a una tabla Reactjs. Avíseme si pudiera mejorar algo.
Agregar un nuevo elemento a un componente de estado funcional:
Defina los datos del estado:
Hacer que un botón active una función para agregar un nuevo elemento
fuente
fuente
stackoverflow
.setState(state => ({arrayvar: [...state.arrayvar, ...newelement]}) );
newelement
objeto dentro de una matriz arroja un deTypeError
todos modos.fuente
Este código funciona para mí:
fuente
.push
devuelve un número , no una matriz.