react-16-dropdown
Version:
A zero-dependency, lightweight and fully customizable dropdown (not select) for React.
153 lines (143 loc) • 4.47 kB
JavaScript
import React from 'react';
import Dropdown from 'react-16-dropdown';
export default function Customization() {
const options = [{
label: 'Inception',
value: 'inception',
}, {
label: 'Prestige',
value: 'prestige',
}];
const colorOptions = [{
label: 'Primary',
value: 'primary',
}, {
label: 'Success',
value: 'success',
}, {
label: 'Danger',
value: 'danger',
}];
return (
<section className='bg-light py-4'>
<div className='container'>
<h2>Customization</h2>
<p>
You can customize the dropdown to suit your needs. There are three
options to do this:
</p>
<ul>
<li>
Append styles to existing classes - <code>trigger</code>,
<code>menu</code> and <code>option</code>
</li>
<li>Use your own renderers</li>
<li>Replace default components with your own custom components</li>
</ul>
<h4>Using renderers</h4>
<p>
In most cases using custom renderers should suffice. You just have
pass a presentational component in <code>triggerRenderer</code>,
<code>menuRenderer</code> or <code>optionRenderer</code>.
These components will receive basic props.
</p>
<div className='my-4'>
<Dropdown
options={options}
triggerRenderer={() => <button className='btn btn-success'>Trigger renderer</button>}
onClick={e => console.log(e)}
/>
<Dropdown
options={colorOptions}
triggerRenderer={() => <button className='btn btn-dark ml-2'>Option renderer</button>}
optionRenderer={props => <div className={`option option--${props.value}`}>{props.label}</div>}
onClick={e => console.log(e)}
/>
</div>
<pre>
<code className='language-jsx'>
{
`// Custom trigger renderer
<Dropdown
options={[ ... ]}
triggerRenderer={() => <button className='btn btn-success'>Trigger renderer</button>}
onClick={e => console.log(e)}
/>
// Custom option renderer
<Dropdown
options={colorOptions}
triggerRenderer={() => <button className='btn btn-dark ml-2'>Option renderer</button>}
optionRenderer={props => <div className={\`option option--\${props.value}\`}>{props.label}</div>}
onClick={e => console.log(e)}
/>`
}
</code>
</pre>
<h4 className='mt-4'>Replacing components</h4>
<p>
In some cases, you might want to replace the default components. The component
will be passed all props (including refs and event handlers). You should apply
the appropriate props for correct functionality.
</p>
<div className='my-4'>
<Dropdown
options={options}
triggerComponent={props => (
<a className='btn btn-outline-info' ref={props.triggerRef} onClick={props.onClick} onKeyDown={props.onKeyDown}>
Custom link component
</a>
)}
onClick={e => console.log(e)}
/>
<Dropdown
className='custom-option'
options={colorOptions}
triggerLabel='Custom option component'
optionComponent={props => (
<div
className={`option ${props.focused ? 'focused' : ''}`}
ref={props.optionRef}
onClick={props.onClick}
>
{props.data.label}
</div>
)}
onClick={e => console.log(e)}
/>
</div>
<pre>
<code className='language-jsx'>
{
`// Custom trigger component
<Dropdown
options={options}
triggerComponent={props => (
<a className='btn btn-outline-info' ref={props.triggerRef} onClick={props.onClick} onKeyDown={props.onKeyDown}>
Custom link component
</a>
)}
onClick={e => console.log(e)}
/>
// Custom option component
<Dropdown
className='custom-option'
options={colorOptions}
triggerLabel='Custom option component'
optionComponent={props => (
<div
className={\`option \${props.focused ? 'focused' : ''}\`}
ref={props.optionRef}
onClick={props.onClick}
>
{props.label}
</div>
)}
onClick={e => console.log(e)}
/>`
}
</code>
</pre>
</div>
</section>
);
}