You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
6.5 KiB
169 lines
6.5 KiB
3 years ago
|
[](https://www.npmjs.com/package/react-select)
|
||
|
[](https://circleci.com/gh/JedWatson/react-select/tree/master)
|
||
|
[](https://coveralls.io/github/JedWatson/react-select?branch=master)
|
||
|
[](http://thinkmill.com.au/?utm_source=github&utm_medium=badge&utm_campaign=react-select)
|
||
|
|
||
|
# React-Select
|
||
|
|
||
|
The Select control for [React](https://reactjs.com). Initially built for use in [KeystoneJS](http://www.keystonejs.com).
|
||
|
|
||
|
See [react-select.com](https://www.react-select.com) for live demos and comprehensive docs.
|
||
|
|
||
|
React Select is funded by [Thinkmill](https://www.thinkmill.com.au) and [Atlassian](https://atlaskit.atlassian.com). It represents a whole new approach to developing powerful React.js components that _just work_ out of the box, while being extremely customisable.
|
||
|
|
||
|
For the story behind this component, watch Jed's talk at React Conf 2019 - [building React Select](https://youtu.be/yS0jUnmBujE)
|
||
|
|
||
|
Features include:
|
||
|
|
||
|
- Flexible approach to data, with customisable functions
|
||
|
- Extensible styling API with [emotion](https://emotion.sh)
|
||
|
- Component Injection API for complete control over the UI behaviour
|
||
|
- Controllable state props and modular architecture
|
||
|
- Long-requested features like option groups, portal support, animation, and more
|
||
|
|
||
|
## Using an older version?
|
||
|
|
||
|
- [v3, v4, and v5 upgrade guide](https://react-select.com/upgrade)
|
||
|
- [v2 upgrade guide](https://react-select.com/upgrade-to-v2)
|
||
|
- React Select v1 documentation and examples are available at [v1.react-select.com](https://v1.react-select.com)
|
||
|
|
||
|
# Installation and usage
|
||
|
|
||
|
The easiest way to use react-select is to install it from npm and build it into your app with Webpack.
|
||
|
|
||
|
```
|
||
|
yarn add react-select
|
||
|
```
|
||
|
|
||
|
Then use it in your app:
|
||
|
|
||
|
#### With React Component
|
||
|
|
||
|
```js
|
||
|
import React from 'react';
|
||
|
import Select from 'react-select';
|
||
|
|
||
|
const options = [
|
||
|
{ value: 'chocolate', label: 'Chocolate' },
|
||
|
{ value: 'strawberry', label: 'Strawberry' },
|
||
|
{ value: 'vanilla', label: 'Vanilla' },
|
||
|
];
|
||
|
|
||
|
class App extends React.Component {
|
||
|
state = {
|
||
|
selectedOption: null,
|
||
|
};
|
||
|
handleChange = (selectedOption) => {
|
||
|
this.setState({ selectedOption }, () =>
|
||
|
console.log(`Option selected:`, this.state.selectedOption)
|
||
|
);
|
||
|
};
|
||
|
render() {
|
||
|
const { selectedOption } = this.state;
|
||
|
|
||
|
return (
|
||
|
<Select
|
||
|
value={selectedOption}
|
||
|
onChange={this.handleChange}
|
||
|
options={options}
|
||
|
/>
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
#### With React Hooks
|
||
|
|
||
|
```js
|
||
|
import React, { useState } from 'react';
|
||
|
import Select from 'react-select';
|
||
|
|
||
|
const options = [
|
||
|
{ value: 'chocolate', label: 'Chocolate' },
|
||
|
{ value: 'strawberry', label: 'Strawberry' },
|
||
|
{ value: 'vanilla', label: 'Vanilla' },
|
||
|
];
|
||
|
|
||
|
export default function App() {
|
||
|
const [selectedOption, setSelectedOption] = useState(null);
|
||
|
|
||
|
return (
|
||
|
<div className="App">
|
||
|
<Select
|
||
|
defaultValue={selectedOption}
|
||
|
onChange={setSelectedOption}
|
||
|
options={options}
|
||
|
/>
|
||
|
</div>
|
||
|
);
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Props
|
||
|
|
||
|
Common props you may want to specify include:
|
||
|
|
||
|
- `autoFocus` - focus the control when it mounts
|
||
|
- `className` - apply a className to the control
|
||
|
- `classNamePrefix` - apply classNames to inner elements with the given prefix
|
||
|
- `isDisabled` - disable the control
|
||
|
- `isMulti` - allow the user to select multiple values
|
||
|
- `isSearchable` - allow the user to search for matching options
|
||
|
- `name` - generate an HTML input with this name, containing the current value
|
||
|
- `onChange` - subscribe to change events
|
||
|
- `options` - specify the options the user can select from
|
||
|
- `placeholder` - change the text displayed when no option is selected
|
||
|
- `noOptionsMessage` - ({ inputValue: string }) => string | null - Text to display when there are no options
|
||
|
- `value` - control the current value
|
||
|
|
||
|
See the [props documentation](https://www.react-select.com/props) for complete documentation on the props react-select supports.
|
||
|
|
||
|
## Controllable Props
|
||
|
|
||
|
You can control the following props by providing values for them. If you don't, react-select will manage them for you.
|
||
|
|
||
|
- `value` / `onChange` - specify the current value of the control
|
||
|
- `menuIsOpen` / `onMenuOpen` / `onMenuClose` - control whether the menu is open
|
||
|
- `inputValue` / `onInputChange` - control the value of the search input (changing this will update the available options)
|
||
|
|
||
|
If you don't provide these props, you can set the initial value of the state they control:
|
||
|
|
||
|
- `defaultValue` - set the initial value of the control
|
||
|
- `defaultMenuIsOpen` - set the initial open value of the menu
|
||
|
- `defaultInputValue` - set the initial value of the search input
|
||
|
|
||
|
## Methods
|
||
|
|
||
|
React-select exposes two public methods:
|
||
|
|
||
|
- `focus()` - focus the control programmatically
|
||
|
- `blur()` - blur the control programmatically
|
||
|
|
||
|
## Customisation
|
||
|
|
||
|
Check the docs for more information on:
|
||
|
|
||
|
- [Customising the styles](https://www.react-select.com/styles)
|
||
|
- [Using custom components](https://www.react-select.com/components)
|
||
|
- [Using the built-in animated components](https://www.react-select.com/home#animated-components)
|
||
|
- [Creating an async select](https://www.react-select.com/async)
|
||
|
- [Allowing users to create new options](https://www.react-select.com/creatable)
|
||
|
- [Advanced use-cases](https://www.react-select.com/advanced)
|
||
|
- [TypeScript guide](https://www.react-select.com/typescript)
|
||
|
|
||
|
## TypeScript
|
||
|
|
||
|
The v5 release represents a rewrite from JavaScript to TypeScript. The types for v4 and earlier releases are available at [@types](https://www.npmjs.com/package/@types/react-select). See the [TypeScript guide](https://www.react-select.com/typescript) for how to use the types starting with v5.
|
||
|
|
||
|
# Thanks
|
||
|
|
||
|
Thank you to everyone who has contributed to this project. It's been a wild ride.
|
||
|
|
||
|
If you like React Select, you should [follow me on twitter](https://twitter.com/jedwatson)!
|
||
|
|
||
|
Shout out to [Joss Mackison](https://github.com/jossmac), [Charles Lee](https://github.com/gwyneplaine), [Ben Conolly](https://github.com/Noviny), [Tom Walker](https://github.com/bladey), [Nathan Bierema](https://github.com/Methuselah96), [Eric Bonow](https://github.com/ebonow), [Mitchell Hamilton](https://github.com/mitchellhamilton), [Dave Brotherstone](https://github.com/bruderstein), [Brian Vaughn](https://github.com/bvaughn), and the [Atlassian Design System](https://atlassian.design) team who along with many other contributors have made this possible ❤️
|
||
|
|
||
|
## License
|
||
|
|
||
|
MIT Licensed. Copyright (c) Jed Watson 2022.
|