React tags is a simple tagging component ready to drop in your React projects. The component is inspired by GMail's To field in the compose window.
- Autocomplete based on a suggestion list
- Keyboard friendly and mouse support
- Reorder tags using drag and drop
Because I was looking for an excuse to build a standalone component and publish it in the wild? To be honest, I needed a tagging component that provided the above features for my React-Surveyman project. Since I was unable to find one which met my requirements (and the fact that I generally enjoy re-inventing the wheel) this is what I came up with.
Check it out here
The preferred way of using the component is via NPM
npm install --save react-tag-input
It is, however, also available to be used separately (dist/ReactTags.min.js
). If you prefer this method remember to include ReactDND as a dependancy. Refer to the demo to see how this works.
Here's a sample implementation that initializes the component with a list of initial tags
and suggestions
list. Apart from this, there are multiple events, handlers for which need to be set. For more details, go through the API.
var ReactTags = require('react-tag-input');
var App = React.createClass({
getInitialState: function() {
return {
tags: [ {id: 1, text: "Apples"} ],
suggestions: ["Banana", "Mango", "Pear", "Apricot"]
}
},
handleDelete: function(i) {
var tags = this.state.tags;
tags.splice(i, 1);
this.setState({tags: tags});
},
handleAddition: function(tag) {
var tags = this.state.tags;
tags.push({
id: tags.length + 1,
text: tag
});
this.setState({tags: tags});
},
handleDrag: function(tag, currPos, newPos) {
var tags = this.state.tags;
// mutate array
tags.splice(currPos, 1);
tags.splice(newPos, 0, tag);
// re-render
this.setState({ tags: tags });
},
render: function() {
var tags = this.state.tags;
var suggestions = this.state.suggestions;
return (
<div>
<ReactTags tags={tags}
suggestions={suggestions}
handleDelete={this.handleDelete}
handleAddition={this.handleAddition}
handleDrag={this.handleDrag} />
</div>
)
}
});
React.render(<App />, document.getElementById('app'));
An array of tags that are displayed as pre-selected. Each tag should have an id
and a text
property which is used to display.
var tags = [ {id: 1, text: "Apples"} ]
An array of suggestions that are used as basis for showing suggestions. At the moment, this should be an array of strings.
var suggestions = ["mango", "pineapple", "orange", "pear"];
The placeholder shown for the input. Defaults to 'Add new tag'.
var placeholder = "Add new country"
Function called when the user wants to add a tag (either a click, a tab press or carriage return)
function(tag) {
// add the tag to the tag list
}
Function called when the user wants to delete a tag
function(i) {
// delete the tag at index i
}
Function called when the user drags a tag.
function(tag, currPos, newPos) {
// remove tag from currPos and add in newPos
}
The component is written in ES6 and uses Webpack as its build tool.
npm install
npm run dev
python -m SimpleHTTPServer ### open in browser
Got ideas on how to make this better? Open an issue! I'm yet to add tests so keep your PRs on hold 😀
The autocomplete dropdown is inspired by Lea Verou's awesomeplete library. The Drag and drop functionality is provided by Dan Abramov's insanely useful ReactDND library.