← Усі задачіReact · Senior

Зайві рендери рядків

Код у редакторі працює, але кожне натискання лічильника перерендерює всі рядки списку - перевірити це допомагає onRowRender, який рядок викликає на кожному своєму рендері.

Зробіть так, щоб рядок рендерився лише тоді, коли змінилися його власні пропси: натискання лічильника не повинне рендерити рядки, а видалення одного рядка - решту. Розмітку й тексти не змінюйте.

Тести (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']);