💻
React Native
  • 👨‍💻Full-Stack Web Developer
  • 📚Теорія
    • 1️⃣Налаштування робочого середовища
      • Вступ
      • Налаштування середовища розробки
      • Перший проект
      • Налаштування емуляції Android (Android Studio + JDK)
      • Налаштування емуляції Iphone (Xcode)
      • Запуск проекту на віртуальних пристроях
      • Expo Snack
    • 2️⃣Верстка і стилізація
      • Функціональні та класові компоненти
      • Базові компоненти
      • Фундаментальні концепції React в React Native
      • Стилізація компонентів
      • Стилізація залежно від платформи
      • Кольори
      • Зображення
      • Векторна графіка
      • Розташування компонентів
      • Робота зі шрифтами
      • Колекції даних
      • Дебаг застосунку
    • 3️⃣Обробка подій
      • Обробка подій
      • Обробка текстових інпутів
      • Інпути в фокусі
      • Форма для збору даних
      • Робота з клавіатурою
      • Перехоплення подій
    • 4️⃣Навігація
      • Підключення навігації
      • Перемикання екранів
      • Передача параметрів між екранами
      • Хедер екрану
      • Вкладена навігація
      • Нижня навігація
    • 5️⃣Нативні компоненти
      • Камера
      • Мапи
      • Геолокація
    • 👷Практика
      • 1️⃣Завдання 1
      • 2️⃣Завдання 2
      • 3️⃣Завдання 3
      • 4️⃣Завдання 4
      • 5️⃣Завдання 5
      • 6️⃣Завдання 6
      • 7️⃣Завдання 7
    • Додаткові покликання
  • Про мене
    • Про мене
Powered by GitBook
On this page
  • ScrollView + map
  • FlatList
  • SectionList
  1. Теорія
  2. Верстка і стилізація

Колекції даних

PreviousРобота зі шрифтамиNextДебаг застосунку

Last updated 1 year ago

Для відображення колекції однотипних даних (на кшталт списків користувачів, новин, посилань тощо) є два підходи. Який обрати - залежить від поставленої задачі та оцінки продуктивності.

Підходи:

ScrollView + map

Як контейнер застосовують ScrollView, а всередині нього перебирають масив методом map.

App.js
import React, { useState } from "react";
import { StyleSheet, Text, ScrollView, SafeAreaView } from "react-native";

const FRIENDS = [
  {
    id: "001",
    name: "Alex",
  },
  {
    id: "002",
    name: "John",
  },
  {
    id: "003",
    name: "Mark",
  },
  {
    id: "004",
    name: "Andrew",
  },
];

export default function App() {
  const [friends, setFriends] = useState(FRIENDS);

  return (
    <SafeAreaView style={styles.container}>
      <ScrollView>
        {friends.map((friend) => (
          <Text key={friend.id} style={styles.text}>
            {friend.name}
          </Text>
        ))}
      </ScrollView>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center",
    backgroundColor: "#ecf0f1",
  },
  text: {
    fontSize: 40,
  },
});

За таким принципом рендерять розмітку списків у веброзробці. Утім при такому способі вантажиться уся колекція одразу. Наприклад, якщо є тисяча елементів, то відображається на екрані невелика частина, а решта ховається за межами ScrollView. В такому разі контрпродуктивно вантажиться застосунок на марні задачі. Інша справа підвантажувати контент за потреби. Наступний спосіб.

FlatList

FlatList рендерить лише ту частину колекції, яку видно на екрані пристрою. Пешта контенту буде підванатжуватися, коли потрапить у вʼ.порт пристрою.

Основні пропси компоненту FlatList:

  • data - приймає масив елементів

  • renderItem - функція, яка бере послідовно по одному елемену із data та повертає відформатований компонент для візуалізації.

  • keyExtractor - сюди передають унікальний ключ елемента колекції (аналогія key в map). ключ має бути рядком.

App.js
import React, { useState } from "react";
import { StyleSheet, Text, SafeAreaView, FlatList } from "react-native";

const FRIENDS = [
  {
    id: "001",
    name: "Alex",
  },
  {
    id: "002",
    name: "John",
  },
  {
    id: "003",
    name: "Mark",
  },
  {
    id: "004",
    name: "Andrew",
  },
];

export default function App() {
  const [friends, setFriends] = useState(FRIENDS);

  return (
    <SafeAreaView style={styles.container}>
      <FlatList
        data={friends}
        renderItem={({ item }) => <Text style={styles.text}>{item.name}</Text>}
        keyExtractor={(item) => item.id}
      />
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center",
    backgroundColor: "#ecf0f1",
  },
  text: {
    fontSize: 40,
  },
});

SectionList

Якщо потрібно відобразити набір даних, розбитих на логічні розділи, в такому разі зручно використовувати компонент SectionList.

App.js
import React, { useState } from "react";
import {
  StyleSheet,
  Text,
  SafeAreaView,
  SectionList,
  View,
} from "react-native";

const FRIENDS = [
  {
    title: "Girls",
    data: [
      {
        name: "Helga",
        phone: "12345678",
      },
      {
        name: "Gloria",
        phone: "12345678",
      },
      {
        name: "Samantha",
        phone: "12345678",
      },
      {
        name: "Samantha",
        phone: "12345678",
      },
    ],
  },
  {
    title: "Guys",
    data: [
      {
        name: "Alex",
        phone: "12345678",
      },
      {
        name: "John",
        phone: "12345678",
      },
      {
        name: "Mark",
        phone: "12345678",
      },
      {
        name: "Andrew",
        phone: "12345678",
      },
    ],
  },
];

export default function App() {
  const [friends, setFriends] = useState(FRIENDS);

  return (
    <SafeAreaView style={styles.container}>

      <SectionList
        sections={friends}
        keyExtractor={(item, index) => item + index}
        renderItem={({ item }) => (
          <View style={styles.item}>
            <Text style={styles.text}>Name: {item.name}</Text>
            <Text style={styles.phone}>Phone: {item.phone}</Text>
          </View>
        )}
        renderSectionHeader={({ section: { title } }) => (
          <Text style={styles.header}>{title}</Text>
        )}
      />
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center",
    backgroundColor: "#ecf0f1",
  },
  header: {
    marginTop: 20,
    fontSize: 40,
    backgroundColor: "#f9c2ff",
  },
  item: { padding: 10 },
  text: {
    fontSize: 40,
  },
  phone: {
    fontSize: 20,
  },
});

Посилання на офіційну документацію:

📚
2️⃣
List Views
FlatList
SectionList
Компонент ScrollView + map
Компонент FlatList