Wydaje się, że mam problemy z przesyłaniem danych do tablicy stanów. Staram się to osiągnąć w ten sposób:
this.setState({ myArray: this.state.myArray.push('new value') })
Ale uważam, że to niewłaściwy sposób i powoduje problemy ze zmiennością?
Wydaje się, że mam problemy z przesyłaniem danych do tablicy stanów. Staram się to osiągnąć w ten sposób:
this.setState({ myArray: this.state.myArray.push('new value') })
Ale uważam, że to niewłaściwy sposób i powoduje problemy ze zmiennością?
this.state.myArray.push('new value')
zwraca długość rozszerzonej tablicy zamiast samej tablicy. Array.prototype.push () .
Myślę, że oczekujesz, że zwrócona wartość będzie tablicą.
Wygląda na to, że jest to raczej zachowanie Reacta:
NIGDY nie modyfikuj this.state bezpośrednio, ponieważ późniejsze wywołanie setState () może zastąpić dokonaną przez Ciebie mutację. Traktuj this.state tak, jakby był niezmienny. React.Component .
Myślę, że zrobiłbyś to w ten sposób (nie znasz Reacta):
var joined = this.state.myArray.concat('new value');
this.setState({ myArray: joined })
console.log(this.state.myArray)
, zawsze jest jeden z tyłu. Każdy pomysł, dlaczego?setState()
kolejkuje zmiany do stanu komponentu i mówi Reactowi, że ten komponent i jego dzieci muszą zostać ponownie wyrenderowane ze zaktualizowanym stanem. Więc myślę, że nie jest aktualizowany w tym momencie zaraz po ustawieniu. Czy mógłbyś zamieścić przykładowy kod, w którym możemy zobaczyć, który punkt go ustawiasz i logujesz?.concat('new value');
powinno być.concat(['new value']);
concat()
metody. Zobacz: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ( Tablice i / lub wartości do połączenia w nową tablicę. )Używając es6 można to zrobić w następujący sposób:
Składnia spreadów
źródło
this.props
ithis.state
mogą być aktualizowane asynchronicznie, nie należy polegać na ich wartościach przy obliczaniu następnego stanu”. W przypadku modyfikowania tablicy, ponieważ tablica już istnieje jako właściwośćthis.state
i trzeba odwołać się do jej wartości, aby ustawić nową wartość, należy użyć postaci,setState()
która akceptuje funkcję z poprzednim stanem jako argument. Przykład:this.setState(prevState => ({ myArray: [...this.state.myArray, 'new value'] }));
Zobacz: awarejs.org/docs/…Zalecanym podejściem w późniejszych wersjach Reacta jest użycie funkcji aktualizatora podczas modyfikowania stanów, aby zapobiec sytuacjom wyścigu:
Wypchnij ciąg na koniec tablicy
Wypchnij ciąg na początek tablicy
Wypchnij obiekt na koniec tablicy
Wypchnij obiekt na początek tablicy
źródło
this.setState((prevState) => ({ myArray: [values, ...prevState.myArray], }));
W ogóle nie powinieneś operować stanem. Przynajmniej nie bezpośrednio. Jeśli chcesz zaktualizować swoją tablicę, będziesz chciał zrobić coś takiego.
Bezpośrednia praca na obiekcie stanu nie jest pożądana. Możesz również przyjrzeć się pomocnikom niezmienności Reacta.
https://facebook.github.io/react/docs/update.html
źródło
.slice()
do tworzenia nowej tablicy i zachowania niezmienności. Dzięki za pomoc.Możesz użyć
.concat
metody, aby utworzyć kopię swojej tablicy z nowymi danymi:Ale uważaj na specjalne zachowanie
.concat
metody podczas przekazywania tablic -[1, 2].concat(['foo', 3], 'bar')
spowoduje to[1, 2, 'foo', 3, 'bar']
.źródło
Ten kod działa dla mnie:
źródło
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=[] }
... pls chciałbym wiedzieć, co robię źleReact-Native
jeśli chcesz również, aby Twój UI (np. ur flatList) był aktualny, użyj PrevState: w poniższym przykładzie, jeśli użytkownik kliknie przycisk, doda nowy obiekt do listy (zarówno w modelu, jak iw UI )
źródło
W następujący sposób możemy sprawdzić i zaktualizować obiekty
źródło
Tutaj nie możesz wypchnąć obiektu do tablicy stanów, takiej jak ta. Możesz pchać tak jak w normalnej tablicy. Tutaj musisz ustawić stan,
źródło
Jeśli próbujesz tylko zaktualizować stan w ten sposób
Rozważ to podejście
Zasadniczo prevState pisze dla nas this.state.
źródło