auto_complete.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello React!</title> <link href="css/auto_complete.css" rel="stylesheet"/> <script src="jslib/jquery-1.11.3.min.js"></script> <script src="jslib/react.min.js"></script> <script src="jslib/react-dom.min.js"></script> </head> <body> <div id="autocomplete"></div> <script src="js/auto_complete.js"></script> </body> </html>
js/auto_complete.js
var AutoComplete = React.createClass({
list:["apple","banana","grape","org","orange"],
timeout:null,
getInitialState:function(){
return {
open:null,
matchedItems:this.generateLiHtml(this.list)
}
},
generateLiHtml:function(list){
var matchedItems = [];
for(var i=0;i<list.length;i++){
var item = React.DOM.li({key:i,onClick:this.clickHandler},list[i]);
matchedItems.push(item);
}
return matchedItems;
},
clickHandler:function(e){
e.stopPropagation();
e.preventDefault();
var liItem = $(e.target);
var content = $(liItem).html();
$(ReactDOM.findDOMNode(this)).find("input").val(content);
this.setState({open:""});
},
keyUpHandler:function(e){
e.stopPropagation();
clearTimeout(this.timeout);
var val = e.target.value;
var that = this;
this.timeout = setTimeout(function(){
var result = [];
for(var i=0;i<that.list.length;i++){
var item = that.list[i];
if(item.startsWith(val)){
result.push(item);
}
}
var open = null;
if(result.length>0){
open = "open";
}
var matchedItems = that.generateLiHtml(result);
that.setState({matchedItems:matchedItems,open:open});
},300);
},
render: function() {
return React.DOM.div(
{className:"auto-complete"},
React.DOM.input({type:"text",onKeyUp:this.keyUpHandler}),
React.DOM.div(
{className:this.state.open},
React.DOM.ul(null,
this.state.matchedItems
)
)
);
}
});
ReactDOM.render(
React.createElement(AutoComplete),
$("#autocomplete")[0]
);css/auto_complete.css
.auto-complete{
width:200px;
}
.auto-complete input{
width:100%;
box-sizing:border-box;
}
.auto-complete>div{
display:none;
padding-top:10px;
}
.auto-complete>div.open{display:block;}
.auto-complete>div ul{
padding:0;
margin:0;
list-style-type: none;
border:1px solid #ccc;
}
.auto-complete>div ul li{
height:30px;
line-height: 30px;
border-bottom:1px solid #ccc;
padding-left:10px;
}
.auto-complete>div ul li:hover{
background-color:#eaeaea;
cursor:pointer;
}
.auto-complete>div ul li:last-child{
border-bottom:none;
}原文:http://antlove.blog.51cto.com/10057557/1748332