← 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.
Ctrl+Enter uruchamia testy. Tab robi wcięcie; aby wyjść z edytora klawiaturą, naciśnij Esc, a potem Tab. Kod zapisuje się w tej przeglądarce.
Testy (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']);