javascript - 我正在尝试在我的 react/redux 应用程序中实现无限滚动,但是 Get More Posts 函数正在执行多次
问题描述
在我的主页组件上,我正在尝试使用滚动事件侦听器实现无限滚动。我在 componentDidMount 中加载了第一组帖子,然后当我接近页面底部时,我想执行一个调用我的 API 并获取下一组帖子的 redux 操作。
但是,我可以通过控制台日志看到 redux 操作正在执行很多次。我在页面底部设置了一个“<hr”标签,并使用它来识别我何时到达页面底部。
这是我的 Home 组件上的代码:
class home extends Component {
state = {
scrolling: false,
};
componentDidMount() {
this.props.getPostsInfinite();
window.addEventListener('scroll', this.handleScroll);
}
componentWillUnmount() {
window.removeEventListener('scroll', this.handleScroll);
}
handleScroll = (e) => {
console.log('scrolling');
const { scrolling } = this.state;
if (scrolling) return;
const lastElement = document.getElementById('scrollEnd');
const lastElementOffset = lastElement.offsetTop + lastElement.clientHeight;
const pageOffset = window.pageYOffset + window.innerHeight;
const bottomOffset = 100;
if (pageOffset > lastElementOffset - bottomOffset) this.onButtonClick();
};
onButtonClick = () => {
this.props.getPostsInfiniteNext({
lastVisible: this.props.data.lastVisible,
});
};
render() {
const { posts, loading } = this.props.data;
const { classes } = this.props;
let recentPostsMarkup = !loading ? (
posts.map((post) => {
return <Post key={post.postId} post={post} />;
})
) : (
<div className={classes.progressContainerPosts}>
<CircularProgress />
</div>
);
return (
<Fragment>
<Grid container spacing={10} id="grid">
<Grid item sm={4} xs={12}>
<Profile />
</Grid>
<Grid item sm={8} xs={12}>
<CreatePostForm />
{recentPostsMarkup}
</Grid>
</Grid>
<hr id="scrollEnd" />
</Fragment>
);
}
这是获取下一组帖子的功能
export const getPostsInfiniteNext = (lastVisible) => (dispatch) => {
console.log('get next set of posts running');
axios
.post('/posts/infinite/next', lastVisible)
.then((res) => {
dispatch({
type: SET_POSTS_NEXT,
payload: res.data,
});
dispatch({
type: SET_LAST_VISIBLE,
payload: res.data,
});
})
.catch((err) => {
dispatch({
type: SET_POSTS,
payload: [],
});
});
};
解决方案
可能是 handleScroll 中的计算问题,可能导致 this.onButtonClick 方法被触发。滚动状态变量也永远不会设置为 true。
推荐阅读
- python - 无需 SKLearn 即可快速创建交互术语
- python-3.x - Windows 10 无法检测到 Python 环境变量
- c# - 无法对空引用执行运行时绑定 Umbraco
- javascript - 使用 fullPage.js moveTo 有什么问题?
- python - 错误:解压缩数据时出现错误 -3:标头检查不正确
- angular-material - 如何在堆叠的 mat-chip-list 中将 mat-chips 居中
- parceljs - 如何处理包裹中的输出文件
- git-lfs - 如何在 Git LFS 存储库之间迁移
- c# - Linq GroupBy 多列投影到新对象
- excel - 将任务分配给员工,均匀地跳过已有数据的行