React Native Bidirectional Looping FlatList - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь создать компонент боковой панели, похожий на карусель в своем поведении.Это будет иметь фиксированные данные с максимум 10 пунктов.В настоящее время я основываю свою реализацию на этом ответе .Мои требования к этой боковой панели следующие:

  • Двунаправленный
  • Цикл фиксированных данных
  • onПресс каждого элемента прокручивается вверх

Я пытался реализовать это с помощью реагировать-родной-оснастка-карусель , но я не смог получить правильное поведение прокрутки.Я также пытался использовать https://github.com/prateek3255/react-native-infinite-looping-scroll/, но производительность была очень плохой.Я попытался оптимизировать поведение onScroll, но решил отказаться от этого и начать с исходной базы, которую я упомянул выше .

Мой текущий компонент InfiniteScroll:

import React, { Component } from "react";
import { FlatList } from "react-native";

export default class InfiniteScroll extends Component {
    constructor(props) {
        super(props);
        this.state = {};
        this._flatList = null;
    }

    onScrollToIndex = index => {
        this._flatList.scrollToIndex({ animated: true, index: index });
    };

    getWrappableData = data => {
        return [...data, ...data];
    };

    render = () => (
        <FlatList
            {...this.props}
            keyExtractor={index => index.toString()}
            ref={el => (this._flatList = el)}
            onLayout={({ nativeEvent }) => {
                const { width, height } = nativeEvent.layout;
                this.setState({
                    width,
                    height
                });
            }}
            onScroll={({ nativeEvent }) => {
                const { x } = nativeEvent.contentOffset;
                if (x === 730) {
                    this._flatList.scrollToOffset({ x: 0, animated: false });
                }
            }}
            data={this.getWrappableData(this.props.data)}
            pagingEnabled={true}
            scrollEnabled={false}
        />
    );
}

Мой текущийРеализация выглядит так, как показано ниже, и в настоящее время может прокручивать, но не вечно, только один дополнительный цикл.Моя цель состояла в том, чтобы вычислить, как далеко была прокручена, и продолжать добавлять одни и те же данные снова и снова.

enter image description here

Конечная цель заключается в следующем, стекущий активный элемент находится во втором индексе, поэтому, когда пользователь нажимает верхний элемент, он может прокручивать вверх вечно или, если он выбирает третий элемент, он может прокручивать вниз вечно.

enter image description here

...