Respuestas:
this.state.myArray.push('new value')
devuelve la longitud de la matriz extendida, en lugar de la matriz en sí. Array.prototype.push () .
Supongo que espera que el valor devuelto sea la matriz.
Parece que es más bien el comportamiento de React:
NUNCA mutes this.state directamente, ya que llamar a setState () después puede reemplazar la mutación que hiciste. Trate este estado como si fuera inmutable. React.Componente .
Supongo que lo harías así (no familiarizado con React):
var joined = this.state.myArray.concat('new value');
this.setState({ myArray: joined })
setState()
pone en cola los cambios en el estado del componente y le dice a React que este componente y sus hijos deben volver a renderizarse con el estado actualizado. Así que supongo que no se actualiza en ese momento justo después de configurarlo. ¿Podría publicar un ejemplo de código, donde podamos ver qué punto lo está configurando y registrando, por favor?
.concat('new value');
debería ser .concat(['new value']);
concat()
método. Ver: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ( Matrices y / o valores para concatenar en una nueva matriz. )
Usando es6 se puede hacer así:
this.setState({ myArray: [...this.state.myArray, 'new value'] }) //simple value
this.setState({ myArray: [...this.state.myArray, ...[1,2,3] ] }) //another array
this.props
y this.state
puede actualizarse de forma asincrónica, no debe confiar en sus valores para calcular el siguiente estado". En el caso de modificar una matriz, dado que la matriz ya existe como una propiedad de this.state
y necesita hacer referencia a su valor para establecer un nuevo valor, debe usar la forma de setState()
que acepta una función con el estado anterior como argumento. Ejemplo: this.setState(prevState => ({ myArray: [...this.state.myArray, 'new value'] }));
Ver: reactjs.org/docs/…
Nunca se recomendó mutar el estado directamente.
El enfoque recomendado en versiones posteriores de React es usar una función de actualización al modificar estados para evitar condiciones de carrera:
Empuje la cuerda hasta el final de la matriz
this.setState(prevState => ({
myArray: [...prevState.myArray, "new value"]
}))
Empuje la cadena al comienzo de la matriz
this.setState(prevState => ({
myArray: ["new value", ...prevState.myArray]
}))
Empuje el objeto hasta el final de la matriz
this.setState(prevState => ({
myArray: [...prevState.myArray, {"name": "object"}]
}))
Empuje el objeto al comienzo de la matriz
this.setState(prevState => ({
myArray: [ {"name": "object"}, ...prevState.myArray]
}))
this.setState((prevState) => ({ myArray: [values, ...prevState.myArray], }));
No deberías estar operando el estado en absoluto. Al menos, no directamente. Si desea actualizar su matriz, querrá hacer algo como esto.
var newStateArray = this.state.myArray.slice();
newStateArray.push('new value');
this.setState(myArray: newStateArray);
No es deseable trabajar directamente en el objeto de estado. También puede echar un vistazo a los ayudantes de inmutabilidad de React.
.slice()
para crear una nueva matriz y preservar la inmutabilidad. Gracias por la ayuda.
Puede usar el .concat
método para crear una copia de su matriz con nuevos datos:
this.setState({ myArray: this.state.myArray.concat('new value') })
Pero tenga cuidado con el comportamiento especial del .concat
método al pasar matrices: [1, 2].concat(['foo', 3], 'bar')
resultará en [1, 2, 'foo', 3, 'bar']
.
Este código funciona para mí:
fetch('http://localhost:8080')
.then(response => response.json())
.then(json => {
this.setState({mystate: this.state.mystate.push.apply(this.state.mystate, json)})
})
fetch(`api.openweathermap.org/data/2.5/forecast?q=${this.searchBox.value + KEY} `) .then( response => response.json() ) .then( data => { this.setState({ reports: this.state.reports.push.apply(this.state.reports, data.list)}); });
this.state = { reports=[] }
... por favor, me gustaría saber qué estoy haciendo mal
Si también desea que su UI (es decir, su flatList) esté actualizada, use PrevState: en el siguiente ejemplo, si el usuario hace clic en el botón, agregará un nuevo objeto a la lista (tanto en el modelo como en la UI )
data: ['shopping','reading'] // declared in constructor
onPress={() => {this.setState((prevState, props) => {
return {data: [new obj].concat(prevState.data) };
})}}.
De la siguiente forma podemos comprobar y actualizar los objetos
this.setState(prevState => ({
Chart: this.state.Chart.length !== 0 ? [...prevState.Chart,data[data.length - 1]] : data
}));
Aquí no puede empujar el objeto a una matriz de estado como esta. Puede empujar a su manera en una matriz normal. Aquí tienes que configurar el estado,
this.setState({
myArray: [...this.state.myArray, 'new value']
})
Si solo estás tratando de actualizar el estado así
handleClick() {
this.setState(
{myprop: this.state.myprop +1}
})
}
Considere este enfoque
handleClick() {
this.setState(prevState => {
return {
count: prevState.count + 1
}
})
}
Básicamente, prevState está escribiendo this.state para nosotros.
console.log(this.state.myArray)
, siempre hay uno detrás. ¿Alguna idea de por qué?