Eu quero adicionar um elemento ao final de uma state
matriz, esta é a maneira correta de fazer isso?
this.state.arrayvar.push(newelement);
this.setState({arrayvar:this.state.arrayvar});
Estou preocupado que modificar a matriz no local push
possa causar problemas - é seguro?
A alternativa de fazer uma cópia da matriz e setState
isso parece um desperdício.
javascript
reactjs
fadedbee
fonte
fonte
Respostas:
Os documentos do React dizem:
Você
push
modificará o estado diretamente e isso poderá levar a um código propenso a erros, mesmo se você estiver "redefinindo" o estado novamente depois. Por exemplo, isso pode levar a que alguns métodos do ciclo de vidacomponentDidUpdate
não sejam acionados.A abordagem recomendada nas versões posteriores do React é usar uma função atualizadora ao modificar estados para evitar condições de corrida:
O "desperdício" de memória não é um problema comparado aos erros que você pode enfrentar ao usar modificações de estado não padrão.
Sintaxe alternativa para versões anteriores do React
Você pode usar
concat
para obter uma sintaxe limpa, pois retorna uma nova matriz:No ES6, você pode usar o Operador de propagação :
fonte
push
retorna o novo tamanho da matriz para que não funcione. Além disso,setState
é assíncrono e o React pode enfileirar várias alterações de estado em uma única passagem de renderização.setState
duas vezes, mostra dois exemplos semelhantes de configuração da matriz de estados sem alterá-la diretamente.let list = Array.from(this.state.list); list.push('woo'); this.setState({list});
Modifique para suas preferências de estilo, é claro.Mais fácil, se você estiver usando
ES6
.Nova matriz será
[1,2,3,4]
para atualizar seu estado no React
Saiba mais sobre a destruição de matriz
fonte
A maneira mais simples com
ES6
:fonte
tableData = [['test','test']]
Depois empurrou minha nova matriztableData = [['test','test'],['new','new']]
. como empurrar este @ David e @Ridd[['test','test'],['new','new']]
tentar: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] ] });
Ele insere a nova matriz duas vezesthis.state.tableData.push([item.student_name,item.homework_status_name,item.comments===null?'-':item.comments]);
. Alcança a coisa desejada que eu quero. mas não é a maneira correta, eu acho.O React pode atualizar atualizações em lote e, portanto, a abordagem correta é fornecer ao setState uma função que execute a atualização.
Para o complemento React update, o seguinte funcionará de maneira confiável:
ou para concat ():
O seguinte mostra o que https://jsbin.com/mofekakuqi/7/edit?js,output como exemplo do que acontece se você errar.
A chamada setTimeout () adiciona corretamente três itens porque o React não atualizará em lotes as atualizações em um retorno de chamada setTimeout (consulte https://groups.google.com/d/msg/reactjs/G6pljvpTGX0/0ihYw2zK9dEJ ).
O buggy onClick adicionará apenas "Terceiro", mas o fixo adicionará F, S e T conforme o esperado.
fonte
this.setState( update(this.state, {array: {$push: ["First", "Second", "Third"]}}) )
state.array = state.array.concat([4])
isso muda o objeto de estado anterior.Como @nilgun mencionado no comentário, você pode usar os auxiliares de imutabilidade de reação . Eu achei isso super útil.
Dos documentos:
Push simples
initialArray ainda é [1, 2, 3].
fonte
Se você estiver usando componente funcional, use-o como abaixo.
fonte
Para adicionar novo elemento à matriz,
push()
deve ser a resposta.Para remover o elemento e atualizar o estado da matriz, o código abaixo funciona para mim.
splice(index, 1)
Não pode trabalhar.fonte
Eu estou tentando empurrar o valor em um estado de matriz e definir um valor como este e definir a matriz de estado e empurrar o valor pela função de mapa.
fonte
Isso funcionou para eu adicionar uma matriz dentro de uma matriz
fonte
Aqui está um exemplo de 2020, Reactjs Hook, que pensei que poderia ajudar outras pessoas. Estou usando-o para adicionar novas linhas a uma tabela Reactjs. Deixe-me saber se eu poderia melhorar alguma coisa.
Incluindo um novo elemento em um componente de estado funcional:
Defina os dados do estado:
Ter um botão acionar uma função para adicionar um novo elemento
fonte
fonte
stackoverflow
.setState(state => ({arrayvar: [...state.arrayvar, ...newelement]}) );
newelement
objeto dentro de uma matriz lança um deTypeError
qualquer maneira.fonte
Este código funciona para mim:
fonte
.push
retorna um número , não uma matriz.