Demos
Undo / Redo
Code Editor
const MyComponent = () => { const { createSnapshot, applySnapshot } = Form.useSnapshot() const pointerRef = React.useRef(0) React.useEffect(() => { createSnapshot(pointerRef.current, 'my-snapshot-slice') }, [createSnapshot]) const changeHandler = React.useCallback(() => { pointerRef.current += 1 createSnapshot(pointerRef.current, 'my-snapshot-slice') }, [createSnapshot]) const undoHandler = React.useCallback(() => { pointerRef.current -= 1 applySnapshot(pointerRef.current, 'my-snapshot-slice') }, [applySnapshot]) const redoHandler = React.useCallback(() => { pointerRef.current += 1 applySnapshot(pointerRef.current, 'my-snapshot-slice') }, [applySnapshot]) return ( <> <Form.Card> <Form.Snapshot name="my-snapshot-slice"> <Field.String path="/foo" label="Will be reverted" onChange={changeHandler} /> </Form.Snapshot> <Field.String path="/bar" label="Will stay" /> </Form.Card> <Form.ButtonRow> <Button variant="secondary" onClick={undoHandler}> Undo </Button> <Button variant="secondary" onClick={redoHandler}> Redo </Button> </Form.ButtonRow> <Tools.Log top /> </> ) } render( <Form.Handler> <MyComponent /> </Form.Handler>, )
Used in a Wizard
This example reverts the form data to its previous state when the user navigates back to a previous step.
Code Editor
const MyForm = () => { const { createSnapshot, revertSnapshot } = Form.useSnapshot('my-form') return ( <Form.Handler id="my-form"> <Wizard.Container onStepChange={(index, mode, args) => { if (mode === 'previous') { revertSnapshot(String(args.id), 'my-snapshot-slice') } else { createSnapshot(args.previousStep.id, 'my-snapshot-slice') } }} > <Wizard.Step title="Step A" id="step-a"> <Form.Snapshot name="my-snapshot-slice"> <Field.String path="/foo" label="Will be reverted" /> </Form.Snapshot> <Field.String path="/bar" label="Will stay" /> <Wizard.Buttons /> </Wizard.Step> <Wizard.Step title="Step B" id="step-b"> <Field.String path="/foo" label="Will be reverted" /> <Field.String path="/bar" label="Will stay" /> <Wizard.Buttons /> </Wizard.Step> </Wizard.Container> </Form.Handler> ) } render(<MyForm />)