Ich habe Schwierigkeiten bei der Implementierung eines Stücks React-Code, der Informationen von localStorage holt und rendert.Reagieren Komponente Rendering vor Daten von localStorage
Ich habe eine Galerie von Thumbnail-Bildern (Komponenten), die bei einem Klick eine Funktion auslösen, die Informationen aus einer db für dieses bestimmte Bild holt und die Daten in localStorage speichert. Außerdem wird der Benutzer zur ShowTale-Komponente umgeleitet, wo Informationen zum Bild angezeigt werden.
class Tale extends Component {
handleClick(){
const pictureId = this.props._id;
this.props.fetchTale(pictureId);
}
render() {
const {_id, title, story, picture} = this.props;
return (
<div className="col-md-2 col-sm-6">
<div className="thumbnail">
<img src={picture} />
<div className="caption">
<h4>{title}</h4>
</div>
<p>
<Link onClick={this.handleClick.bind(this)} to="showTale" className="btn btn-primary">More Info</Link>
</p>
</div>
</div>
)
}
};
export default connect(null, actions)(Tale);
stelle ich die Daten über die folgende Aktion:
export function fetchTale(id){
return function(dispatch){
axios.get(`${ROOT_URL}/tale`, {params: {id: id}}).then(function(response) {
localStorage.setItem('fishTail', JSON.stringify(response.data));
})
}
};
Das Problem darin liegt, dass die ShowTale Komponente, wird unten, nicht die richtigen Daten zu machen. Sie gibt beim Starten der Anwendung die korrekten Daten der ersten Instanz wieder, aber bei nachfolgenden Anforderungen werden die vorherigen Daten gerendert. Zum Beispiel: Ich starte die App, klicke auf Bild 1 rendert 1, klicke auf Bild 2 rende 1, klicke auf Bild 3 rende 2, und so weiter. Die Daten von localStorage werden korrekt aktualisiert, aber es scheint, dass die Komponente die Daten von localStorage abfragt, bevor sie von der Aktion aktualisiert wird.
class ShowTale extends Component {
constructor(props){
super(props)
this.state = {tale: JSON.parse(localStorage.getItem('fishTail'))}
}
componentWillMount(){
this.setState = JSON.parse(localStorage.getItem('fishTail'));
}
renderTale(){
const tale = this.state.tale;
console.log('the tale: ', tale);
const {title, story, picture, author} = tale;
return (
<div className="thumbnail">
<img className="image-responsive" src={picture}/>
<div className="caption-full">
<h4>{title}</h4>
<p>{story}</p>
<p><em>Submitted by: {author}</em></p>
</div>
</div>
)
}
render() {
return(
<div className="container showTale">
<div className="row">
<div className="col-sm-12">
{this.renderTale()}
</div>
</div>
</div>
)
}
};
export default ShowTale;
Jegliche Unterstützung bei der Synchronisierung der Bilder mit den Daten in localStorage wird sehr geschätzt!
Sie müssen den Status aktualisieren, wenn auf das neue Element geklickt wird. Versuchen Sie es mit einem setState in willReceiveProps, bevor der Render-Zyklus stattfindet –