Odpowiedzi:
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 })
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:
this.setState({ myArray: [...this.state.myArray, 'new value'] }) //simple value
this.setState({ myArray: [...this.state.myArray, ...[1,2,3] ] }) //another array
this.props
i this.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/…
Nigdy nie zaleca się bezpośredniej mutacji stanu.
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
this.setState(prevState => ({
myArray: [...prevState.myArray, "new value"]
}))
Wypchnij ciąg na początek tablicy
this.setState(prevState => ({
myArray: ["new value", ...prevState.myArray]
}))
Wypchnij obiekt na koniec tablicy
this.setState(prevState => ({
myArray: [...prevState.myArray, {"name": "object"}]
}))
Wypchnij obiekt na początek tablicy
this.setState(prevState => ({
myArray: [ {"name": "object"}, ...prevState.myArray]
}))
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.
var newStateArray = this.state.myArray.slice();
newStateArray.push('new value');
this.setState(myArray: newStateArray);
Bezpośrednia praca na obiekcie stanu nie jest pożądana. Możesz również przyjrzeć się pomocnikom niezmienności Reacta.
.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:
this.setState({ myArray: this.state.myArray.concat('new value') })
Ale uważaj na specjalne zachowanie .concat
metody podczas przekazywania tablic - [1, 2].concat(['foo', 3], 'bar')
spowoduje to [1, 2, 'foo', 3, 'bar']
.
Ten kod działa dla mnie:
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=[] }
... pls chciałbym wiedzieć, co robię źle
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 )
data: ['shopping','reading'] // declared in constructor
onPress={() => {this.setState((prevState, props) => {
return {data: [new obj].concat(prevState.data) };
})}}.
W następujący sposób możemy sprawdzić i zaktualizować obiekty
this.setState(prevState => ({
Chart: this.state.Chart.length !== 0 ? [...prevState.Chart,data[data.length - 1]] : data
}));
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,
this.setState({
myArray: [...this.state.myArray, 'new value']
})
console.log(this.state.myArray)
, zawsze jest jeden z tyłu. Każdy pomysł, dlaczego?