Урок 05

Компоненты: View, Text, Image

Базовые компоненты React Native.

View

Аналог <div>. Контейнер без визуального представления.

<View style={styles.box}>
    {/* дочерние элементы */}
</View>

Не может содержать текст напрямую. Только через <Text>.

Свойства:

<View
    style={styles.box}
    onLayout={(e) => console.log(e.nativeEvent.layout)}
    pointerEvents="none"
/>

Text

Аналог <p> или <span>. Отображает текст.

<Text>Простой текст</Text>

<Text
    numberOfLines={2}
    ellipsizeMode="tail"
    style={styles.title}
>
    Очень длинный текст, который обрежется до двух строк и закончится многоточием
</Text>

Свойства:

  • numberOfLines — максимум строк
  • ellipsizeMode — 'head', 'middle', 'tail', 'clip'
  • selectable — можно ли выделять
  • onPress — нажатие на текст

Вложенные:

<Text style={styles.base}>
    Обычный, <Text style={styles.bold}>жирный</Text>, снова обычный.
</Text>

Image

Картинки. Источник — локальный файл или URL.

import { Image } from 'react-native';

<Image
    source={require('./assets/logo.png')}
    style={{ width: 100, height: 100 }}
/>

<Image
    source={{ uri: 'https://example.com/image.jpg' }}
    style={{ width: 200, height: 200 }}
/>

Важно: для сетевых картинок нужны размеры — width и height.

Свойства:

<Image
    source={{ uri: url }}
    style={styles.image}
    resizeMode="cover"  // 'cover', 'contain', 'stretch', 'repeat', 'center'
    onLoad={() => console.log('загружено')}
    onError={(e) => console.log('ошибка', e.nativeEvent.error)}
/>

resizeMode

  • cover — заполняет, обрезая
  • contain — вписывает целиком
  • stretch — растягивает
  • repeat — повторяет
  • center — по центру

Комбинация

import { View, Text, Image, StyleSheet } from 'react-native';

export default function UserCard({ user }: { user: User }) {
    return (
        <View style={styles.card}>
            <Image source={{ uri: user.avatar }} style={styles.avatar} />
            <View style={styles.info}>
                <Text style={styles.name}>{user.name}</Text>
                <Text style={styles.email} numberOfLines={1}>
                    {user.email}
                </Text>
            </View>
        </View>
    );
}

const styles = StyleSheet.create({
    card: {
        flexDirection: 'row',
        padding: 16,
        backgroundColor: '#fff',
        borderRadius: 12,
        marginBottom: 12,
    },
    avatar: {
        width: 48,
        height: 48,
        borderRadius: 24,
    },
    info: {
        marginLeft: 12,
        flex: 1,
    },
    name: {
        fontSize: 16,
        fontWeight: '600',
    },
    email: {
        fontSize: 14,
        color: '#666',
        marginTop: 2,
    },
});

Если ты уже знаешь React

В вебе ты бы использовал <div>, <p>, <img>. В React Native это View, Text, Image. Пропсы похожи, но src заменён на source, а alt отсутствует.

Итоги

  • View — контейнер
  • Text — текст, с numberOfLines
  • Image — картинки, нужны размеры
  • resizeMode управляет масштабированием
  • Вложенные Text наследуют стиль