← Усі задачіReact · Senior
Зайві рендери рядків
Код у редакторі працює, але кожне натискання лічильника перерендерює всі рядки списку - перевірити це допомагає onRowRender, який рядок викликає на кожному своєму рендері.
Зробіть так, щоб рядок рендерився лише тоді, коли змінилися його власні пропси: натискання лічильника не повинне рендерити рядки, а видалення одного рядка - решту. Розмітку й тексти не змінюйте.
Ctrl+Enter - запустити тести. Tab - відступ; щоб вийти з редактора клавіатурою, натисніть Esc, а потім Tab. Код зберігається в цьому браузері.
Тести (4)
const onRowRender = fn(); render(<App onRowRender={onRowRender} />); expect(onRowRender).toHaveBeenCalledTimes(3);
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);
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);
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']);