React Selectize
ReactSelectize
is a stateless Select component for ReactJS, that provides a platform for the more developer friendly SimpleSelect
& MultiSelect
components.
Both SimpleSelect
& MultiSelect
have been designed to work as drop in replacement for the built-in React.DOM.Select
component.
styles & features inspired by React Select & Selectize.
DEMO / Examples: furqanZafar.github.io/react-selectize
Motivation
- existing components do not behave like built-in React.DOM.* components.
- existing components synchronize props with state an anti pattern, which makes them prone to bugs & difficult for contributers to push new features without breaking something else.
- more features.
Features
Install
- npm:
npm install react-selectize
to include the default styles add the following import statement to your stylus file:
@import 'node_modules/react-selectize/themes/index.css'
<html>
<head>
<script src="http://www.preludels.com/prelude-browser-min.js" type="text/javascript" ></script>
<script src="https://npmcdn.com/prelude-extension@0.0.11/dist/index.min.js" type="text/javascript" ></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react-with-addons.min.js" type="text/javascript" ></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react-dom.min.js" type="text/javascript" ></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.1.1/js/tether.min.js" type="text/javascript" ></script>
<script src="https://npmcdn.com/react-selectize@2.1.0/dist/index.min.js" type="text/javascript" ></script>
<link rel="stylesheet" href="https://npmcdn.com/react-selectize@2.1.0/dist/index.min.css"/>
</head>
</html>
Usage (jsx)
React = require("react");
ReactSelectize = require("react-selectize");
SimpleSelect = ReactSelectize.SimpleSelect;
MultiSelect = ReactSelectize.MultiSelect;
.
.
.
<SimpleSelect
placeholder = "Select a fruit"
onValueChange = {function(value){
alert(value);
}}
>
<option value = "apple">apple</option>
<option value = "mango">mango</option>
<option value = "orange">orange</option>
<option value = "banana">banana</option>
</SimpleSelect>
.
.
.
<MultiSelect
placeholder = "Select fruits"
options = ["apple", "mango", "orange", "banana"].map(function(fruit){
return {label: fruit, value: fruit};
});
onValuesChange = {function(values){
alert(values);
}}
/>
Usage (livescript)
{create-factory}:React = require \react
{SimpleSelect, MultiSelect, ReactSelectize} = require \react-selectize
SimpleSelect = create-factory SimpleSelect
MultiSelect = create-factory MultiSelect
.
.
.
SimpleSelect do
placeholder: 'Select a fruit'
options: <[apple mango orange banana]> |> map ~> label: it, value: it
on-value-change: (value) ~>
alert value
.
.
.
MultiSelect do
placeholder: 'Select fruits'
options: <[apple mango orange banana]> |> map ~> label: it, value: it
on-values-change: (values) ~>
alert values
Gotchas
-
the default structure of an option object is {label: String, value :: a}
where a
implies that value
property can be of any equatable type
-
SimpleSelect notifies change via onValueChange
prop whereas MultiSelect notifies change via onValuesChange
prop
-
the onValueChange callback for SimpleSelect is passed 1 parameter. the selected option object
(instead of the value property of the option object)
-
the onValuesChange callback for MultiSelect is passed 1 parameter an Array of selected option objects (instead of a collection of the value properties or a comma separated string of value properties)
-
both the SimpleSelect & MultiSelect will manage the open
, search
, value
& anchor
props using internal state, if they are not provided via props:
when passing open
, search
, value
or anchor
via props, you must update them on*Change (just like in the case of standard react html input components)
value = {state.selectedValue}
onValueChange = {function(value){
self.setState({selectedValue: value});
}}
search = {state.search}
onSearchChange = {function(value){
self.setState({search: value});
}}
- when using custom option object, you should implement the
uid
function which accepts an option object and returns a unique id, for example:
uid = {function(item){
return item.firstName + item.lastName;
}}
the uid
function is used internally for performance optimization.
Deps
Peer Deps
- react
- react-dom
- react-addons-css-transition-group
- react-addons-shallow-compare
Development
npm install
gulp
- visit
localhost:8000
npm test
, npm run coverage
for unit tests & coverage- for production build/test run
MINIFY=true gulp