--- tags: zeta-dom-react --- # Accessing form data Field data is accessible by `form.data` property. When using TypeScript, it can be benefited by specifying type argument for data shape: ```typescript interface LoginData { username: string; password: string; } function Login() { const form = useFormContext<LoginData>(); const onClick = () => { // access field values through `form.data` login( form.data.username, form.data.password); }; return ( <Form context={form}> <TextField name="username" required={true} label="Username" /> <TextField name="password" required={true} type="password" label="Password" /> <Button label="Login" onClick={onClick} /> </Form> ); } ``` ## Effects on field update Every time field value is updated, either programmatically or by user actions, re-rendering is triggered. In the following example, the paragraph will always show the entered text: ```typescript function Component() { const form = useFormContext(); return ( <Form context={form}> {/* print current value */} <p>Value is {form.data.item || ''}</p> <TextField name="item" /> </Form> ); } ``` The standard `useEffect` hook will work on form data: ```typescript function Component() { const form = useFormContext(); useEffect(() => { // do stuff when text field updates }, [form.data.item]); return ( <Form context={form}> <TextField name="item" /> </Form> ); } ``` The `FormContext` object also provides `dataChange` event if you needs logic depending on which fields were updated: ```typescript function Component() { const form = useFormContext(); useEffect(() => { return form.on('dataChange', e => { // print out which fields were changed console.log(e.data); }); }, []); return ( <Form context={form}> <TextField name="item1" /> <TextField name="item2" /> <TextField name="item3" /> </Form> ); } ``` ## Updating field Field values can be updated on `form.data` and they will be reflected on the rendered control: ```typescript function Component() { const form = useFormContext(); return ( <Form context={form}> <TextField name="item" /> {/* clicking the button will fill text field with "foo" */} <button onClick={() => form.data.item = 'foo'} /> </Form> ); } ```