Demos
Boolean example
Code Editor
<Form.Handler> <Flex.Stack> <Field.Boolean label="Show content" variant="buttons" path="/toggleValue" value={false} /> <Form.Visibility pathTrue="/toggleValue" animate> <TestElement>Item 1</TestElement> <TestElement>Item 2</TestElement> </Form.Visibility> </Flex.Stack> </Form.Handler>
Matching value
visibleWhen is pretty powerful. You can use it to show/hide based on the value of a path. You can also give it a hasValue function that gives you the current value, so you can assert it and return a boolean based on that.
<Form.VisibilityvisibleWhen={{path: '/toggleValue',hasValue: (value) => value === 'checked',}}>Content</Form.Visibility>
Code Editor
<Form.Handler> <Field.Toggle label="Show content" valueOn="checked" valueOff="unchecked" variant="buttons" path="/toggleValue" value="unchecked" /> <Form.Visibility visibleWhen={{ path: '/toggleValue', hasValue: 'checked', }} animate > <P>This is visible</P> </Form.Visibility> </Form.Handler>
Direct properties
This is visible
Code Editor
<Form.Visibility visible={true}> <P>This is visible</P> </Form.Visibility>
Based on DataContext
Code Editor
<Form.Handler data={{ toBe: true, notToBe: false, }} > <Form.Visibility pathTrue="/toBe"> <P>This will show, as long as `toBe` is true.</P> </Form.Visibility> <Form.Visibility pathTrue="/notToBe"> <P>This will not show until `notToBe` is true.</P> </Form.Visibility> </Form.Handler>
InferData
Code Editor
const MyComponent = () => { const { data } = Form.useData('example-form', { toggleValue: false, }) const inferDataFunc = React.useCallback( () => data.toggleValue, [data.toggleValue], ) return ( <Form.Handler id="example-form"> <Flex.Stack> <Field.Boolean path="/toggleValue" label="Check me" /> <Form.Visibility inferData={inferDataFunc} animate> <P>This is visible</P> </Form.Visibility> </Flex.Stack> </Form.Handler> ) } render(<MyComponent />)
Nested visibility example
Use fieldPropsWhenHidden and keepInDOM to keep the content in the DOM, even if it's not visible.
In this example we filter out all fields that have the data-exclude-field attribute. See the console output for the result.
Code Editor
const filterDataHandler = ({ props }) => !props['data-exclude-field'] const MyForm = () => { return ( <Form.Handler defaultData={{ isVisible: false, }} > <Flex.Stack> <Field.Boolean label="Visible" variant="button" path="/isVisible" data-exclude-field /> <Form.Visibility pathTrue="/isVisible" animate keepInDOM fieldPropsWhenHidden={{ 'data-exclude-field': true, }} > <Field.Selection label="Choose" variant="radio" value="less" path="/mySelection" > <Field.Option value="less" title="Less" /> <Field.Option value="more" title="More" /> </Field.Selection> <Form.Visibility visibleWhen={{ path: '/mySelection', hasValue: 'more', }} animate keepInDOM fieldPropsWhenHidden={{ 'data-exclude-field': true, }} > <Field.String label="My String" path="/myString" value="foo" /> </Form.Visibility> </Form.Visibility> </Flex.Stack> <Output /> </Form.Handler> ) } const Output = () => { const { filterData } = Form.useData() const filteredData = filterData(filterDataHandler) return <Tools.Log data={filteredData} top /> } render(<MyForm />)
Filter data
Note: This example uses filterData with pathDefined on a Visibility component along, which is a declarative way to describe the data to be shown.
Code Editor
const filterDataPaths = { '/isVisible': false, '/mySelection': ({ data }) => data.isVisible, '/myString': ({ data }) => { return data.isVisible && data.mySelection === 'more' }, } const MyForm = () => { return ( <Form.Handler defaultData={{ myString: 'foo', }} > <Flex.Stack> <Field.Boolean label="Visible" variant="button" path="/isVisible" defaultValue={false} /> <Form.Visibility pathTrue="/isVisible" animate> <Field.Selection label="Choose" variant="radio" value="less" path="/mySelection" > <Field.Option value="less" title="Less" /> <Field.Option value="more" title="More" /> </Field.Selection> <Form.Visibility visibleWhen={{ path: '/mySelection', hasValue: 'more', }} animate > <Field.String label="My String" path="/myString" /> </Form.Visibility> </Form.Visibility> <Form.Visibility pathDefined="/myString" filterData={filterDataPaths} animate > <Form.Card> <P> Result: <Value.String path="/myString" inline /> </P> </Form.Card> </Form.Visibility> </Flex.Stack> <Output /> </Form.Handler> ) } const Output = () => { const { filterData } = Form.useData() const filteredData = filterData(filterDataPaths) return <Tools.Log data={filteredData} top /> } render(<MyForm />)
Inherit visibility
Code Editor
<Form.Handler> <Form.Card> <Field.Boolean variant="button" path="/isVisible" defaultValue={true} /> <Form.Visibility pathTrue="/isVisible" animate> <Field.Name.First path="/foo" defaultValue="foo" /> <Field.Name.Last path="/bar" defaultValue="bar" /> </Form.Visibility> <Value.Provider inheritVisibility> <HeightAnimation> <Value.SummaryList> <Value.Name.First path="/foo" /> <Value.Name.First path="/bar" /> </Value.SummaryList> </HeightAnimation> </Value.Provider> </Form.Card> </Form.Handler>
Show children when field has no errors (validation)
Code Editor
<Form.Handler> <Form.Card> <Field.Name.First path="/foo" required /> <Form.Visibility visibleWhen={{ path: '/foo', isValid: true, }} animate > <Value.Name.First path="/foo" /> </Form.Visibility> </Form.Card> </Form.Handler>