react触底加载

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、实现触底加载和依据

触底加载就是说,我们每次都要请求数据,然后每次都是请求几条数据,我们可以依据分页的原理来进行触底加载,有两种方式可以实现触底加载:1.可以在后端分页,然后请求数据,监听滚轮事件,判断是否到底。2.可以在前端分页,然后设置定时器,延迟请求数据,监听滚轮事件,判断是否到底,并且根据组件一起来达到触底加载的效果

二、使用步骤

1.引入库

代码如下(示例):

import { InfiniteScroll } from 'antd-mobile'

2.获取数据和监听滚动事件

//获取数据和监听滚动事件
    useEffect(() => {
        getList()
        document.addEventListener('scroll', scrollEvent)
    }, [])

3.请求后端数据

代码如下(示例):

	//设置每次更新的页数
    let [page, setPage] = useState(0)
    //获取数据的列表
    let [arr, setArr] = useState([])
    //判断是加载中还是没有更多了,true是加载中false是没有更多了
    const [hasMore, setHasMore] = useState(true)
    //请求后端接口
	 const getList = () => {
        axios.get('http://localhost:3000/').then(val => {
            setTimeout(() => {
                let tmp = arr
                //每次请求数据页数+1
                setPage(page++)
                //每次展示10条数据
                let pageSize = 10
                //进行分页每次请求数据不一样
                tmp.push(...val.data.data.slice((page - 1) * pageSize, page * pageSize))
                //判断最后的总条数是否大于总数据的条数
                if (page * pageSize <= val.data.data.length) {
                    setArr([...tmp])
                    setHasMore(true)
                } else {
                	//判断组件是加载中还是没有更多了
                    setHasMore(false)
                    return false
                }
            }, 2000);
        })
    }
   

4.判断是否触底

const scrollEvent = () => {
        let html = document.documentElement || document.body
        //html.scrollTop是滑轮距离顶部的距离,html.scrollHeight是滚动的高度,html.clientHeight是可视区域的高度,也可以使用别的判断方法,意思都差不多
        if (html.scrollTop >= html.scrollHeight - html.clientHeight) {
            getList()
        }
    }

5.组件需要的东西

 import React, { useState } from 'react'
import { InfiniteScroll, List } from 'antd-mobile'

export default () => {
  const [data, setData] = useState([])
  const [hasMore, setHasMore] = useState(true)
  async function loadMore() {
    const append = await mockRequest()
    setData(val => [...val, ...append])
    setHasMore(append.length > 0)
  }

  return (
    <>
      <List>
        {data.map((item, index) => (
          <List.Item key={index}>{item}</List.Item>
        ))}
      </List>
      <InfiniteScroll loadMore={loadMore} hasMore={hasMore} />
    </>
  )
}

6.完整代码

import React, { useEffect, useState } from 'react'
import { Tabs, InfiniteScroll } from 'antd-mobile'
import axios from 'axios'
export default function App() {
  const [arr, setArr] = useState([])
  let [num, setNum] = useState(0)
  //请求后端接口
  function getArr() {
    axios.get('http://localhost:3000/').then(val => {
      setTimeout(() => {
        let tmp = arr
        let pageSize = 10
        setNum(num++)
        tmp.push(...val.data.data.slice((num - 1) * pageSize, num * pageSize))
        if (num*pageSize <= val.data.data.length) {
          setArr([...tmp])
          setHasMore(true)
        } else {
          setHasMore(false)
          return false
        }

      }, 2000);
    })
  }
	//请求数据和监听滚动事件
  useEffect(() => {
    getArr()
    document.addEventListener('scroll', scrollEvent)
  }, [])
  //滚动事件,判断是否到底
  const scrollEvent = () => {
    let html = document.documentElement || document.body
    if (html.scrollTop >= html.scrollHeight - html.clientHeight) {
      // console.log('到底了');
      getArr()
    }
  }
  //判断是加载中还是没有更多了,true为加载中,false为没有更多了
  const [hasMore, setHasMore] = useState(true)
  async function loadMore() {

  }
  return (
    <div style={{ display: 'flex', justifyContent: 'space-around', flexWrap: 'wrap' }}>
      {
        arr.map(item => {
          return (
            <div style={{ width: '45%' }}>
              <div>
                <img src={item.pic} alt="" width='100%' />
              </div>
              <div>
                {item.title}
                {item.price}
              </div>
            </div>
          )
        })
      }
      <InfiniteScroll loadMore={loadMore} hasMore={hasMore} />
    </div>
  )
}

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了触底加载的使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个React触底加载的Hook封装的示例代码: ```javascript import { useState, useEffect } from 'react'; function useOnScreen(ref) { const [isIntersecting, setIntersecting] = useState(false); useEffect(() => { const observer = new IntersectionObserver( ([entry]) => { setIntersecting(entry.isIntersecting); }, { rootMargin: '0px 0px 100px 0px' } // 设置触发时机 ); if (ref.current) { observer.observe(ref.current); } return () => { observer.unobserve(ref.current); }; }, [ref]); return isIntersecting; } function useScroll() { const [scrollPosition, setScrollPosition] = useState(0); useEffect(() => { const updateScrollPosition = () => { setScrollPosition(window.pageYOffset); }; window.addEventListener('scroll', updateScrollPosition); return () => window.removeEventListener('scroll', updateScrollPosition); }, []); return scrollPosition; } function useInfiniteScroll(callback) { const [isFetching, setIsFetching] = useState(false); const [page, setPage] = useState(1); const [hasMore, setHasMore] = useState(true); const ref = useRef(); const isIntersecting = useOnScreen(ref); const scrollPosition = useScroll(); useEffect(() => { if (isIntersecting && !isFetching && hasMore) { setIsFetching(true); callback(page).then((res) => { if (res.length === 0) { setHasMore(false); } else { setPage(page + 1); } setIsFetching(false); }); } }, [isIntersecting, isFetching, hasMore, page, callback]); return [ref, scrollPosition]; } ``` 这个Hook封装了一个无限滚动的功能,当用户滚动到页面底部时,会自动触发回调函数,从而实现无限滚动的效果。其中,`useOnScreen`是用来判断元素是否在可视区域内的Hook,`useScroll`是用来获取滚动条位置的Hook,`useInfiniteScroll`是用来封装无限滚动功能的Hook。 使用示例: ```javascript function App() { const [list, setList] = useState([]); const [ref, scrollPosition] = useInfiniteScroll(fetchData); function fetchData(page

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值