← Усі задачіReact · Senior
Undo і redo
Напишіть хук useHistory(initial) - стан з історією змін. Він повертає { value, set, undo, redo, canUndo, canRedo }.
set(v) робить v поточним значенням і запам'ятовує попереднє. undo() повертає попереднє значення, redo() - скасоване. Новий set після undo стирає гілку для redo. undo і redo без історії нічого не роблять. Кілька set поспіль в одному обробнику мають записатися всі.
Ctrl+Enter - запустити тести. Tab - відступ; щоб вийти з редактора клавіатурою, натисніть Esc, а потім Tab. Код зберігається в цьому браузері.
Тести (6)
const { result } = renderHook(() => useHistory('a')); expect(result.current.value).toBe('a'); expect(result.current.canUndo).toBe(false); expect(result.current.canRedo).toBe(false);
const { result } = renderHook(() => useHistory(0)); act(() => result.current.set(1)); act(() => result.current.set(2)); act(() => result.current.undo()); expect(result.current.value).toBe(1); act(() => result.current.undo()); expect(result.current.value).toBe(0); expect(result.current.canUndo).toBe(false);
const { result } = renderHook(() => useHistory(0)); act(() => result.current.set(1)); act(() => result.current.undo()); expect(result.current.canRedo).toBe(true); act(() => result.current.redo()); expect(result.current.value).toBe(1); expect(result.current.canRedo).toBe(false);
const { result } = renderHook(() => useHistory(0)); act(() => result.current.set(1)); act(() => result.current.set(2)); act(() => result.current.undo()); act(() => result.current.set(3)); expect(result.current.value).toBe(3); expect(result.current.canRedo).toBe(false); act(() => result.current.undo()); expect(result.current.value).toBe(1);
const { result } = renderHook(() => useHistory('x')); act(() => result.current.undo()); act(() => result.current.redo()); expect(result.current.value).toBe('x');
const { result } = renderHook(() => useHistory(0)); act(() => { result.current.set(1); result.current.set(2); }); act(() => result.current.undo()); expect(result.current.value).toBe(1);