💻
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
  1. Теорія
  2. Обробка подій

Інпути в фокусі

PreviousОбробка текстових інпутівNextФорма для збору даних

Last updated 1 year ago

В React Native немає псевдокласу :active, тому таким способом стилізувати інпути не вийде.

Але у TextInput є пропси onFocus і onBlur. Відповідно це колбек-функції, які виконуються при фокусі інпуті і прибиранні фокуса інпута.

Можна створити стейт стану для інпута і прописувати стилізацію інпута в залежності від значення цього стейту.

Можна прописати загальну стилізацію інпута і тернарним операторам додавати модифікуючий стиль, якщо інпут в фокусі. Можливий варіант реалізації цієї задачі наведено нижче.

Для коректного відображення наведений нижче код потрібно перевіряти саме на емуляторі iOS, Android або власному пристрої (Web не відображає коректно цей функціонал).

Резервний код
App.js
import { useState } from "react";
import {
  View,
  TextInput,
  StyleSheet,
  TouchableWithoutFeedback,
  Keyboard,
  KeyboardAvoidingView,
  Platform,
} from "react-native";

export default function App() {
  const [activeInput, setActiveInput] = useState(false);

  return (
    <View style={styles.container}>
      <TouchableWithoutFeedback onPress={Keyboard.dismiss}>
         <KeyboardAvoidingView
          behavior={Platform.OS == "ios" ? "padding" : "height"}
        > 
        <View style={styles.container}>
          <TextInput
            placeholder="onFocus/onBlur"
            onFocus={() => setActiveInput(true)}
            onBlur={() => setActiveInput(false)}
            style={
              activeInput
                ? [styles.textInput, styles.textInputActive]
                : styles.textInput
            }
          ></TextInput>
        </View>
        </KeyboardAvoidingView> 
      </TouchableWithoutFeedback>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center",
  },
  textInput: {
    width: 250,
    padding: 15,

    borderWidth: 1,
    borderColor: "black",
    borderRadius: 10,
  },
  textInputActive: {
    borderWidth: 2,
    borderColor: "red",
    backgroundColor: "#ffc7c7",
  },
});

Якщо у нас два і більше текстових інпутів, то потрібно створити стейт стану для кожного інпута. Утім, якщо інпутів дуже багато можна використати інший підхід. Створити один стейт, а в ньому зберігати імʼя того інпута, який активний саме в цей момент часу.

Резервний код
App.js
import { useState } from "react";
import {
  View,
  TextInput,
  StyleSheet,
  TouchableWithoutFeedback,
  Keyboard,
  KeyboardAvoidingView,
  Platform,
} from "react-native";

export default function App() {
  const [activeInput, setActiveInput] = useState(null);

  return (
    <View style={styles.container}>
      <TouchableWithoutFeedback onPress={Keyboard.dismiss}>
         <KeyboardAvoidingView
          behavior={Platform.OS == "ios" ? "padding" : "height"}
        > 
        <View style={styles.container}>
          <TextInput
            placeholder="name"
            onFocus={() => setActiveInput("name")}
            onBlur={() => setActiveInput(null)}
            style={
              activeInput==="name"
                ? [styles.textInput, styles.textInputActive]
                : styles.textInput
            }
          ></TextInput>
          <TextInput
            placeholder="email"
            onFocus={() => setActiveInput("email")}
            onBlur={() => setActiveInput(null)}
            style={
              activeInput==="email"
                ? [styles.textInput, styles.textInputActive]
                : styles.textInput
            }
          ></TextInput>
           <TextInput
            placeholder="profession"
            onFocus={() => setActiveInput("profession")}
            onBlur={() => setActiveInput(null)}
            style={
              activeInput==="profession"
                ? [styles.textInput, styles.textInputActive]
                : styles.textInput
            }
          ></TextInput>
        </View>
        </KeyboardAvoidingView> 
      </TouchableWithoutFeedback>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center",
  },
  textInput: {
    width: 250,
    padding: 15,
    marginBottom: 15,

    borderWidth: 1,
    borderColor: "black",
    borderRadius: 10,
  },
  textInputActive: {
    borderWidth: 2,
    borderColor: "red",
    backgroundColor: "#ffc7c7",
  },
});

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

📚
3️⃣
TextInput