Kurs React Native · Moduł 5: Formularze

TextInput - Podstawy wprowadzania danych

3 min czytania ·
W tej lekcji4

Witaj w Perłowej Pracowni! Tutaj nauczysz się zbierać dane od mieszkańców Atlantydy poprzez formularze.

Podstawowy TextInput

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

function BasicInput() {
  const [name, setName] = useState('');

  return (
    <View style={styles.container}>
      <Text style={styles.label}>Imię:</Text>
      <TextInput
        style={styles.input}
        value={name}
        onChangeText={setName}
        placeholder="Wpisz swoje imię"
        placeholderTextColor="#888"
      />
      <Text>Wpisano: {name}</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    padding: 20,
  },
  label: {
    fontSize: 16,
    marginBottom: 8,
    color: '#1a5276',
  },
  input: {
    borderWidth: 1,
    borderColor: '#1a5276',
    borderRadius: 8,
    padding: 12,
    fontSize: 16,
    backgroundColor: '#fff',
  },
});

Ważne właściwości TextInput

<TextInput
  // Podstawowe
  value={value}
  onChangeText={(text) => setValue(text)}
  placeholder="Podpowiedź"
  placeholderTextColor="#999"

  // Typ klawiatury
  keyboardType="default"        // domyślna
  keyboardType="email-address"  // email z @
  keyboardType="numeric"        // tylko cyfry
  keyboardType="phone-pad"      // telefon
  keyboardType="decimal-pad"    // liczby z przecinkiem

  // Zachowanie
  autoCapitalize="none"         // bez wielkich liter
  autoCapitalize="sentences"    // wielka na początku zdania
  autoCapitalize="words"        // wielka każde słowo
  autoCorrect={false}           // wyłącz autokorektę
  autoComplete="email"          // sugestie (email, password, name)

  // Wygląd
  multiline={true}              // pole wieloliniowe
  numberOfLines={4}             // liczba linii (Android)
  maxLength={100}               // maksymalna długość

  // Hasło
  secureTextEntry={true}        // ukrycie tekstu

  // Focus
  autoFocus={true}              // automatyczny focus
  selectTextOnFocus={true}      // zaznacz tekst przy focus

  // Przyciski klawiatury
  returnKeyType="done"          // done, go, next, search, send
  onSubmitEditing={() => {}}    // akcja przy Enter

  // Edytowalność
  editable={true}               // czy można edytować
/>

Różne typy pól

function InputTypes() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [phone, setPhone] = useState('');
  const [bio, setBio] = useState('');

  return (
    <View style={styles.container}>
      {/* Email */}
      <TextInput
        style={styles.input}
        value={email}
        onChangeText={setEmail}
        placeholder="Email"
        keyboardType="email-address"
        autoCapitalize="none"
        autoComplete="email"
      />

      {/* Hasło */}
      <TextInput
        style={styles.input}
        value={password}
        onChangeText={setPassword}
        placeholder="Hasło"
        secureTextEntry
        autoComplete="password"
      />

      {/* Telefon */}
      <TextInput
        style={styles.input}
        value={phone}
        onChangeText={setPhone}
        placeholder="Numer telefonu"
        keyboardType="phone-pad"
        maxLength={12}
      />

      {/* Wieloliniowe */}
      <TextInput
        style={[styles.input, styles.multiline]}
        value={bio}
        onChangeText={setBio}
        placeholder="Opowiedz o sobie..."
        multiline
        numberOfLines={4}
        textAlignVertical="top"
      />
    </View>
  );
}

Stylowanie stanów

function StyledInput() {
  const [value, setValue] = useState('');
  const [isFocused, setIsFocused] = useState(false);
  const [error, setError] = useState('');

  const validateEmail = (text: string) => {
    setValue(text);
    if (text && !text.includes('@')) {
      setError('Nieprawidłowy email');
    } else {
      setError('');
    }
  };

  return (
    <View>
      <TextInput
        style={[
          styles.input,
          isFocused && styles.inputFocused,
          error && styles.inputError,
        ]}
        value={value}
        onChangeText={validateEmail}
        onFocus={() => setIsFocused(true)}
        onBlur={() => setIsFocused(false)}
        placeholder="Email"
      />
      {error ? <Text style={styles.errorText}>{error}</Text> : null}
    </View>
  );
}

const styles = StyleSheet.create({
  input: {
    borderWidth: 2,
    borderColor: '#ddd',
    borderRadius: 8,
    padding: 12,
  },
  inputFocused: {
    borderColor: '#1a5276',
    backgroundColor: '#f0f8ff',
  },
  inputError: {
    borderColor: '#e74c3c',
    backgroundColor: '#fdf2f2',
  },
  errorText: {
    color: '#e74c3c',
    fontSize: 12,
    marginTop: 4,
  },
});

TextInput to podstawowy element formularzy w React Native!

Kod do tej lekcji: App.tsx
import React, { useState } from 'react';
import { View, Text, TextInput, StyleSheet } from 'react-native';

export default function App() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');

  return (
    <View style={styles.container}>
      <Text style={styles.title}>Logowanie do Atlantydy</Text>

      {/* TODO: dodaj <TextInput> dla email, który:
          - ma value={email} oraz onChangeText={setEmail}
          - ma placeholder="Email"
          - ma keyboardType="email-address"
          - ma autoCapitalize="none"
          - korzysta ze stylu styles.input */}

      {/* TODO: dodaj <TextInput> dla hasła, który:
          - ma value={password} oraz onChangeText={setPassword}
          - ma placeholder="Hasło"
          - ukrywa tekst za pomocą secureTextEntry
          - korzysta ze stylu styles.input */}

    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 20,
    justifyContent: 'center',
    backgroundColor: '#1a5276',
  },
  title: {
    fontSize: 22,
    color: '#fff',
    marginBottom: 24,
    textAlign: 'center',
  },
  input: {
    backgroundColor: '#fff',
    borderRadius: 8,
    padding: 14,
    fontSize: 16,
    color: '#1a5276',
    marginBottom: 16,
  },
});

Hasła z dokumentacji w tej lekcji

Widzisz błąd w tej lekcji?

Sprawdź się

Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.

  1. 1. Która właściwość TextInput służy do aktualizacji wartości?

  2. 2. Która właściwość ukrywa wpisywany tekst (dla haseł)?

To 2 z 3 pytań do tej lekcji. Pozostałe rozwiążesz w grze.

Zadania praktyczne w grze

  • Układanie w poziomie

    Ułóż TextInput dla adresu email:

  • Edytor kodu

    Uzupełnij kod formularza z TextInput.

Przydatne artykuły