Moja odpowiedź jest trochę poza lewym polem. Rzuca światło na problem, który doprowadził mnie do tego postu. W moim przypadku wyglądało na to, że aplikacja nie renderowała się ponownie, mimo że otrzymała nowe rekwizyty.
Twórcy Reacta mieli odpowiedź na to często zadawane pytanie, coś w rodzaju tego, że jeśli (sklep) został zmutowany, w 99% przypadków reakcja nie będzie ponownie renderowana. Jeszcze nic o pozostałych 1%. W tym przypadku mutacja nie miała miejsca.
TLDR;
componentWillReceivePropstak statemożna zsynchronizować plik z nowym props.
Krawędź obudowy: Po stateaktualizacji, następnie aplikacja ma ponownie uczynić!
Okazuje się, że jeśli twoja aplikacja używa tylko statedo wyświetlania swoich elementów, propsmoże aktualizować, ale statenie będzie, więc nie ma ponownego renderowania.
Miałem stateto zależne od propsotrzymanego od Redux store. Danych, których potrzebowałem, nie było jeszcze w sklepie, więc pobrałem je componentDidMount, jak trzeba . Otrzymałem rekwizyty z powrotem, kiedy mój reduktor zaktualizował sklep, ponieważ mój komponent jest połączony przez mapStateToProps. Ale strona nie została wyrenderowana, a stan wciąż był pełen pustych ciągów.
Przykładem tego jest sytuacja, w której użytkownik załadował stronę „edytuj post” z zapisanego adresu URL. Masz dostęp do postIdadresu z adresu URL, ale informacji storejeszcze nie ma, więc możesz je pobrać. Elementy na Twojej stronie są kontrolowanymi komponentami - więc wszystkie wyświetlane dane znajdują się w state.
Korzystając z Redux, dane zostały pobrane, sklep został zaktualizowany, a komponent jest connectedytowany, ale aplikacja nie odzwierciedlała zmian. Przy bliższym przyjrzeniu się propsotrzymaliśmy, ale aplikacja nie została zaktualizowana. statenie zaktualizowany.
Cóż, propsbędzie aktualizować i propagować, ale statenie będzie. Musisz konkretnie powiedzieć, stateaby zaktualizować.
Nie możesz tego zrobić w render(), a componentDidMountjuż skończyłeś swoje cykle.
componentWillReceivePropsto miejsce, w którym aktualizujesz statewłaściwości, które zależą od zmienionej propwartości.
Przykładowe zastosowanie:
componentWillReceiveProps(nextProps){
if (this.props.post.category !== nextProps.post.category){
this.setState({
title: nextProps.post.title,
body: nextProps.post.body,
category: nextProps.post.category,
})
}
}
Muszę wypowiedzieć się na temat tego artykułu, który wyjaśnił mi rozwiązanie, o którym nie wspomniały dziesiątki innych postów, blogów i repozytoriów. Każdy, kto miał problem ze znalezieniem odpowiedzi na ten ewidentnie niejasny problem, oto jest:
Metody cyklu życia komponentów ReactJs - szczegółowe omówienie
componentWillReceivePropsto miejsce, w którym będziesz aktualizować, stateaby być zsynchronizowanym z propsaktualizacjami.
Po stateaktualizacji, następnie pola w zależności od state wykonania ponownego renderowania!