Mon code est le suivant:
handleFavourite = id => { const { restaurants } = this.state; let newRestaurants = [...restaurants]; newRestaurants = sort(newRestaurants, 'favourite'); console.log(newRestaurants); // ALL GOOD this.setState({ restaurants: newRestaurants }, () => console.log(this.state.restaurants)); // CONSOLE LOG POSTS OLD DATA };
Alors voilà. La fonction de rappel dans setState
affiche les anciennes données et dans l'interface utilisateur, rien n'est également trié. Pourquoi en est-il ainsi?
modifier : le problème a été détecté. J'utilise également static getDerivedStateFromProps
et je réinitialise l'état à chaque fois.
3 Réponses :
Je vérifierais this.state.restaurants
dans componentDidUpdate
car c'est la meilleure façon de voir si votre composant a été mis à jour.
J'ai l'impression que vous faites les choses correctement si votre premier journal est en effet correct (cela me semble une façon étrange de trier, j'appellerais array.sort ()
sur le < code> newRestaurants ).
Peut-être que quelque part après la mise à jour de vos composants, quelque chose est en train de remettre les restaurants à leur valeur d'origine.
componentDidUpdate
affiche l'état mis à jour des valeurs que je modifie dans les restaurants
, mais il n'est toujours pas trié. Et la fonction sort
dans mon exemple utilise array.sort
en arrière-plan.
Est-il possible que vous ayez quelque chose de drôle dans votre rendu? qu'utilisez-vous pour la valeur de la clé
?
C'est souvent quelque chose comme ça, ce n'est pas que tu le fais mal là où tu regardes, ça change ailleurs où tu ne regardes pas! : P En se référant à mon deuxième paragraphe "Mais peut-être quelque part après la mise à jour de vos composants, quelque chose redonne aux restaurants leur valeur d'origine."
handleFavourite
semble fonctionner correctement
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script> <div id="root"></div>
class App extends React.Component { state = { restaurants: ["a", "b", "c"] } handleFavourite = id => { const { restaurants } = this.state; let newRestaurants = [...restaurants]; newRestaurants = sort(newRestaurants, 'favourite'); console.log(newRestaurants); // ALL GOOD this.setState({ restaurants: newRestaurants }, () => console.log(this.state.restaurants)); // CONSOLE LOG POSTS OLD DATA } render() { const restaurants = this.state.restaurants.map(r => <p>{r}</p>) return ( <div> {restaurants} <hr/> <button onClick={this.handleFavourite}>sort</button> </div> ) } } function sort(r) { return r.reverse(); } ReactDOM.render(<App/>, document.getElementById("root"))
newRestaurants = sort(newRestaurants, 'favourite').slice(); this.setState({ restaurants: newRestaurants });
Exemple reproductible, Comment créer un exemple minimal et reproductible