关于使用Waypoint踩的坑

244 阅读1分钟

一、react-waypoint以及安装

可以监听页面是否滚动到底部,监听滚动到底部触发相应的事件。

可以用以下命令来安装: npm install react-waypoint --save或者yarn add react-waypoint

二、react-waypoint遇到的坑

waypoint失效场景:监听页面滚动到底部时触发加载下一页数据,如果每页的数据较多那么不会出现waypoint失效,如果每页数据较少,则会出现下面的场景:

image.png

虽然waypoint暴露了,但是只请求了两次数据便不再触发了。根本原因在于waypoint方法必须是新位置与上一个已知位置发生变化时才会触发,当数据量太少,waypoint持续暴露,waypoint的位置没有发生变化,导致waypoint的方法不被触发。

三、解决方法

更改展示waypoint的条件,每当请求的数据加载完毕再展示waypoint,其他时候隐藏waypoint,上代码:

const [fetchData, setFetchData] = useState('init');
const [hasNext, setHasNext] = useState(true);
// 请求列表
const getVideoWorkList = (type, status, lastContentId) => {
    setFetchData('loading')
    let params = {
        pageLastContentId: lastContentId
    }
    queryAllVideoList(params).then(res => {
        if (res && res.result && res.success) {
            if (res.result.length > 0) {
                ...

                setPageLastContentId(res.result.slice(-1)[0].id)
                setFetchData('loaded')
                setHasNext(true)
            } else {
                setHasNext(false)
                setFetchData(`${status === 'first' ? 'empty' : 'nomore'}`)
            }
        } else {
        // 失败
        if (status === 'first') {
            setFetchData('error')

        } else {
            setFetchData('refresh')
            }
        }
        }).catch(err => {
            if (status === 'first') {
                setFetchData('error')
            } else {
                setFetchData('refresh')
            }})
    }
    
 // 加载更多
const loadMore = () => {
    let type = showAddable ? 'onlyAddable' : 'all'
    getVideoWorkList(type, 'follow', pageLastContentId)
}

// 列表展示
<div>
    {videoWorkList.map(item => {
        return (
            <div
                className="collection-drawer-cardarea"
                key={item.id || item.videoId}
            >
                ...
            </div>
        )
    })}
    {hasNext && fetchData === 'loaded' ?
        <Waypoint onEnter={() => {
            loadMore();
            }}
        >
            <div className="collection-drawer-footext" >
                {fetchData === 'refresh' ? '加载失败,请重试...' : '数据加载中...'}
            </div>
        </Waypoint> :
        <div className="collection-drawer-footext">{fetchData === 'loading' ? '数据加载中...' : '~没有更多了~' }</div>
    }
</div>