localStorageから情報を取り出してレンダリングするリアクションコードを実装するのが難しいです。localStorageから受け取ったデータの前に反応コンポーネントをレンダリングする
私は、クリックするとその特定の画像のデータベースから情報を取り出し、localStorageにデータを保存する機能を起動するサムネイル画像(コンポーネント)のギャラリーを持っています。また、ユーザーをShowTaleコンポーネントにリダイレクトして、画像に関する情報を表示します。
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);
私は、次のアクションを介してデータを設定します。
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));
})
}
};
を問題は、以下、ShowTaleコンポーネントたことにある正しいデータをレンダリングされません。アプリケーションの起動時に最初のインスタンスに正しいデータをレンダリングしますが、後続の要求では前のデータをレンダリングします。たとえば、私はアプリを起動し、画像1のレンダリング1をクリックし、画像2のレンダリング1をクリックし、画像3のレンダリング2をクリックします。 localStorageのデータは正しく更新されていますが、アクションによって更新される前にコンポーネントがlocalStorageからデータを取得しているようです。
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;
写真がlocalStorageのデータと同期して表示されるように助けてください。
新しい項目をクリックすると状態を更新する必要があります。レンダリングサイクルが発生する前に、willReceivePropsでsetStateを試してみてください –