Chcę dodać element na końcu state
tablicy, czy to właściwy sposób, aby to zrobić?
this.state.arrayvar.push(newelement);
this.setState({arrayvar:this.state.arrayvar});
Obawiam się, że modyfikowanie tablicy w miejscu push
może powodować problemy - czy jest to bezpieczne?
Alternatywa tworzenia kopii tablicy i setState
ing wydaje się marnotrawstwem.
javascript
reactjs
wyblakłe
źródło
źródło
Odpowiedzi:
Dokumentacja React mówi:
Twój
push
będzie mutować stanu bezpośrednio i które potencjalnie mogłyby prowadzić do błędu kodu na brzuchu, nawet jeśli są „zerowania” stan ponownie później. F.ex, może to prowadzić do tego, że niektóre metody cyklu życia, takie jakcomponentDidUpdate
nie, zostaną uruchomione.Zalecanym podejściem w późniejszych wersjach React jest użycie funkcji aktualizującej podczas modyfikowania stanów w celu uniknięcia warunków wyścigu:
„Marnotrawstwo” pamięci nie stanowi problemu w porównaniu z błędami, które możesz napotkać przy użyciu niestandardowych modyfikacji stanu.
Alternatywna składnia dla wcześniejszych wersji React
Możesz użyć,
concat
aby uzyskać czystą składnię, ponieważ zwraca ona nową tablicę:W ES6 możesz użyć operatora Spread :
źródło
push
zwraca nową długość tablicy, więc nie będzie działać. PonadtosetState
jest asynchroniczny, a React może ustawić w kolejce kilka zmian stanu w jednym przebiegu renderowania.setState
dwa razy, pokazuje dwa podobne przykłady ustawiania tablicy stanu bez bezpośredniej mutacji.let list = Array.from(this.state.list); list.push('woo'); this.setState({list});
Modyfikuj oczywiście swoje preferencje stylu.Najłatwiej, jeśli używasz
ES6
.Nowa tablica będzie
[1,2,3,4]
zaktualizować swój stan w React
Dowiedz się więcej o destrukcji macierzy
źródło
Najprostszy sposób z
ES6
:źródło
tableData = [['test','test']]
Po wypchnięciu mojej nowej tablicytableData = [['test','test'],['new','new']]
. Jak podbić ten @David i @Ridd[['test','test'],['new','new']]
spróbować: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] ] });
Wstawia nową tablicę dwa razy.this.state.tableData.push([item.student_name,item.homework_status_name,item.comments===null?'-':item.comments]);
Osiąga pożądaną rzecz, jakiej chcę. ale myślę, że to niewłaściwy sposób.React może aktualizować wsadowo, dlatego poprawnym podejściem jest zapewnienie setState funkcji, która wykonuje aktualizację.
W przypadku dodatku do aktualizacji React niezawodnie będą działać:
lub dla concat ():
Poniżej pokazano, co https://jsbin.com/mofekakuqi/7/edit?js,output jako przykład tego, co się stanie, jeśli się pomylisz.
Wywołanie setTimeout () poprawnie dodaje trzy elementy, ponieważ React nie grupuje aktualizacji w ramach wywołania zwrotnego setTimeout (patrz https://groups.google.com/d/msg/reactjs/G6pljvpTGX0/0ihYw2zK9dEJ ).
Buggy onClick doda tylko „Trzeci”, ale naprawiony doda F, S i T zgodnie z oczekiwaniami.
źródło
this.setState( update(this.state, {array: {$push: ["First", "Second", "Third"]}}) )
state.array = state.array.concat([4])
mutuje to poprzedni obiekt stanu.Jak wspomniano w komentarzu @nilgun, możesz użyć pomocników immutability . Uważam, że jest to bardzo przydatne.
Z dokumentów:
Proste naciśnięcie
initialArray jest nadal [1, 2, 3].
źródło
Jeśli używasz komponentu funkcjonalnego, użyj tego jak poniżej.
źródło
Na dodany nowy element do tablicy
push()
powinna być odpowiedź.W przypadku usuwania elementu i aktualizacji stanu tablicy poniższy kod działa dla mnie.
splice(index, 1)
nie mogę pracować.źródło
Próbuję przekazać wartość w stanie tablicowym i ustawić taką wartość, a także zdefiniować tablicę stanu i wartość wypychaną za pomocą funkcji mapy.
źródło
Pomogło mi to dodać tablicę w tablicy
źródło
Oto przykład Reactjs Hook na rok 2020, który moim zdaniem mógłby pomóc innym. Używam go do dodawania nowych wierszy do tabeli Reactjs. Daj mi znać, czy mogę coś poprawić.
Dodanie nowego elementu do funkcjonalnego komponentu stanu:
Zdefiniuj dane stanu:
Niech przycisk uruchamia funkcję dodawania nowego elementu
źródło
źródło
stackoverflow
.setState(state => ({arrayvar: [...state.arrayvar, ...newelement]}) );
newelement
obiektu w tablicy iTypeError
tak rzuca .źródło
Ten kod działa dla mnie:
źródło
.push
zwraca liczbę , a nie tablicę.