← Wszystkie zadaniaReact · Senior

Zbędne rendery wierszy

Kod w edytorze działa, ale każde kliknięcie licznika renderuje ponownie wszystkie wiersze listy - można to sprawdzić przez onRowRender, który wiersz wywołuje przy każdym swoim renderze.

Spraw, żeby wiersz renderował się tylko wtedy, gdy zmienią się jego własne propsy: kliknięcie licznika nie może renderować wierszy, a usunięcie jednego wiersza - pozostałych. Nie zmieniaj znaczników ani tekstów.

Testy (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']);