← Alle AufgabenReact · Middle

Design mit Context

Schreib einen ThemeProvider und einen Hook useTheme. Der Provider speichert das Design, "light" (Standard) oder "dark", und stellt es jeder Komponente darin bereit. useTheme() liefert { theme, toggleTheme }, wobei toggleTheme das Design umschaltet.

Alle Komponenten unter einem Provider sehen dasselbe Design. Ein Aufruf von useTheme außerhalb des Providers muss einen Fehler werfen, dessen Meldung ThemeProvider enthält.

Tests (3)

  1. function Probe() {
      const { theme, toggleTheme } = useTheme();
      return <button onClick={toggleTheme}>{theme}</button>;
    }
    render(<ThemeProvider><Probe /></ThemeProvider>);
    expect(screen.getByRole('button').textContent).toBe('light');
    fireEvent.click(screen.getByRole('button'));
    expect(screen.getByRole('button').textContent).toBe('dark');
    fireEvent.click(screen.getByRole('button'));
    expect(screen.getByRole('button').textContent).toBe('light');
  2. function Probe() {
      const { theme, toggleTheme } = useTheme();
      return <button onClick={toggleTheme}>{theme}</button>;
    }
    render(<ThemeProvider><Probe /><Probe /></ThemeProvider>);
    fireEvent.click(screen.getAllByRole('button')[0]);
    expect(screen.getAllByRole('button').map((b) => b.textContent)).toEqual(['dark', 'dark']);
  3. expect(() => renderHook(() => useTheme())).toThrow('ThemeProvider');