【react】实现横向滚动加载

效果

react横向滚动加载

在这里插入图片描述

右滑实现滚动加载。滑动到最底部的时候,可以调用后端接口请求下一页的数据。

方法一

使用antd官方推荐的库react-infinite-scroll-componen

但在实现过程中,右滑到底的时候无法调用next方法。

方法二

使用onWheel和useScroll,可能获取到滚动条滑动的距离,能计算出是否滑动到最右边,但是更为细致的计算还得再深入一下。

const ref = useRef(null);
const scroll = useScroll(ref);

const onWheel = ()=>{
  console.log('scroll:', scroll)
}

<div id='srcoll' onWheel={onWheel} ref={ref}></div>
方法三
const fetchData = async (page:number)=>{
  try{
    const res = await getData(page);
    setData([...data, ...res.data]); // 关键点
  }catch(err){
    console.log(err)
  }
}

const onSrcoll = (e) => {
  e.persist();
  const { scrollWidth, scrollLeft, clientWidth } = e.target;
  if (scrollWidth - scrollLeft === clientWidth && scrollLeft && !isSrcollToRight) {
    // 关键点,滚动到最右边了
    setPage(page + 1);
    fetchData(page + 1);
  }
};

<Space
  style={{
    width: '100%',
    overflow: 'auto', // 关键点
  }}
  onScroll={onSrcoll}
>
  {data.length > 0 ? (
    data.map((item: any) => {
      return (
        <Card/>
      );
    })
  ) : (
    <p>暂无回放记录</p>
  )}
</Space>

能够直接判断是否滚动到最右边 ,倒回来向左滚动的时候,也不存在判断是否还需要调用接口,省略了各种位置参数值计算的一步。参考:https://juejin.cn/post/7114195571321077768

如果存在这样一个情况,切换group id后,滚动的card列表的滚动条能够重新定位到最左边,则可以设置scrollLeft值为0,如下:

const onSrcoll = (e) => {
  e.persist();
  setScrollEvent(e); // here
  const { scrollWidth, scrollLeft, clientWidth } = e.target;
  if (scrollWidth - scrollLeft === clientWidth && scrollLeft && !isLoadedAll) {
    // 滚动到最右边了
    setOffset(offset + 1);
    getHistoryParams({ page: offset + 1 });
  }
};
  
  
// 重新设置滚动条位置为最左边
if (scrollEvent?.target?.scrollLeft) {
  scrollEvent.target.scrollLeft = 0;
}

补充:合成事件中的 stopPropagation()preventDefault()阻止事件冒泡;如果要以异步方式访问事件属性,应该对事件调用 event.persist() ,这将从池中删除合成事件,并允许用户代码保留对事件的引用。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现React Native横向分页加载,可以使用FlatList组件并设置horizontal属性为true。具体步骤如下: 1. 在render方法中,使用FlatList组件,并设置horizontal属性为true,同时设置data、keyExtractor、renderItem等必要属性。 2. 在renderItem方法中,返回一个包含分页内容的组件,例如一个View或者Image等。 3. 在FlatList组件中,设置onEndReachedThreshold属性为一个小数值,表示当距离底部还有多少时触发onEndReached事件。 4. 在FlatList组件中,设置onEndReached属性为一个函数,用于在底部触发时加载更多数据。 5. 在onEndReached函数中,可以向服务器请求更多数据并更新FlatList的data属性,从而实现横向分页加载。 下面是一个简单的代码示例: ``` import React, { Component } from 'react'; import { FlatList, View, Image } from 'react-native'; class HorizontalPagination extends Component { constructor(props) { super(props); this.state = { data: [], // 初始数据为空数组 page: 1, // 初始页码为1 loading: false, // 初始状态为未加载 }; } componentDidMount() { // 初始化加载第一页数据 this.loadPage(this.state.page); } loadPage = (page) => { // 请求数据 const url = `http://example.com/api/data?page=${page}`; fetch(url) .then(response => response.json()) .then(result => { // 将新数据和旧数据合并 const data = [...this.state.data, ...result.data]; // 更新state this.setState({ data: data, page: page + 1, // 下一页 loading: false, // 加载完成 }); }) .catch(error => console.error(error)); }; renderItem = ({ item }) => { // 返回一个包含分页内容的组件 return ( <View style={{ width: 200, height: 200 }}> <Image source={{ uri: item.image }} style={{ flex: 1 }} /> </View> ); }; onEndReached = () => { // 到达底部,加载更多数据 if (!this.state.loading) { this.setState({ loading: true }, () => { this.loadPage(this.state.page); }); } }; render() { return ( <FlatList data={this.state.data} keyExtractor={(item, index) => item.id.toString()} renderItem={this.renderItem} horizontal={true} // 横向分页 onEndReachedThreshold={0.5} // 距离底部50%时触发 onEndReached={this.onEndReached} /> ); } } export default HorizontalPagination; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值