Array push retorna comprimento
this.state.myArray.push('new value')
retorna o comprimento da matriz estendida, em vez da própria matriz. Array.prototype.push () .
Eu acho que você espera que o valor retornado seja a matriz.
Imutabilidade
Parece que é mais o comportamento de React:
NUNCA modifique this.state diretamente, pois chamar setState () depois pode substituir a mutação que você fez. Trate this.state como se fosse imutável. React.Component .
Eu acho que você faria assim (não estou familiarizado com React):
var joined = this.state.myArray.concat('new value');
this.setState({ myArray: joined })
console.log(this.state.myArray)
, é sempre um atrás. Alguma ideia do porquê?setState()
enfileira as alterações no estado do componente e informa ao React que esse componente e seus filhos precisam ser renderizados novamente com o estado atualizado. Acho que não foi atualizado naquele momento, logo após configurá-lo. Você poderia postar um exemplo de código, onde possamos ver qual ponto você está configurando e registrando, por favor?.concat('new value');
deveria ser.concat(['new value']);
concat()
método. Veja: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ( Matrizes e / ou valores para concatenar em uma nova matriz. )Usando es6, pode ser feito assim:
Spread syntax
fonte
this.props
ethis.state
pode ser atualizado de forma assíncrona, você não deve confiar em seus valores para calcular o próximo estado." No caso de modificar uma matriz, uma vez que a matriz já existe como uma propriedade dethis.state
e você precisa referenciar seu valor para definir um novo valor, você deve usar a forma desetState()
que aceita uma função com o estado anterior como argumento. Exemplo:this.setState(prevState => ({ myArray: [...this.state.myArray, 'new value'] }));
Veja: reactjs.org/docs/…A abordagem recomendada em versões posteriores do React é usar uma função de atualização ao modificar estados para evitar condições de corrida:
Empurre a string para o final da matriz
Empurre a string para o início da matriz
Empurre o objeto para o final da matriz
Empurre o objeto para o início da matriz
fonte
this.setState((prevState) => ({ myArray: [values, ...prevState.myArray], }));
Você não deveria operar o estado de forma alguma. Pelo menos não diretamente. Se você quiser atualizar seu array, você vai querer fazer algo assim.
Trabalhar no objeto de estado diretamente não é desejável. Você também pode dar uma olhada nos ajudantes de imutabilidade do React.
https://facebook.github.io/react/docs/update.html
fonte
.slice()
para criar um novo array e preservar a imutabilidade. Obrigado pela ajuda.Você pode usar o
.concat
método para criar uma cópia de sua matriz com novos dados:Mas cuidado com o comportamento especial do
.concat
método ao passar matrizes -[1, 2].concat(['foo', 3], 'bar')
resultará em[1, 2, 'foo', 3, 'bar']
.fonte
Este Código funciona para mim:
fonte
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, gostaria de saber o que estou fazendo de erradoReact-Native
se você também quiser que sua UI (ou seja, sua flatList) esteja atualizada, use PrevState: no exemplo abaixo, se o usuário clicar no botão, ele adicionará um novo objeto à lista (tanto no modelo quanto na UI )
fonte
Da seguinte forma, podemos verificar e atualizar os objetos
fonte
Aqui você não pode empurrar o objeto para uma matriz de estado como esta. Você pode empurrar como seu caminho na matriz normal. Aqui você deve definir o estado,
fonte
Se você está apenas tentando atualizar o estado assim
Considere esta abordagem
Basicamente, prevState está escrevendo this.state para nós.
fonte