Skip to content
Kezdőlap » Custom input készítés

Custom input készítés

Ha unjuk, vagy nem elég jó nekünk a „gyári” TextInput, akkor tervezzünk saját beviteli mezőt, építsünk custom input komponenst.

Expo Snack – működő példa

Készítettem egy működő példát, ami itt található. Ebben a teljes forráskód fellelhető, így hozzá lehet nézni. Én lépésről-lépésre írom le, hogy mit csináltam.

Mappák és fájlok

Ahogyan azt az egyéni gomb komponens esetében is tettem, létrehoztam egy külön könyvtárat a komponenseknek.

Először készítettem egy components nevű mappát. Ezen belül csináltam egy CustomInput mappát az egyéni gomb komponensnek. Aztán egy CustomInput.js komponens fájlt, ahová a kód kerül. És egy index.js segéd fájlt, amit a CustomInput importálásához használtam:

custom input mappa

CustomInput.js

Ez tartalmazza a komponens kódját.

Importáltam, amire szükségem volt:

import { View, StyleSheet, TextInput } from "react-native";

Íme az üres komponens függvény váza:

const CustomInput = () => {
  return (
    
  );
};

props

Aztán elkezdtem gondolkodni azon, hogy milyen adatokat szeretnék átadni kívülről a függvénynek. Kell maga az érték (value), egy érték beállító függvény (setValue), egy placeholder (placeholder) segítségként a beviteli mezőben megjelenő szövegnek, és egy információ, hogy titkosított-e a szövegbevitel vagy sem (secureTextEntry). Itt arra az esetre gondolok, ha jelszó mezőt szeretnék használni (és fogok is), amiben a bevitt karakterek csillagozva jelennek meg.

A paraméterekkel kiegészítve már így nézett ki a komponensem:

const CustomInput = ({ value, setValue, placeholder, secureTextEntry }) => {
  return (
    <View style={styles.container}>
      <TextInput
        value={value}
        onChangeText={setValue}
        style={styles.input}
        placeholder={placeholder}
        secureTextEntry={secureTextEntry}
      />
    </View>
  );
};

A paramétereket egyesével átadtam (kiszedtem a props változóból). A komponens törzse pedig egy View és egy TextInput react-native komponensből áll.

A TextInputnak a value, onChangeText, style, placeholder és secureTextEntry attribútumait használtam. Ezek közül egyedül a style-t nem adtam meg most kívülről. Ezt a komponensen belül helyeztem el. És az igazat megvallva egyelőre magának a TextInput-nak meghagytam az alapértelmezett stílusát:

const styles = StyleSheet.create({
  container: {
    backgroundColor: "white",
    width: "100%",
    borderColor: "#e8e8e8",
    borderWidth: 1,
    borderRadius: 5,
    padding: 10,
    marginVertical: 5
  },
  input: {},
});

Próba 1.

Az App.js-ben használtam a komponenst. Ha paraméterek nélkül hívom, akkor semmi extra. Egy üres beviteli mező, ami már képes adatok fogadására:

custom input példa

Értékmegőrzés – useState

Ahhoz, hogy a bevitt értékkel valamit lehessen kezdeni, state változókban kell tárolni az értékeket. Erre jó a useState. Hogy ezt szemléltessem, készítek gyorsan egy beléptető űrlapot két mezővel és egy gombbal. Egyik mező a felhasználó névnek, másik pedig a jelszónak lesz létrehozva.

Az App.js-ben importáltam a useState-et:

import { useState } from "react";

Ha már username és password lesz a két mező, akkor felvettem a state változókat és a beállító függvényeiket is:

export default function App() {

  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");

Az egyéni beviteli mező szimpla hívását pedig lecseréltem a felparaméterezett hívásokra:

<CustomInput
    placeholder="Username"
    value={username}
    setValue={setUsername}
  />
  <CustomInput
    placeholder="Password"
    value={password}
    setValue={setPassword}
    secureTextEntry={true}
  />

Adatok küldése

Valahogy ellenőrizni kellene, hogy a beírt adatok valóban megmaradnak-e és tudunk velük dolgozni. Legegyszerűbb megoldás, ha van egy gomb, amivel kiíratom az értékeket a konzolba.

Ha már van saját gomb komponens, akkor nehogy már ne azt használjuk :). Ebben a bejegyzésben megtalálod, hogyan kell létrehozni, de az Expo Snack példában is ott a teljes forráskód.

Importáltam az App.js-be a gombot és el is helyeztem a beviteli mezők alá a komponenst:

<CustomButton onPress={onSignInPressed} text="Sign In" />
custom input

Ami még hiányzik, hogy megírjam az onSignInPressed kezelőt, ami annyit fog csinálni, hogy a gomb lenyomása után, szépen a konzolba kiírja a begépelt felhasználó nevet és jelszót:

  const onSignInPressed = () => {
    console.log(`Username = ${username}`);
    console.log(`Password = ${password}`);
  }

És így is lett:

custom input

Hova tovább?

A történet majd úgy lesz kerek, ha az inputok ellenőrzése is meg lesz oldva. Ez azonban egy másik bejegyzésbe fog beleférni.