Contents

Tworzenie stylowych formularzy Next.js za pomocą React Hook Form i Material UI

Material UI (MUI) to popularna biblioteka komponentów, która implementuje system Google Material Design. Zapewnia szeroką gamę gotowych komponentów interfejsu użytkownika, które można wykorzystać do tworzenia funkcjonalnych i atrakcyjnych wizualnie interfejsów.

Chociaż Archetype jest przeznaczony głównie do użytku z Reactem, można go dostosować i rozszerzyć o dodatkowe frameworki, które są częścią szerszego ekosystemu React, takiego jak Next.js.

Pierwsze kroki z React Hook Form i Material UI

React Hook Form to popularna biblioteka, która zapewnia prosty i deklaratywny sposób tworzenia, zarządzania i walidacji formularzy.

Integrując komponentów i stylów interfejsu użytkownika Material UI, możesz tworzyć dobrze wyglądające formularze, które są łatwe w użyciu i stosować spójny wygląd w aplikacji Next.js.

Na początek można skonfigurować lokalne środowisko programistyczne dla aplikacji Next.js, tworząc nowy projekt przy użyciu frameworka Next.js. Aby to zrobić, zaleca się pobranie i zainstalowanie najnowszej wersji Next.js, która będzie wykorzystywać katalog “App” jako bazę.

 npx create-next-app@latest next-project --app 

Następnie zainstaluj te pakiety w swoim projekcie:

 npm install react-hook-form @mui/material @mui/system @emotion/react @emotion/styled 

Poniżej znajduje się rzut oka na strukturę, która zostanie wzniesiona, obejmując jej zawiłości i szczegóły w wymowny sposób.

/pl/images/next-js-form.jpg

Kod źródłowy wyżej wymienionego projektu jest dostępny za pośrednictwem odpowiedniego repozytorium GitHub.

Tworzenie i stylizacja formularzy

React Hook Form oferuje szereg przydatnych narzędzi, wśród których dominuje hak useForm .

Podejście to ułatwia zarządzanie stanem formularza, weryfikację danych wejściowych i przesyłanie poprzez usprawnienie podstawowych elementów kontroli formularza, zwiększając w ten sposób ogólną wydajność takich procesów.

Aby opracować formularz wykorzystujący ten hak, należy utworzyć nowy plik w katalogu “src/components” i oznaczyć go jako “form.js”.

Aby włączyć do projektu niezbędne zależności dla bibliotek React Hook Form i Material-UI, należy najpierw zaimportować je w następujący sposób:

 "use client"
import React, {useState} from 'react';
import { useForm } from 'react-hook-form';
import { TextField, Button as MuiButton, Alert } from '@mui/material';
import { styled } from '@mui/system'; 

MUI oferuje szereg prefabrykowanych elementów interfejsu użytkownika, które można dostosować poprzez zastosowanie właściwości stylistycznych. Ta wszechstronność pozwala na spersonalizowaną adaptację w celu spełnienia określonych wymagań projektowych.

Niemniej jednak, aby zwiększyć wszechstronność i kontrolę nad konfiguracją interfejsu użytkownika, można zastosować podejście stylizowane w celu zastosowania atrybutów CSS w celu dostosowania wyglądu różnych elementów interfejsu użytkownika. W ten sposób można modyfikować podstawowe elementy formularza, takie jak jego główna obudowa, sam formularz i poszczególne pola wprowadzania znaków.

Tuż pod importem dodaj ten kod:

 const FormContainer = styled('div')({
  display: 'flex',
  flexDirection: 'column',
  alignItems: 'center',
  justifyContent: 'center',
  height: '100vh',
});

const StyledForm = styled('form')({
  width: '80%',
  maxWidth: '400px',
  padding: '20px',
  borderRadius: '10px',
  border: '2px solid #1E3A8A',
  boxShadow: '0px 0px 10px rgba(0, 0, 0, 0.2)',
  backgroundColor: '#ffffff',
  textAlign: 'center',
});

const StyledTextField = styled(TextField)({
  marginBottom: '16px',
  width: '100%',
}); 

Zapewnienie modułowej architektury jest kluczowe podczas tworzenia oprogramowania. Aby osiągnąć ten cel, zaleca się fragmentację kodu w wielu plikach, zamiast konsolidowania wszystkiego w jednym pliku. Takie podejście pozwala na większą organizację i elastyczność podczas pracy z różnymi aspektami aplikacji.

Stosując to podejście, można płynnie integrować i wykorzystywać te elementy w różnych aspektach swojego programu, co skutkuje usprawnioną i łatwą w zarządzaniu bazą kodu.

Teraz zdefiniuj komponent funkcjonalny:

 export default function Form() {
  const { register, handleSubmit, formState: { errors } } = useForm();
  
  return (
    <>
      <FormContainer>
        <StyledForm>
          <StyledTextField
            label="Username"
            type="text"
          />
          <StyledTextField
            label="Password"
            type="password"
          />
          <MuiButton
             type="submit"
             variant="contained"
             color="primary"
             margin="5px"
           > Submit </MuiButton>
        </StyledForm>
      </FormContainer>
    </>
  );
} 

Rzeczywiście, po utworzeniu komponentu Page , jak omówiono wcześniej, będziesz musiał zintegrować go z aplikacją, importując go do odpowiedniej strony lub modułu w projekcie. W szczególności należy zlokalizować odpowiedni plik, w którym zarządzana jest nawigacja witryny, taki jak app/page.js , i dodać instancję komponentu Page w żądanej lokalizacji w tym pliku. Jednocześnie należy usunąć z tego pliku wszelki zbędny lub nieistotny kod związany z funkcjonalnością Next.js i zastąpić go dostarczonym szablonem. Umożliwi to płynną integrację niestandardowego zachowania onClickOutside wraz z innymi komponentami na stronie internetowej bez konfliktu z domyślnym zachowaniem Next.js.

 import Form from 'src/components/Form'

export default function Home() {
  return (
    <main >
      <Form />
    </main>
  )
} 

Aby rozpocząć proces tworzenia aplikacji internetowej, aktywuj serwer programistyczny, który wygeneruje intuicyjny interfejs z dwoma polami wprowadzania tekstu oraz przyciskiem poleceń w preferowanej przeglądarce internetowej.

Obsługa walidacji formularzy

Wygląd formularza jest atrakcyjny wizualnie; jednak obecnie brakuje mu funkcjonalności, ponieważ nie wykonuje żadnych działań w oparciu o dane wejściowe użytkownika. Aby formularz mógł zacząć działać, konieczne jest włączenie logiki walidacji, która zapewni dokładność i wiarygodność danych wprowadzanych przez użytkownika. Można to osiągnąć poprzez wykorzystanie funkcji użytkowych związanych z formularzem, które zostały zaprojektowane specjalnie do zarządzania i sprawdzania poprawności danych wprowadzanych przez użytkownika.

Sure!Oto przykład, jak można to zaimplementować w komponencie LoginForm przy użyciu haków React i TypeScript:typescriptimport { useState } from ‘react’;interface LoginFormProps {}const LoginForm = ({}: LoginFormProps) => {const [formStatus, setFormStatus] = useState(’’); // inicjalizuje formStatus jako pusty ciągconst handleSubmit = (event: React.FormEvent ) => {event.preventDefault(); if (!validateCredentials(usernameField.value, passwordField.value)) {alert(“Nieprawidłowa nazwa użytkownika lub hasło.”); return; }setFormStatus(‘submitted’); // ustawia formularz

 const [formStatus, setFormStatus] = useState({ success: false, error: '' }); 

Następnie opracujemy funkcjonalną jednostkę odpowiedzialną za walidację danych uwierzytelniających użytkownika. Komponent ten będzie emulował transakcję HTTP często spotykaną podczas łączenia aplikacji frontendowych z usługami uwierzytelniania zaplecza.

 const onSubmit = (data) => {
    if (data.username === 'testuser' && data.password === 'password123') {
        setFormStatus({ success: true, error: '' });
    } else {
        setFormStatus({ success: false, error: 'Invalid username or password' });
    }
}; 

Włącz instancję funkcji, która jest wyzwalana po interakcji z określonym elementem, przekazując jego oznaczenie jako parametr do wspomnianego komponentu, aby wywołać pożądaną odpowiedź związaną z określoną akcją po interakcji.

 onClick={handleSubmit(onSubmit)} 

Znaczenie zmiennej stanu formStatus polega na jej zdolności do dyktowania sposobu, w jaki informacje zwrotne są przekazywane użytkownikowi końcowemu. W przypadku, gdy użytkownik dostarczy prawidłowe informacje uwierzytelniające, można zdecydować się na wyświetlenie komunikatu o powodzeniu. Co więcej, jeśli aplikacja zawiera dodatkowe strony w ramach Next.js, przekierowanie na alternatywną stronę staje się realną opcją dla użytkownika.

Ważne jest, aby oferować konstruktywne informacje zwrotne, gdy dane uwierzytelniające są nieprawidłowe. Na szczęście Material-UI zapewnia doskonały komponent informacji zwrotnej, który można wykorzystać w połączeniu z możliwościami renderowania warunkowego Reacta, aby przekazać użytkownikowi status procesu przesyłania formularza, w zależności od wartości zmiennej formStatus.

Aby zaimplementować tę funkcjonalność, wstaw wyżej wymieniony kod bezpośrednio pod otwierającym tagiem StyledForm .

 {formStatus.success ? (
    <Alert severity="success">Form submitted successfully</Alert>
) : formStatus.error ? (
    <Alert severity="error">{formStatus.error}</Alert>
) : null} 

Aby zarówno uzyskać, jak i zweryfikować dane wejściowe użytkownika, można wykorzystać metodę register do zarejestrowania elementów wejściowych formularza, monitorowania ich wartości i zdefiniowania kryteriów walidacji.

Podana funkcja akceptuje wiele danych wejściowych, które zawierają identyfikator pola wejściowego wraz z instancją parametrów walidacji. Ten ostatni określa kryteria walidacji pola wejściowego, obejmujące określone wzorce i minimalne długości.

Oczywiście, oto przykład, jak włączyć komponent “StyledTextField”, jednocześnie włączając dostarczony fragment kodu:javascriptimport React from ‘react’;import { TextField } from ‘@material-ui/core’;const MyUsername = () => ( Wpisz swoją nazwę użytkownika poniżej Śmiało i dołącz następujący kod jako właściwość w polu username . );export default MyUsername;

 {...register('username', {
    required: 'Username required',
    pattern: {
        value: /^[a-zA-Z0-9_.-]*$/,
        message: 'Invalid characters used'
    },
    minLength: {
        value: 6,
        message: 'Username must be at least 6 characters'
    },
})} 

Jasne! Oto przykład, jak można zmodyfikować kod, aby użyć nowego rekwizytu o nazwie additionalObject :jsximport React from ‘react’;// inne importy…const PasswordStyledTextField = ({ additionalObject }) => { // dodany propconst handleTextChange = (text) => { // to samo// …};return (

 {...register('password', {
    required: 'Password required',
    minLength: {
        value: 8,
        message: 'Password must be at least 8 characters'
    },
})} 

Rozważ włączenie następującego kodu HTML bezpośrednio po polu wprowadzania danych logowania użytkownika, aby wizualnie przekazać wszelkie niezbędne specyfikacje wejściowe.

Niniejsza implementacja wykonuje powiadomienie, które zawiera błędny komunikat i wyświetla go w przypadku, gdy użytkownik nie spełnia określonych warunków wstępnych. Celem jest dostarczenie użytkownikowi informacji o niezbędnych kryteriach i zachęcenie go do usunięcia wszelkich rozbieżności przed przesłaniem formularza.

 {errors.username && <Alert severity="error">{errors.username.message}</Alert>} 

Podsumowując, ważne jest, aby umieścić identyczny kod bezpośrednio pod polem tekstowym wprowadzania hasła, aby uzyskać optymalne wyniki:

 {errors.password && <Alert severity="error">{errors.password.message}</Alert>}

Rzeczywiście, wdrożone aktualizacje zaowocują estetycznym i funkcjonalnym formularzem internetowym wykorzystującym React Hook Form i komponenty Material UI.

Usprawnij rozwój Next.js dzięki bibliotekom po stronie klienta

Wykorzystanie Material UI i React Hook Form to tylko kilka przykładów z szerokiej gamy wyjątkowych bibliotek po stronie klienta, które można wykorzystać do przyspieszenia procesu tworzenia front-endu aplikacji Next.js.

Wykorzystanie bibliotek po stronie klienta oferuje szereg wyrafinowanych funkcji i skonstruowanych elementów, które ułatwiają przyspieszone tworzenie wyjątkowych aplikacji front-endowych o zwiększonej wydajności.