Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我试图在react/redux应用程序中实现无限滚动,但Get More Posts函数正在执行多次_Javascript_Reactjs_Redux_React Redux_Infinite Scroll - Fatal编程技术网

Javascript 我试图在react/redux应用程序中实现无限滚动,但Get More Posts函数正在执行多次

Javascript 我试图在react/redux应用程序中实现无限滚动,但Get More Posts函数正在执行多次,javascript,reactjs,redux,react-redux,infinite-scroll,Javascript,Reactjs,Redux,React Redux,Infinite Scroll,在我的主页组件上,我试图用滚动事件侦听器实现无限滚动。我在componentDidMount中加载第一组帖子,然后当我接近页面底部时,我想执行一个redux操作,该操作调用我的API并获取下一组帖子 但是,我可以通过控制台日志看到redux操作执行了很多次。我在handleScroll中设置了一个“可能是计算问题,这可能会导致此问题。OnButton单击方法被激发。此外,滚动状态变量从未设置为true class home extends Component { state = { sc

在我的主页组件上,我试图用滚动事件侦听器实现无限滚动。我在componentDidMount中加载第一组帖子,然后当我接近页面底部时,我想执行一个redux操作,该操作调用我的API并获取下一组帖子


但是,我可以通过控制台日志看到redux操作执行了很多次。我在handleScroll中设置了一个“可能是计算问题,这可能会导致此问题。OnButton单击方法被激发。此外,滚动状态变量从未设置为true

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: [],
            });
        });
};