Oberflächeninteraktion
Beherrschen Sie das Design von UI-Komponenten, Interaktionsmustern, responsives Design und Prinzipien der Benutzererfahrung, um hervorragende Benutzeroberflächen zu erstellen.
Verwenden Sie Sequential Thinking, um KI-gesteuerte Interaktionen mit Benutzeroberflächen zu lernen
Der Einsatz von KI in der Benutzeroberflächen-Interaktion umfasst mehrere Ebenen und verwendetMethoden des strukturierten DenkensKann Ihnen helfen, systematisch Folgendes zu beherrschen:
Design System
Ein Designsystem ist ein Satz wiederverwendbarer Designstandards und Komponentenbibliotheken, der die Konsistenz und Wartbarkeit des Produkts sicherstellt.
Design Tokens Design Tokens
Design Tokens sind die kleinste Einheit von Designentscheidungen, und CSS-Variablen verwalten Designelemente wie Farben, Abstände und Schriftarten zentral.
Farbsystem (OKLCH-Farbraum)
Mit dem OKLCH-Farbraum lassen sich Farbkontrast und Themenwechsel besser handhaben. Farbdefinitionen im Projekt:
:root {
--primary: oklch(0.7 0.15 200);
--background: oklch(0.09 0 0);
--foreground: oklch(0.98 0 0);
--border: oklch(0.25 0 0);
/* ... weitere Farbvariablen */
}Abstandssystem
Standard-Abstufung für Abstände in Tailwind (4px-Basis): 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64
Schriftsystem
System für abgerundete Ecken
Themensystem
Implementierung des Dark Mode
Verwenden next-themes Themenwechsel implementieren:
// app/layout.tsx
import { ThemeProvider } from '@/components/theme-provider'
export default function RootLayout({ children }) {
return (
<ThemeProvider
attribute="class"
defaultTheme="system"
enableSystem
disableTransitionOnChange
>
{children}
</ThemeProvider>
)
}Theme-Umschaltung mit CSS-Variablen
Bestanden .dark Themenvariablen für Klassenumschaltung:
.dark {
--background: oklch(0.09 0 0);
--foreground: oklch(0.98 0 0);
/* Alle Farbvariablen im Dunkelmodus */
}Komponentenarchitektur
Atomare Design-Methodik
Komponenten-Variantensystem (CVA)
Verwenden class-variance-authority Komponentenvarianten verwalten:
import { cva, type VariantProps } from 'class-variance-authority'
const buttonVariants = cva(
'inline-flex items-center justify-center rounded-md',
{
variants: {
variant: {
default: 'bg-primary text-primary-foreground',
destructive: 'bg-destructive text-destructive-foreground',
outline: 'border border-input',
},
size: {
default: 'h-10 px-4 py-2',
sm: 'h-9 rounded-md px-3',
lg: 'h-11 rounded-md px-8',
},
},
defaultVariants: {
variant: 'default',
size: 'default',
},
}
)Best Practices für KI in der Interaktion mit Benutzeroberflächen
KI nutzen, um die Effizienz der Frontend-UI-Entwicklung zu steigern, mit KI-gestützten Praktiken entlang des gesamten Prozesses – vom Komponentendesign bis zur Leistungsoptimierung.
KI-gestützte Komponentenentwicklung
KI verwenden, um Komponentencode zu generieren
Beschreiben Sie der KI die Anforderungen an die Komponente, und sie generiert eine vollständige React/Next.js-Komponente:
Prompt-Vorlage: Ich muss eine Benutzerkarten-Komponente mit den folgenden Funktionen erstellen: 1. Das Avatar, den Namen und die E-Mail des Benutzers anzeigen 2. Klicken zum Anzeigen von Details unterstützen 3. Tailwind-CSS-Styles verwenden 4. Dark Mode unterstützen 5. Responsives Design (Mobilgeräte und Desktop) 6. TypeScript verwenden 7. Den Designrichtlinien von shadcn/ui folgen Bitte generieren Sie den vollständigen Komponenten-Code, einschließlich: - Typdefinitionen - Props-Interface - Stilklassennamen - Responsive Breakpoints - Barrierefreiheitsattribute
Von KI generiertes Komponentenbeispiel
// components/user-card.tsx
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
import { Card, CardContent } from '@/components/ui/card'
interface UserCardProps {
name: string
email: string
avatar?: string
onClick?: () => void
}
export function UserCard({ name, email, avatar, onClick }: UserCardProps) {
const initials = name
.split(' ')
.map(n => n[0])
.join('')
.toUpperCase()
.slice(0, 2)
return (
<Card
className="cursor-pointer transition-shadow hover:shadow-md"
onClick={onClick}
role="button"
tabIndex={0}
onKeyDown={(e) => {
if (e.key === 'Enter' || e.key === ' ') {
onClick?.()
}
}}
>
<CardContent className="p-4 flex items-center gap-4">
<Avatar className="h-12 w-12">
<AvatarImage src={avatar} alt={name} />
<AvatarFallback>{initials}</AvatarFallback>
</Avatar>
<div className="flex-1 min-w-0">
<h3 className="font-semibold text-foreground truncate">{name}</h3>
<p className="text-sm text-muted-foreground truncate">{email}</p>
</div>
</CardContent>
</Card>
)
}KI-gestützte Stiloptimierung
Verwenden Sie KI, um Tailwind-CSS-Klassennamen zu optimieren und prägnantere, effizientere Styles zu erzeugen:
Prompt: Optimieren Sie die folgenden Tailwind-CSS-Klassennamen, um sie kürzer und effizienter zu machen: Aktueller Code: <div className="flex flex-row items-center justify-between p-4 m-2 bg-white dark:bg-gray-800 rounded-lg shadow-sm hover:shadow-md transition-shadow duration-200"> Bitte: 1. Doppelte Klassennamen zusammenführen 2. Eine knappere Schreibweise verwenden 3. Responsives Design und Dark-Mode-Unterstützung sicherstellen 4. Den gleichen visuellen Effekt beibehalten
Auswahl einer KI-gestützten Komponentenbibliothek
Prompt: Ich muss für ein Next.js 16 + TypeScript-Projekt eine Komponentenbibliothek auswählen. Die Anforderungen sind: 1. Unterstützung für den Dunkelmodus 2. Hohe Anpassbarkeit 3. Typsicherheit 4. Hervorragende Leistung 5. Eine aktive Community Bitte vergleichen Sie die folgenden Komponentenbibliotheken: - shadcn/ui - Material-UI (MUI) - Ant Design - Chakra UI Geben Sie eine Empfehlung mit Begründung und erklären Sie, wie sie in ein Next.js-Projekt integriert wird.
UI-Komponenten-Design
Die Komponentenisierung ist ein Kernkonzept der modernen Frontend-Entwicklung und baut komplexe Benutzeroberflächen durch die Kombination wiederverwendbarer Komponenten auf.
Detaillierte Tailwind-CSS-Konfiguration
Struktur der Konfigurationsdatei
// tailwind.config.ts
import type { Config } from 'tailwindcss'
const config: Config = {
content: [
'./app/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx}',
],
theme: {
extend: {
colors: {
background: 'var(--background)',
foreground: 'var(--foreground)',
// CSS-Variablen verwenden
},
borderRadius: {
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)',
},
},
},
plugins: [],
}
export default configBenutzerdefinierte Tool-Klasse
// Benutzerdefinierte Utility-Klassen in globals.css hinzufügen
@layer utilities {
.text-balance {
text-wrap: balance;
}
.scrollbar-hide {
-ms-overflow-style: none;
scrollbar-width: none;
}
.scrollbar-hide::-webkit-scrollbar {
display: none;
}
}Benutzerdefinierte responsive Breakpoints
// tailwind.config.ts
theme: {
screens: {
'xs': '475px',
'sm': '640px',
'md': '768px',
'lg': '1024px',
'xl': '1280px',
'2xl': '1536px',
},
}Dunkelmodus-Einstellungen
Verwenden dark: Präfix:
<div className="bg-white dark:bg-gray-900 text-gray-900 dark:text-white">
{/* Inhalt */}
</div>Vergleich und Auswahl von Komponentenbibliotheken
| Komponentenbibliothek | Eigenschaften | Anwendungsszenarien |
|---|---|---|
| shadcn/ui | Kopier- und einfügbar, vollständig kontrollierbar, basierend auf Radix UI | Stark angepasste Projekte, Next.js-Projekte |
| Material-UI | Umfangreiche Komponenten, vollständige Dokumentation, Material Design | Unternehmensanwendungen, schnelles Prototyping |
| Ant Design | Unternehmensfähige Komponenten, Backoffice-Anwendungen, chinesische Dokumentation | Middle-Tier-Systeme, Verwaltungsplattformen |
| Chakra UI | Kompakt, modular, TypeScript-Unterstützung | Moderne Webanwendungen, Projekte, die Flexibilität benötigen |
Interaktiver Modus
Gutes Interaktionsdesign macht die Bedienung für Nutzer reibungsloser und intuitiver. Beherrschen Sie Zustandsverwaltung, Formularverarbeitung und Animationstechniken.
Detaillierter Leitfaden zur Zustandsverwaltung
useState-Best Practices
// Verwende funktionale Updates, um Closure-Probleme zu vermeiden const [count, setCount] = useState(0) // Korrekt: funktionale Updates verwenden setCount(prev => prev + 1) // Vermeiden: direkt von state abhängig sein setCount(count + 1) // möglicherweise ungenau // Für komplexen Zustand useReducer verwenden const [state, dispatch] = useReducer(reducer, initialState)
Best Practices für die Formularverarbeitung
Beispiel für Formularvalidierung
// Vollständiges Beispiel einer Formular-Komponente
'use client'
import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import { z } from 'zod'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from '@/components/ui/form'
const formSchema = z.object({
username: z.string().min(2, 'Der Benutzername muss mindestens 2 Zeichen lang sein'),
email: z.string().email('Ungültige E-Mail-Adresse'),
})
export function UserForm() {
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
username: '',
email: '',
},
})
function onSubmit(values: z.infer<typeof formSchema>) {
console.log(values)
}
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
<FormField
control={form.control}
name="username"
render={({ field }) => (
<FormItem>
<FormLabel>Benutzername</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit">Senden</Button>
</form>
</Form>
)
}Optimierung der Formularleistung
- Verwenden
mode: 'onBlur'Die Anzahl der Validierungen reduzieren - Verwendung komplexer Formulare
useFieldArrayDynamische Felder verwalten - Verwendung für große Formulare
shouldUnregisterSpeicher optimieren
Benutzer-Feedback-System
Toast-Benachrichtigungen
import { toast } from 'sonner'
toast.success('Vorgang erfolgreich')
toast.error('Vorgang fehlgeschlagen')
toast.info('Hinweis')Ladezustand
// Skeleton-Ladevorgang <Skeleton className="h-4 w-[250px]" /> // Spinner <Loader2 className="h-4 w-4 animate-spin" />
Animationen und Übergänge
Tailwind-Animation
// tailwindcss-animate verwenden
<div className="animate-in fade-in slide-in-from-top-4">
{/* Inhalt */}
</div>
// Häufig verwendete Animationsklassen
animate-in // Eingangsanimation
animate-out // Ausgangsanimation
fade-in // Einblenden
slide-in-from-top // Von oben hereinrutschen
duration-300 // DauerLeistungsaspekte
- Verwenden
transformundopacityGPU-Beschleunigung auslösen - Animationen vermeiden
width、heightEigenschaften wie - Verwenden
will-changeTipps zur Browser-Optimierung
Responsives Design
Stellen Sie sicher, dass die Benutzeroberfläche auf verschiedenen Geräten eine gute Nutzererfahrung bietet. Verfolgen Sie eine Mobile-First-Strategie und verwenden Sie flexible Layout-Techniken.
Mobile-First-Strategie
Prinzipien des mobilen Designs
- Zuerst für Mobilgeräte entwerfen, dann das Desktop-Erlebnis schrittweise verbessern
- Die Interaktionen auf Mobilgeräten vereinfachen und die Anzahl der Schritte reduzieren
- Touch-Zielgröße optimieren (mindestens 44x44px)
- Mobile Inhalte reduzieren und die Kernfunktionen hervorheben
Mobile Navigationsmuster
Layout-Techniken
Fortgeschrittene Flexbox-Anwendungen
// Responsives Flexbox
<div className="flex flex-col md:flex-row gap-4">
<div className="flex-1">Inhalt 1</div>
<div className="flex-1">Inhalt 2</div>
</div>
// Ausrichtung
<div className="flex items-center justify-between">
{/* Vertikal zentriert, horizontal mit Abstand zwischen den Elementen */}
</div>Breakpoint-Strategie
// Best Practices für Breakpoints
// Mobile-First: Standardstile gelten für Mobilgeräte
<div className="text-sm md:text-base lg:text-lg">
{/* Von kleinen zu großen Bildschirmen schrittweise verbessern */}
</div>
// Vermeiden: Desktop-First (nicht empfohlen)
<div className="text-lg md:text-base sm:text-sm">
{/* Dies erhöht die Belastung für Mobilgeräte */}
</div>Mobile Optimierung
Viewport-Konfiguration
// app/layout.tsx
export const metadata = {
viewport: {
width: 'device-width',
initialScale: 1,
maximumScale: 5,
},
}Verarbeitung von Touch-Ereignissen
- Verwenden
touch-actionTouch-Reaktion optimieren - Vermeiden
hoverZustand durch unbeabsichtigte Berührungen auf dem Mobilgerät - Verwenden
@media (hover: hover)Erkennen, ob das Gerät Hover unterstützt
Barrierefreiheit
Barrierefreiheit stellt sicher, dass alle Nutzer deine App verwenden können, einschließlich Nutzer, die auf Hilfstechnologien angewiesen sind. Die Einhaltung der WCAG-Standards macht das Produkt inklusiver.
WCAG-Standard
WCAG-2.1-Stufe
Zentrale Prinzipien (POUR)
Tastaturnavigation
Verwaltung der Tab-Reihenfolge
// Verwenden Sie tabIndex, um die Tab-Reihenfolge zu steuern
<button tabIndex={1}>Erster</button>
<button tabIndex={2}>Zweiter</button>
// Nicht interaktive Elemente überspringen
<div tabIndex={-1}>Dieses Element überspringen</div>
// Aus der Tab-Reihenfolge entfernen (nicht empfohlen, außer wenn nötig)
<button tabIndex={-1}>Über Tab nicht erreichbar</button>Fokusverwaltung
// Fokusfalle (Focus Trap) - in Modals verwendet
import { FocusTrap } from '@radix-ui/react-focus-trap'
<FocusTrap>
<Dialog>
{/* Der Fokus ist auf den Dialog beschränkt */}
</Dialog>
</FocusTrap>
// Fokus-sichtbare Stile
<button className="focus-visible:ring-2 focus-visible:ring-primary">
{/* Fokus-Ring bei Tastaturnavigation anzeigen */}
</button>Unterstützung für Tastenkürzel
- Eingabe/Leertaste: Schaltfläche oder Link aktivieren
- Esc: Modal oder Menü schließen
- Arrow Keys: Liste oder Menüpunkte navigieren
- Tab: Zwischen fokussierbaren Elementen wechseln
Unterstützung für Bildschirmleseprogramme
Verwendung von ARIA-Labels
// aria-label: gibt einem Element eine Beschriftung
<button aria-label="Dialog schließen">
<X />
</button>
// aria-labelledby: verweist auf die ID eines anderen Elements
<div aria-labelledby="dialog-title">
<h2 id="dialog-title">Dialogtitel</h2>
</div>
// aria-describedby: bietet eine zusätzliche Beschreibung
<input
aria-describedby="email-help"
aria-invalid={hasError}
/>
<span id="email-help">Bitte geben Sie eine gültige E-Mail-Adresse ein</span>Semantisches HTML
// Semantische Tags verwenden
<nav>Navigation</nav>
<main>Hauptinhalt</main>
<article>Artikel</article>
<section>Abschnitt</section>
<aside>Seitenleiste</aside>
<header>Kopfbereich</header>
<footer>Fußzeile</footer>
// Vermeiden: div anstelle semantischer Tags verwenden
<div className="nav"> {/* Nicht empfohlen */}
<nav> {/* Empfohlen */}Rollenbeschreibung
// Verwenden Sie das role-Attribut (wenn semantische Tags nicht verfügbar sind)
<div role="button" tabIndex={0} onClick={handleClick}>
Benutzerdefinierte Schaltfläche
</div>
<div role="alert" aria-live="polite">
Wichtiger Hinweis
</div>
<div role="dialog" aria-modal="true" aria-labelledby="dialog-title">
{/* Modaler Dialog */}
</div>Farbkontrast
WCAG-AA-Standard
Werkzeugprüfung
- WebAIM Contrast Checker: Online-Tool zur Kontrastprüfung
- Lighthouse: In Chrome DevTools integriert
- axe DevTools: Browser-Erweiterung
Verlassen Sie sich nicht auf Farbe, um Informationen zu vermitteln
// Fehler: Status nur mit Farbe anzeigen <span className="text-red-500">Fehler</span> // Korrekt: Farbe + Symbol/Text <span className="text-red-500 flex items-center gap-1"> <AlertCircle /> Fehler: Bitte geben Sie einen gültigen Wert ein </span>
Barrierefreiheitstests
Automatisierte Testtools
Manueller Testablauf
- Die gesamte Anwendung nur mit der Tastatur steuern
- Mit Screenreadern testen (NVDA, JAWS, VoiceOver)
- Den Farbkontrast überprüfen
- Sicherstellen, dass alle Bilder einen Alt-Text haben
- Fehlermeldung des Testformulars
Tastatur-Test-Checkliste
- Alle interaktiven Elemente sind per Tab erreichbar
- Die Logik der Fokusreihenfolge ist plausibel
- Fokus sichtbar (mit Fokusring)
- Das Dialogfenster kann mit Esc geschlossen werden
- Das Menü kann mit den Pfeiltasten navigiert werden
Leistungsoptimierung
Die Leistung wirkt sich direkt auf die Benutzererfahrung aus. Optimieren Sie die Renderleistung, das Laden von Ressourcen und die Laufzeitleistung, damit die Anwendung schnell reagiert.
Render-Leistung
React-Rendering-Optimierung
// memo verwenden, um unnötige Neurenders zu vermeiden
const ExpensiveComponent = React.memo(({ data }) => {
return <div>{/* komplexes Rendering */}</div>
})
// useMemo verwenden, um berechnete Ergebnisse zu cachen
const expensiveValue = useMemo(() => {
return computeExpensiveValue(a, b)
}, [a, b])
// useCallback verwenden, um Funktionen zu cachen
const handleClick = useCallback(() => {
doSomething(id)
}, [id])Virtuelles Scrollen
Bei großen Listen verwenden Sie virtuelles Scrollen, um nur sichtbare Elemente zu rendern:
// Verwenden Sie react-window oder react-virtualized
import { FixedSizeList } from 'react-window'
<FixedSizeList
height={600}
itemCount={10000}
itemSize={50}
width="100%"
>
{Row}
</FixedSizeList>Code-Splitting
// Komponente dynamisch importieren
import dynamic from 'next/dynamic'
const HeavyComponent = dynamic(() => import('./HeavyComponent'), {
loading: () => <Skeleton />,
ssr: false, // falls Sie SSR deaktivieren müssen
})
// Code-Splitting auf Routenebene (von Next.js automatisch gehandhabt)
// app/dashboard/page.tsx wird automatisch aufgeteiltRessourcenoptimierung
Bildoptimierung
// Automatische Optimierung durch die Next.js Image-Komponente
import Image from 'next/image'
<Image
src="/hero.jpg"
alt="Hero"
width={1200}
height={600}
priority // Bild im sichtbaren Bereich
loading="lazy" // Bild außerhalb des sichtbaren Bereichs
placeholder="blur" // unscharfer Platzhalter
/>
// Unterstützt moderne Formate wie WebP und AVIF
// Generiert automatisch responsive BilderSchriftoptimierung
// Use next/font to optimize fonts
import { GeistSans } from 'next/font/google'
const geistSans = GeistSans({
subsets: ['latin'],
display: 'swap', // Font loading strategy
preload: true,
})
// Font subsetting, load only the required charactersRessourcen-Vorabladung
// Drittanbieter-Domain vorverbinden <link rel="preconnect" href="https://fonts.googleapis.com" /> // Wichtige Ressourcen vorladen <link rel="preload" href="/fonts/geist.woff2" as="font" /> // Ressourcen für die nächste Seite vorab abrufen <link rel="prefetch" href="/dashboard" />
Laufzeitleistung
Optimierung der Bundle-Größe
- Verwenden
bundle analyzerBundle-Größe analysieren - Bibliotheken nach Bedarf importieren (
import { debounce } from 'lodash-es') - Nicht verwendete Abhängigkeiten entfernen
Tree Shaking
Next.js und moderne Build-Tools führen Tree Shaking automatisch durch und entfernen nicht verwendeten Code.
Leistungsüberwachung
Core Web Vitals
Leistungsanalysetools
- React DevTools Profiler: die Rendering-Performance von Komponenten analysieren
- Lighthouse: Leistungsprüfung von Chrome DevTools
- Web Vitals Extension: Echtzeitüberwachung der Core Web Vitals
Praxisbeispiele
Lernen Sie anhand praktischer Codebeispiele, wie hochwertige UI-Komponenten und Interaktionen erstellt werden.
Vollständiges Beispiel einer Formular-Komponente
'use client'
import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import { z } from 'zod'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from '@/components/ui/form'
import { toast } from 'sonner'
const formSchema = z.object({
name: z.string().min(2, 'Der Name muss mindestens 2 Zeichen haben'),
email: z.string().email('Ungültige E-Mail-Adresse'),
age: z.number().min(18, 'Das Alter muss größer als 18 sein').max(100),
})
export function UserForm() {
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
name: '',
email: '',
age: 18,
},
})
async function onSubmit(values: z.infer<typeof formSchema>) {
try {
await saveUser(values)
toast.success('Benutzer erfolgreich erstellt')
form.reset()
} catch (error) {
toast.error('Erstellung fehlgeschlagen, bitte erneut versuchen')
}
}
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
<FormField
control={form.control}
name="name"
render={({ field }) => (
<FormItem>
<FormLabel>Name</FormLabel>
<FormControl>
<Input placeholder="Bitte geben Sie Ihren Namen ein" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit" disabled={form.formState.isSubmitting}>
{form.formState.isSubmitting ? 'Wird gesendet...' : 'Senden'}
</Button>
</form>
</Form>
)
}Lernergebnisse
Nach Abschluss dieses Kapitels werden Sie:
- 1Die Grundlagen von Designsystemen verstehen und Design Tokens, Themesysteme sowie die Komponentenarchitektur beherrschen
- 2Sicher im Umgang mit Tailwind CSS und shadcn/ui, in der Lage, Komponentenbibliotheken zu konfigurieren und anzupassen
- 3Beherrschen Sie State Management, Formularverarbeitung und Animationstechniken, um ein reibungsloses interaktives Erlebnis zu schaffen
- 4Beherrschen Sie Methoden des responsiven Designs und verwenden Sie eine Mobile-First-Strategie sowie moderne Layout-Techniken
- 5Die Barrierefreiheitsstandards (WCAG) verstehen und Tastaturnavigation sowie Unterstützung für Bildschirmleser umsetzen können
- 6Beherrschen Sie Techniken zur Leistungsoptimierung, einschließlich Renderoptimierung, Ressourcenladen und Leistungsüberwachung
- 7Kann vollständige Formularkomponenten, responsive Layouts und interaktive Funktionen erstellen