【发布时间】:2019-11-29 08:03:52
【问题描述】:
我正在尝试构建一个显示博客文章列表的组件。当用户单击帖子时,它会呈现显示帖子详细信息的组件。但是当用户在浏览器中点击后退按钮时,前一个带有帖子列表的组件会重新呈现,并且它会丢失之前的状态和滚动位置。有没有一种方法可以保存以前的状态和滚动位置,以便当用户点击后退按钮时它们处于相同位置并且帖子列表不会重新渲染并且也不会松开滚动位置?
这是我的博客列表组件代码:
import axios from "axios";
import { Link } from "react-router-dom";
class About extends React.Component {
state = { posts: [] };
componentDidMount() {
axios.get("https://jsonplaceholder.typicode.com/posts").then(res => {
this.setState({ posts: res.data.slice(0, 10) });
});
}
render() {
const { posts } = this.state;
const postsList = posts.length ? (
posts.map(post => {
return (
<div className="card" key={post.id}>
<div className="card-body">
<Link to={"/view/" + post.id}>
<h5 className="card-title">{post.title}</h5>
</Link>
<p className="card-text">{post.body}</p>
</div>
</div>
);
})
) : (
<div className="text-danger text-center">No Posts yet...</div>
);
return <div>{postsList}</div>;
}
}
export default About;
这是我的博客详细信息组件:
import React from "react";
import { withRouter } from "react-router-dom";
import axios from "axios";
class PostDetail extends React.Component {
state = { post: null };
componentDidMount() {
let id = this.props.match.params.post_id;
axios.get("https://jsonplaceholder.typicode.com/posts/" + id).then(res => {
this.setState({ post: res.data });
});
}
render() {
const post = this.state.post ? (
<div className="card border-primary">
<div className="card-header">{this.state.post.title}</div>
<div className="card-body text-primary">
<p className="card-text">{this.state.post.body}</p>
</div>
</div>
) : (
<div className="text-center text-danger">Loading Post...</div>
);
return <div>{post}</div>;
}
}
export default withRouter(PostDetail);
【问题讨论】:
-
您能否在 stackblitz 上创建包含所需信息的演示?所以我可以为您提供解决方案。
-
@ClueMediator 当然。我已经创建了一个包含两个组件的演示,这是链接。 stackblitz.com/edit/react-nhrwnn
-
我已经为您更新了我的答案并创建了工作演示。请检查一下。
标签: javascript reactjs react-router