React Infinite Scroll - Intersection Observer API 总是跳回顶部

React Infinite Scroll - Intersection Observer API always jumping back to top

我正在使用 Intersection Observer API 开发一个无限滚动的 React 应用程序(不使用任何第三个库来实现无限滚动)。我的后端正确处理分页,无限滚动也会在达到阈值时获取下一部分。问题是,每次我向下滚动并达到阈值时,window 都会滚动回顶部,这不是我所期望的。似乎不仅要呈现新项目,还会呈现整个项目列表。

到目前为止,这是我在 React 中使用 Redux 实现它的方式:

import React, {useEffect, useRef, useCallback} from "react";
import Spinner from "../../UI/Spinner";
import {withRouter} from "react-router-dom";
import {connect} from "react-redux";
import * as actions from "../../store/actions/index";

const List = props => {
    const {items, next, loading, loadMoreData} = props;
    const loader = useRef(null);
    const loadMore = useCallback((entries) => {
        const target = entries[0];
        if (target.isIntersecting && next) {
            !loading && loadMoreData(next);
        }
    }, [loading, next, loadMoreData]);

    useEffect(() => {
        const options = {
            threshold: 1.0
        };

        // Observer API 
        const observer = new IntersectionObserver(loadMore, options);
        const currentLoader = loader.current;
        if (loader && currentLoader) {
            observer.observe(currentLoader);
        }
        return () => observer.unobserve(loader.current);
    }, [loader, loadMore]);

    const content = <Spinner/>;
    if (!loading) {
        content = items.map((item, index) => return (<div key={index}>{item}</div>))
    }

    return (
    <div>
      {content}
      <div ref={loader}></div>
    </div>
    )
}

const mapStateToProps = state => {
    return {
        items: state.items.items,
        next: state.items.next,
        loading: state.items.loading,
        error: state.items.error
    };
};

const mapDispatchToProps = dispatch => {
    return {
        fetchMoreData: (next) => dispatch(actions.fetchDataStart(next)),
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(withRouter(List));

 

所以总结问题如下:

向下滚动屏幕并达到设置的阈值后,数据已成功获取并添加到我的 redux 存储中。但是整个列表再次呈现在页面顶部,我必须再次向下滚动。有什么解决办法吗?

这个话题可以关闭了。这是一个小而愚蠢的错误。整个列表的重新呈现是由我填充内容变量的 if 语句引起的。删除它可以解决问题,无限滚动就像一个魅力。