React Native使用FlatList组件实现水平滚动翻页

先看效果图:

在这里插入图片描述

主要利用到以下二个方法:

1、在一个onScrollBeginDrag回调方法(开始拖动时触发)中记录event.nativeEvent.contentOffset.x:X轴滚动的偏移量。

2、在一个 onScrollEndDrag回调方法(拖动结束时触发)中记录event.nativeEvent.contentOffset.x:X轴滚动的偏移量。

(1)若开始拖拽的偏移量 < 拖动.x,则表示向后翻页。
(2)若开始拖拽的偏移量 >拖动.x,则表示向前翻页。

利用onScroll滚动事件也可以判断是水平向前滚动还是向后滚动,但是这个onScroll事件在一次拖拽开始到拖拽结束会调用多次,所以我没有采用这个方法。

代码:

import React, {FC, useEffect, useState} from 'react';
import {
  StyleSheet,
  View,
  Text,
  TextInput,
  Image,
  TouchableOpacity,
  FlatList,
} from 'react-native';

// @ts-ignore
const Personnel: FC<StackScreenProps<RootStackParamList, 'Personnel'>> = (props) =>{

  const [inputValue, setInputValue] = useState('')
  const [users, setUsers] = useState<User[]>([])
  const [currentPage, setCurrentPage] = useState(1)
  const [scrollViewStartOffsetX, setScrollViewStartOffsetX] = useState(1)

  useEffect(() => {
  var data = [
  {
    name: '小男,
    sex: '男',
    uuid: '#2',
    post: '列车管理员',
    photo_path: 'https://cdn.jsdelivr.net/gh/reactnativecn/react-native-website@gh-pages/img/header_logo.svg',
    safety_level: '1.0',
    skill_level: '1.0',
    birthday: '36443.0'
  },
  ......
  ]
  setUsers([...users,...data]);//将数据传给users
  }, []);

//开始拖拽
  const onScrollBeginDrag = (e: { nativeEvent: { contentOffset: { x: any; }; }; }) => {
    const offsetX = e.nativeEvent.contentOffset.x;//记录拖拽前的X偏移量 0
    setScrollViewStartOffsetX(e.nativeEvent.contentOffset.x)
    console.log('开始拖拽',offsetX)
  }

//拖拽结束
  const onScrollEndDrag = (e: { nativeEvent: { contentOffset: { x: any; }; }; }) => {
    //event.nativeEvent.contentOffset.y表示Y轴滚动的偏移量
    const offsetX = e.nativeEvent.contentOffset.x;//记录拖拽前的X偏移量 0
    console.log('拖拽结束:',offsetX,scrollViewStartOffsetX)
    
    if (scrollViewStartOffsetX > offsetX) {//往前翻页
      if (currentPage !== 1 && currentPage > 0) {
        setCurrentPage(currentPage - 1)
        console.log('向前翻页')
      }

    } else if (scrollViewStartOffsetX < offsetX) {
      if (currentPage < users.length) {
        setCurrentPage(currentPage + 1)
        console.log('向后翻页')
      }
    }
  }

//开始滚动
  const onScroll = (e: { nativeEvent: { contentOffset: { x: any; }; }; }) => {
    console.log('开始滚动')
  }

  // @ts-ignore
  const renderToolItem = ({item}) => {
    return (
              <View style={styles.center_item_box}>
                <Image source={require('../img/cute.png')} style={styles.tx}/>
                <View style={styles.center_box}>
                  <Text style={styles.name}>{item.name}</Text>
                  <View style={styles.center_item}>
                    <Text style={styles.type}>工号:</Text>
                    <Text style={styles.value}>{item.uuid}</Text>
                  </View>
                  <View style={styles.center_item}>
                    <Text style={styles.type}>性别:</Text>
                    <Text style={styles.value}>{item.sex}</Text>
                  </View>
                  <View style={styles.center_item}>
                    <Text style={styles.type}>出生年月:</Text>
                    <Text style={styles.value}>{item.birthday}</Text>
                  </View>
                  <View style={styles.center_item}>
                    <Text style={styles.type}>职务:</Text>
                    <Text style={styles.value}>{item.post}</Text>
                  </View>
                  <View style={styles.center_item}>
                    <Text style={styles.type}>安全等级:</Text>
                    <Text style={styles.value}>{item.safetyLevel}</Text>
                  </View>
                  <View style={styles.center_item}>
                    <Text style={styles.type}>技能等级:</Text>
                    <Text style={styles.value}>{item.skillLevel}</Text>
                  </View>
                </View>
              </View>
    )
  }

    return (
              <View style={styles.bjm}>
                <View style={styles.top}>
                  <TextInput placeholder='请输入人员名称'
                             placeholderTextColor='#949494'
                             onChangeText={value => setInputValue(value)}
                             onSubmitEditing={()=>onSearch()}
                             style={styles.header}
                  />
                  <Image source={require('../img/search.png')} style={styles.search_msg}/>
                </View>
                <View style={styles.center}>
                  {users.length > 0 ?
                    <FlatList
                      data={users}
                      pagingEnabled={true} //整数倍滚动
                      keyExtractor={(item, index) => index}
                      renderItem={renderToolItem}
                      horizontal={true}
                      showsHorizontalScrollIndicator={false}
                      scrollEventThrottle={300}//设置300,一帧回调一次这个onScroll方法,但是没啥用
                      onScroll={onScroll}
                      onScrollBeginDrag={onScrollBeginDrag} // 开始拖拽时调用的方法
                      onScrollEndDrag={onScrollEndDrag} // 结束拖拽时调用的方法
                    />
                    :
                    <Text style={styles.noWork}>还没有人员,请点击右下角导入人员</Text>
                  }
                </View>
                <Text style={styles.pageCount}>{currentPage}/{users.length}</Text>
                <TouchableOpacity onPress={()=>onAddFiles()} activeOpacity={0.9}>
                  <Image source={require('../img/add.png')} style={styles.bottom}/>
                </TouchableOpacity>
              </View>
    )
}

});

export default Personnel;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值