1.0.1 • Published 2 years ago

@georstat/react-native-synced-list v1.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

React Native Synced Horizontal and Vertical List

npm version npm License: MIT GitHub package.json version Platform - Android and iOS

Features

  • Synced list component for horizontal and vertical navigation between items
  • Written in Typescript

Preview:

@georstat:react-native-synced-list demo

Installation

yarn:

yarn add @georstat/react-native-synced-list

npm:

npm i @georstat/react-native-synced-list

Usage

Just to get started:

import { SyncedList } from '@georstat/react-native-synced-list';

const listData: Item[] = [
  {
    id: 1,
    title: 'Breakfast',
    data: ['Eggs', 'Bacon', 'Milk', 'Coffee', 'Fresh fruits'],
  },
  {
    id: 2,
    title: 'Lunch',
    data: [
      'Fish',
      'Chicken with vegetables',
      'Beans',
      'Wine',
      'Pork with fried potatoes',
    ],
  },
  // Add more items here
];

const MySyncedList = () => {
  return (
    <View style={{ flex: 1 }}>
      <SyncedList data={listData} />
    </View>
  );
};

Custom List example:

For more info check example

import { SyncedList } from '@georstat/react-native-synced-list';

const MySyncedList = () => {
  const renderHorizontalItem = (
    index: number,
    isSelected: boolean,
    item: any
  ) => {
    return (
      <View style={{ borderRadius: 7, overflow: 'hidden' }}>
        <View
          style={
            isSelected
              ? [styles.itemContainer, styles.itemContainerSelected]
              : styles.itemContainer
          }
        >
          <Text>{item.title}</Text>
        </View>
      </View>
    );
  };

  const renderVerticalItem = (item: any) => {
    return (
      <View style={styles.verticalItemContainer}>
        <Text>{item}</Text>
      </View>
    );
  };

  const renderSectionHeader = (section: any) => {
    return (
      <View style={styles.headerContainer}>
        <View style={styles.innerHeaderContainer}>
          <Text style={styles.header}>{section.title}</Text>
        </View>
      </View>
    );
  };

  return (
    <View style={{ flex: 1 }}>
      <SyncedList
        data={listData}
        horizontalListContainerStyle={styles.horizontalListContainerStyle}
        renderHorizontalItem={renderHorizontalItem}
        renderSectionHeader={renderSectionHeader}
        renderVerticalItem={renderVerticalItem}
      />
    </View>
  );
};

Be careful

By default the horizontal list will render 30 items and the vertical list 40. (initialNumToRender). This is fine for most cases and devices. If you need the maximum performance reduce this number and pass the getItemLayoutProp for the horizontal view.

Props

SyncedList accepts the following props:

PropertiesPropTypeDescription
dataArray(Required) Each element in the array must have an id, a title (section title) and a data array (data of each section)
initialIdNumberid of the initial item to scroll
horizontalListContainerStyleObjectStyle for the content container of the horizontal list
verticalListContainerStyleObjectStyle for the content container of the Vertical list
renderHorizontalItemFuncFunction to render a custom item on the horizontal list. Accepts the item , current index and if it is selected eg. (index:number, isSelected:boolean, item:Item,) => ...
renderSectionHeaderFuncFunction to render a custom header on each section. Accepts the section eg. (section:Section ) => ...
renderVerticalItemFuncFunction to render a custom item on the vertical list. Accepts the item eg. (item:Item) => ...
verticalListPropsObjectExtra props of the vertical section list
horizontalListPropsObjectExtra props of the horizontal flat list

Authors: