美文网首页
下拉加载更多的实现

下拉加载更多的实现

作者: sweetBoy_9126 | 来源:发表于2020-06-11 11:19 被阅读0次

1.四个属性
Data // 存储列表数据
hasMore // 是否还有更多数据,对应接口是否还有下一页的字段
isLoadingMore // 记录当前状态,用来展示'加载中...' 或 '加载更多'
page // 页码

  • List.tsx
const List: React.FC = () => {
  const {state} = useContext<ContextProp>(Context)
  const [Data, setData] = useState<ObjProp[]>([])
  // 是否还有更多数据
  const [hasMore, setHasMore] = useState<boolean>(false)
  // 记录当前状态,是加载中...,还是点击加载更多
  const [isLoadingMore, setIsLoadingMore] = useState<boolean>(false)
  // 下一页的页码,首页的页码是0
  const [page, setPage] = useState<number>(0)
  const resultHandle = (result: Promise<Response>) => {
    result.then(res => {
      return res.json()
    }).then(json => {
      const { data, hasMore } = json
      setData(Data.concat(data))
      setHasMore(hasMore)
    })
  }
  const getPageData = () => {
    const cityName = state.cityName
    const result = getListData(cityName, page)
    resultHandle(result)
  }
  const loadMoreData = () => {
    setIsLoadingMore(true)
    setPage(page => page + 1)
    setIsLoadingMore(false)
  }
  useEffect(() => {
    getPageData()
  }, [])
  useEffect(() => {
    if (isLoadingMore) {
      getPageData()
    }
  }, [page])
  return (
    <div>
      {Data.length > 0 ? <ListComponent data={Data}/> : '加载中...'}
      // 如果还有下一页或者更多数据的情况下才显示加载更多
      {hasMore ? <LoadMore isLoadingMore={isLoadingMore} loadMoreFn={loadMoreData}/> : <div></div>}
    </div>
  )
}
  • LoadMore.tsx
interface Prop {
  isLoadingMore: boolean;
  loadMoreFn: () => void;
}
const LoadMore: React.FC<Prop> = (props) => {
  let timer: number | null = null
  const loadRef = useRef<HTMLDivElement>(null)
  const scrollBottomGetData = () => {
    // 当前加载更多文字距可视窗口顶部的位置
    const top = loadRef.current!.getBoundingClientRect().top
    // 窗口的高度
    const windowH = window.screen.height
    // 如果小于窗口的高度,说明进入可视范围内了,也就是到底了
    if (top && top < windowH) {
      props.loadMoreFn()
    }
  }
  const onScroll = () => {
    if (props.isLoadingMore) {
      return
    }
    if (timer) {
      window.clearTimeout(timer)
    }
    timer = window.setTimeout(scrollBottomGetData, 500)
  }
  useEffect(() => {
    document.addEventListener('scroll', onScroll)
    return () => {
      document.removeEventListener('scroll', onScroll)
    }
  }, [])
  return (
    <div className={"load-more"} ref={loadRef}>
      {
        props.isLoadingMore ? <span>加载中...</span>
          : <span>加载更多</span>
      }
    </div>
  )
}
export default LoadMore;

相关文章

  • Flutter 实现上拉加载更多、下拉刷新

    参考:ListView下拉刷新与加载更多 文章目录 相关文章推荐 实现效果 实现分析下拉刷新上拉加载更多 源码 相...

  • 下拉加载更多的实现

    1.四个属性Data // 存储列表数据hasMore // 是否还有更多数据,对应接口是否还有下一页的字段isL...

  • Flutter 自定义PullToRefreshListView

    Flutter 自定义PullToRefreshListView,实现下拉刷新,和上拉加载更多,以及加载到底的实现...

  • React 实现加载更多

    app 下拉刷新和上拉加载是很常见的效果。今天尝试用react 来实现下拉加载和点击按钮加载更多的效果 下面的代...

  • RecyclerViewRefresh

    采用RecyclerView和SwipeRefreshLayout实现下拉刷新和上拉自动加载更多 1.下拉刷新 2...

  • Android RecyclerView 局部刷新分析

    前情回顾 Android RecycleView轻松实现下拉刷新、加载更多 Android RecyclerVie...

  • 自定义ListView实现下拉刷新

    下拉加载更多在我们平常使用的APP中经常会见到,比如我们刷微博时下拉加载更多的新闻,空间动态下拉加载更多的消息等。...

  • 下拉刷新

    Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多 PullToRefresh使用详解...

  • Android上拉加载更多和下拉刷新

    采用SmartRefreshLayout来实现上拉刷新和下拉加载更多:参考:https://github.com/...

  • Android面试整理

    RecyclerView的上拉加载、下拉刷新怎么实现?RecyclerView原生实现侧滑、拖动? 上拉加载、下拉...

网友评论

      本文标题:下拉加载更多的实现

      本文链接:https://www.haomeiwen.com/subject/xvavtktx.html