← Alle AufgabenReact · Senior

Unnötige Renders von Zeilen

Der Code im Editor funktioniert, aber jeder Klick auf den Zähler rendert jede Zeile der Liste neu: das lässt sich mit onRowRender prüfen, das eine Zeile bei jedem ihrer Renders aufruft.

Sorge dafür, dass eine Zeile nur rendert, wenn sich ihre eigenen Props ändern: ein Klick auf den Zähler darf die Zeilen nicht rendern, und das Entfernen einer Zeile darf die anderen nicht rendern. Markup und Texte bleiben unverändert.

Tests (4)

  1. const onRowRender = fn();
    render(<App onRowRender={onRowRender} />);
    expect(onRowRender).toHaveBeenCalledTimes(3);
  2. const onRowRender = fn();
    render(<App onRowRender={onRowRender} />);
    fireEvent.click(screen.getByRole('button', { name: 'Clicked 0' }));
    fireEvent.click(screen.getByRole('button', { name: 'Clicked 1' }));
    expect(screen.getByRole('button', { name: 'Clicked 2' })).toBeTruthy();
    expect(onRowRender).toHaveBeenCalledTimes(3);
  3. const onRowRender = fn();
    render(<App onRowRender={onRowRender} />);
    fireEvent.click(screen.getByRole('button', { name: 'Remove b' }));
    expect(screen.getAllByTestId('row').map((row) => row.firstChild.textContent)).toEqual(['a', 'c']);
    expect(onRowRender).toHaveBeenCalledTimes(3);
  4. const onRowRender = fn();
    render(<App onRowRender={onRowRender} />);
    fireEvent.click(screen.getByRole('button', { name: 'Remove a' }));
    fireEvent.click(screen.getByRole('button', { name: 'Remove c' }));
    expect(screen.getAllByTestId('row').map((row) => row.firstChild.textContent)).toEqual(['b']);