In order to get a better grasp of React I decided to create a typeahead component. I'd really love some feedback on this in order to improve, learn or avoid mistakes regarding my code. I'm unsure whether I should split up my components even more than I already did.
import React from 'react';
import ReactDOM from 'react-dom';
import SearchListItem from './search_list_item.jsx';
class SearchList extends React.Component {
constructor(props) {
super(props);
this.state = {
cursor: 0,
data: ['Bananas', 'Apples', 'Ape', 'Oranges', 'Ora', 'Cherries', 'Pears', 'Kiwi'],
searchedList: [],
searchInput: '',
showDropdown: true
}
this.handleOnchange = this.handleOnchange.bind(this);
this.handleKeyPress = this.handleKeyPress.bind(this);
this.handleClickedItem = this.handleClickedItem.bind(this);
}
handleOnchange(value) {
this.setState({ showDropdown: true })
this.setState({ searchInput: value });
const dataItem = this.state.data
let searchedListItems = dataItem.filter(dataItem => dataItem.includes(this.state.searchInput));
var listToRender = [];
if (searchedListItems) {
listToRender.push(searchedListItems);
} else {
var itemToRemove = this.state.searchedListItems
listToRender.remove(listToRender, itemToRemove);
}
this.setState({ searchedList: listToRender });
}
handleKeyPress(e) {
const { cursor, searchedList } = this.state;
const arrowUp = 38;
const arrowDown = 40;
const enter = 13;
if (e.keyCode === arrowUp && cursor > 0) {
this.setState( prevState => ({
cursor: prevState.cursor - 1
}))
} else if (e.keyCode === arrowDown && cursor < searchedList[0].length - 1) {
this.setState( prevState => ({
cursor: prevState.cursor + 1
}))
} else if (e.keyCode === enter && cursor >= 0) {
this.setState({
searchInput: searchedList[0][this.state.cursor],
showDropdown: false,
cursor: 0
});
}
}
handleClickedItem(data) {
this.setState({
searchInput: data,
showDropdown: false,
cursor: 0
})
}
submitForm(e) {
e.preventDefault();
alert
}
renderSearchList() {
const { cursor } = this.state
if (this.state.searchedList[0]) {
const searchList = this.state.searchedList[0].map((data, index) => {
return (
<SearchListItem
key={index}
id={index}
handleClickedItem={this.handleClickedItem.bind(null, data)}
isActive={cursor === index ? 'active dropdown-li' : 'dropdown-li'}
data={data} />
);
});
return (
<div className="dropdown-div">
<ul className="dropdown-ul">
{searchList}
</ul>
</div>
);
}
}
render() {
return (
<div>
<form onSubmit={this.submitForm} >
<input
className="input"
type="text"
value={this.state.searchInput}
onChange={event => this.handleOnchange(event.target.value)}
onKeyDown={this.handleKeyPress} />
</form>
{ this.state.showDropdown ? this.renderSearchList() : <div /> }
</div>
);
}
}
ReactDOM.render(<SearchList/>, document.getElementById('main'));