wix-style-react
Version:
wix-style-react
78 lines (54 loc) • 3.4 kB
Markdown
# `<DropdownBase/>`
> A common dropdown mechanism using the Popover component
## Acceptable `children`
The `<DropdownBase/>` can accept two types of children:
* A regular React node, which will be rendered as-is.
* A function which returns a React node (a "render prop"). The function can accept a single
arguments whose value is an object with the following properties:
| Name | Type | Description |
| ---- | ---- | ----------- |
| `open(e)` | `Function` | A function that will open the items list. Can be called only when in "Uncontrolled" mode. |
| `close(e)` | `Function` | A function that will close the items list. Can be called only when in "Uncontrolled" mode. |
| `toggle(e)` | `Function` | A function that will toggle the items list. Can be called only when in "Uncontrolled" mode. |
| `delegateKeyDown(e)` | `Function` | The underlaying `<DropdownLayout/>`'s `keydown` handler. It can be called inside another `keydown` event in order to delegate it (can be useful when using the "Controlled" mode). |
| `selectedOption` | `{ id: any, value: any }`, `null` | The value of the selected option. |
**Note:** When calling a trigger function, make sure to provide the event to it in order to have the
best behaviour.
## Opening modes
You can use the `<DropdownBase/>`'s opening mechanism in 2 modes.
### Uncontrolled opening mode
In this mode you have access to the opening triggers, however the `<DropdownBase/>` component
still manage the visibility state of the items list by itself. You can access the triggers using a
render prop. For example, to create a basic dropdown that triggers on hover:
```jsx
<DropdownBase>
{({ open, close, selectedOption }) => (
<Button onMouseEnter={open} onMouseLeave={close}>
{selectedOption ? `Selected item is ${selectedOption.value}` : 'Hove me'}
</Button>
)}
</DropdownBase>
```
In this mode, the `<DropdownBase/>` component will also handle the following:
* Keyboard navigation (opening the list with certain keys, navigating the list using the arrow keys,
option selection)
* Closing the list when clicking outside of the component
* Closing the list when an option is selected
### Controlled opening mode
In this mode, it's up to you to decide when the list should be opened. You can control it using the
`open` prop. Note that you'll also need to manage keyboard navigation by yourself (the
`delegateKeyDown` function may be useful). Check the examples in "Usage" tab.
## Selection behaviour
You can use the `<DropdownBase/>`'s selection behaviour in 2 modes.
### Uncontrolled selection behaviour
In this mode, the `<DropdownBase/>` component will manage it's own state of the currently
selected option. You can retreive the selected option in the render prop (via the `selectedOption`
property described above) using the `onSelect` callback prop. If you'd like to set an initially
selected option, use the `initialSelectedId` prop.
### Controlled selection behaviour
In this mode, the `<DropdownBase/>` component will update the selected option according to the
`selectedId` prop. In order to use this mode, you should pass both the `selectedId` and the
`onSelect` props, otherwise the uncontrolled behaviour will be used.
You'd typically want to update you own state of `selectedId` in the `onSelect` callback, then pass
this `selectedId` as a prop to the `<DropdownBase/>`.
----