Material UI (MUI) je široce používaná knihovna komponent, která implementuje vizuální styl Material Design od společnosti Google. Nabízí rozsáhlou paletu předdefinovaných prvků uživatelského rozhraní, které vám umožní vytvářet funkční a vizuálně atraktivní webové aplikace.
Ačkoliv je primárně určena pro React, lze její možnosti rozšířit i na další frameworky v rámci ekosystému React, například Next.js.
Začínáme s React Hook Form a Material UI
React Hook Form je populární knihovna, která nabízí jednoduchý a deklarativní způsob, jak vytvářet, spravovat a validovat formuláře.
Kombinací Materiálového UI komponent a stylů můžete vytvářet elegantní a snadno použitelné formuláře, které budou vizuálně konzistentní s celkovým designem vaší Next.js aplikace.
Pro začátek si vytvořte nový projekt Next.js. Pro tento návod doporučujeme nainstalovat nejnovější verzi Next.js, která využívá adresář App.
npx create-next-app@latest next-project --app
Následně do projektu nainstalujte následující balíčky:
npm install react-hook-form @mui/material @mui/system @emotion/react @emotion/styled
Zde je malá ukázka toho, co budeme vytvářet:
Kód tohoto projektu je dostupný v GitHub repozitáři.
Tvorba a stylování formulářů
React Hook Form poskytuje několik užitečných funkcí, včetně háčku useForm.
Tento háček zjednodušuje proces zpracování stavu formuláře, ověřování vstupních dat a odesílání, což značně usnadňuje správu formulářů.
Pro vytvoření formuláře využívajícího tento háček přidejte následující kód do nového souboru src/components/form.js.
Nejprve importujte potřebné balíčky z React Hook Form a MUI:
"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 nabízí sadu předpřipravených komponent UI, které lze dále upravovat pomocí stylingových rekvizit.
Pokud však požadujete větší flexibilitu a kontrolu nad vzhledem UI, můžete využít metodu styled pro stylování UI prvků pomocí CSS. V tomto případě můžete stylizovat hlavní součásti formuláře: hlavní kontejner, samotný formulář a textová pole.
Přímo pod importy vložte tento kód:
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%',
});
Během vývoje je klíčové udržovat modulární kód. Proto doporučujeme definovat a stylovat vlastní komponenty v samostatných souborech namísto hromadění veškerého kódu v jednom souboru.
Tímto způsobem můžete snadno importovat a používat tyto komponenty v různých částech vaší aplikace, což zajistí lepší organizaci a udržovatelnost kódu.
Nyní definujte funkční komponentu:
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>
</>
);
}
Nakonec importujte tuto komponentu do souboru app/page.js. Odstraňte veškerý výchozí kód Next.js a nahraďte jej následujícím:
import Form from 'src/components/Form'export default function Home() {
return (
<main >
<Form />
</main>
)
}
Spusťte vývojový server a v prohlížeči byste měli vidět základní formulář se dvěma vstupními poli a tlačítkem pro odeslání.
Zpracování validace formuláře
Formulář vypadá skvěle, ale zatím nemá žádnou funkci. Pro přidání funkčnosti je třeba implementovat validační kód. Funkce useForm hook vám pomůže se správou a validací uživatelského vstupu.
Nejprve definujte proměnnou stavu pro správu aktuálního stavu formuláře v závislosti na tom, zda uživatel zadal správné údaje. Přidejte tento kód do funkční komponenty:
const [formStatus, setFormStatus] = useState({ success: false, error: '' });
Dále vytvořte funkci obsluhy pro validaci přihlašovacích údajů. Tato funkce bude simulovat HTTP API požadavek, který se obvykle odesílá při komunikaci klientské aplikace s autentizačním API backendu.
const onSubmit = (data) => {
if (data.username === 'testuser' && data.password === 'password123') {
setFormStatus({ success: true, error: '' });
} else {
setFormStatus({ success: false, error: 'Invalid username or password' });
}
};
Přidejte do komponenty tlačítka funkci obsluhy události onClick – předejte ji jako rekvizitu – pro spuštění funkce onSubmit, když uživatel klikne na tlačítko Odeslat.
onClick={handleSubmit(onSubmit)}
Hodnota stavové proměnné formStatus je důležitá, protože určuje, jak budete uživateli poskytovat zpětnou vazbu. Pokud uživatel zadá správné přihlašovací údaje, zobrazí se zpráva o úspěchu. V případě, že máte v aplikaci Next.js více stránek, můžete provést přesměrování na jinou stránku.
V případě neplatných přihlašovacích údajů je také potřeba poskytnout zpětnou vazbu. Material UI nabízí vizuálně atraktivní zpětnou vazbu, kterou lze kombinovat s technikou podmíněného vykreslování React pro informování uživatele na základě stavu formStatus.
Pro tento účel přidejte následující kód přímo pod otevírací značku StyledForm.
{formStatus.success ? (
<Alert severity="success">Form submitted successfully</Alert>
) : formStatus.error ? (
<Alert severity="error">{formStatus.error}</Alert>
) : null}
Nyní můžete použít funkci register pro registraci vstupních polí formuláře, sledování jejich hodnot a specifikaci validačních pravidel. To vám umožní efektivně zachytávat a validovat uživatelský vstup.
Tato funkce akceptuje několik argumentů, včetně názvu vstupního pole a objektu validačních parametrů. Tento objekt specifikuje validační pravidla pro dané vstupní pole, jako je vzor a minimální délka.
Následující kód vložte jako rekvizitu do komponenty uživatelského jména StyledTextField.
{...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'
},
})}
Nyní přidejte následující objekt jako rekvizitu do komponenty hesla StyledTextField.
{...register('password', {
required: 'Password required',
minLength: {
value: 8,
message: 'Password must be at least 8 characters'
},
})}
Přidejte následující kód pod vstupní pole uživatelského jména pro zobrazení vizuální zpětné vazby ohledně validačních požadavků.
Tento kód vygeneruje varovnou zprávu s chybou, která informuje uživatele o validačních požadavcích. Uživatel tak může opravit případné chyby před odesláním formuláře.
{errors.username && <Alert severity="error">{errors.username.message}</Alert>}
Nakonec vložte podobný kód přímo pod textové pole pro zadání hesla:
{errors.password && <Alert severity="error">{errors.password.message}</Alert>}
Výborně! S těmito změnami byste měli mít vizuálně přitažlivý a funkční formulář vytvořený s pomocí React Hook Form a Material UI.
Zlepšete svůj vývoj Next.js pomocí knihoven na straně klienta
Material UI a React Hook Form jsou pouze dva příklady z mnoha skvělých knihoven na straně klienta, které vám mohou pomoci urychlit vývoj frontendu v Next.js.
Knihovny na straně klienta nabízí řadu funkcí a předdefinovaných komponent, které jsou připravené pro produkční nasazení. S nimi můžete vytvářet kvalitnější frontendové aplikace rychleji a efektivněji.