import React,{Component} from 'react'
import ReactDOM,{render} from 'react-dom'
import 'bootstrap/dist/css/bootstrap.min.css'
// import PropTypes from 'prop-types';
import JSONP from 'jsonp' //封装jonsp为promise对象
function jsonp(url,opts={}) {
return new Promise((resolve,reject)=>{
JSONP(url,opts, (err,data)=> {
if (err) reject(err);
resolve(data);
})
})
} class SearchCom extends Component{
constructor(){
super();
this.state={
val:"",
arr:[],
index:-1
}
}
handleChange = async (e)=>{
this.setState({val:e.target.value});
let {s} = await jsonp("https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd="+this.state.val,{param:"cb"});
this.setState({arr:s});
}
handleKeyUp= (e)=>{
let keyCode = e.keyCode;
if (keyCode === 38 || keyCode === 40) {
if (keyCode === 38){
this.setState({index:this.state.index-1})
if (this.state.index<0){
this.setState({index:this.state.arr.length-1});
}
//根据上下键切换,则给表单时面赋不同的值
e.target.value=this.state.arr[this.state.index+1];
this.setState({val:e.target.value});
} else {
this.setState({index:this.state.index+1})
if (this.state.index >= this.state.arr.length-1) {
this.setState({index:-1});
}
//根据上下键切换,则给表单时面赋不同的值
e.target.value=this.state.arr[this.state.index+1];
this.setState({val:e.target.value});
}
}
}
handleKeyDown= (e)=>{
if (e.keyCode ===13){
//https://www.baidu.com/s?wd=xxx 百度的查询接口
window.open('https://www.baidu.com/s?wd=' + this.state.val, '_blank');
this.refs.input.focus();
}
}
componentDidMount(){
//生命周期,在组件加载完成后,让input聚焦 (focus)
this.refs.input.focus();
}
handleMouseEnter=(key,item,event)=>{
this.setState({index:key,val:item});
this.refs.input.value = item;
}
handleClick =()=>{
window.open('https://www.baidu.com/s?wd=' + this.state.val, '_blank');
this.refs.input.focus();
}
render(){
let style ={marginTop:"20px"}
return (
<div className='container' style={style}>
<input type="text" ref='input' defaultValue={this.state.val} onChange={this.handleChange} onKeyUp={this.handleKeyUp} onKeyDown={this.handleKeyDown} className='form-control' placeholder='百度搜索框'/>
<ul className='list-group'>
{this.state.arr.map((item,key)=>{
return <li onClick={this.handleClick} onMouseEnter={(event)=>this.handleMouseEnter(key,item,event)} className={key===this.state.index ? 'list-group-item active' :"list-group-item"} key={key}>{item}</li>
})}
</ul>
<h2>{this.state.val}</h2>
</div>
)
}
} //简单的实现数据v-model实现 一定要用defaultValue 如果直接用value 则会将值写死,不会再改变了
render(<SearchCom/>, document.getElementById("root"))

  

  


React实现最完整的百度搜索框的更多相关文章

  1. Ajax以及类似百度搜索框的demo

    public class Ajax01 extends HttpServlet{ @Override protected void service(HttpServletRequest request ...

  2. JavaScript实现模糊推荐的input框(类似百度搜索框)

    如何用JS实现一个类似百度搜索框的输入框呢,再填充完失去焦点时,自动填充配置项,最终效果如下图: 实现很简单,但是易用性会上升一大截,需要用到的有jquery-ui的autocomplete,jque ...

  3. 使用 Vue.js 2.0+ Vue-resource 模仿百度搜索框

    使用 Vue.js 2.0 模仿百度搜索框 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  4. Ajax跨域:Jsonp实例--百度搜索框下拉提示

    Ajax跨域:Jsonp实例--百度搜索框下拉提示 一.总结 一句话总结:a.找好接口:b.用script标签的src引入文件(json数据):c.定义及实现上一步引入文件中的函数 1.如何找到一个网 ...

  5. window系统谷歌浏览器百度搜索框光标不能输入并且不显示光标----自制bug以及解决

    --------------------bug无处不在------------------------- 今天在搞代码的时候,保存文件无意中犯了个致命错误,文件名称写入非法字符,可能与Windows系 ...

  6. JS---DOM---案例:模拟百度搜索框

    模拟百度搜索框 我的思路整理: 1. 注册文本框抬起事件(onkeyup) 2. 处理函数: --->创建临时数组,循环遍历文本框键入的文字内容和keywords数组,用keyWords[i]. ...

  7. 【JavaScript_DOM 百度搜索框】

    今天给大家带来的事一个简单的百度的历史搜索框,大家在搜索东西的时候,百度会自动给你显示你最近搜索过的一些东西,那这个拿js怎么做呢? 我们一起来学习吧 这是一个HTML页面: <!DOCTYPE ...

  8. js实现百度搜索框滑动固定顶部

    现在很多主流系统例如百度.有道.爱奇艺等的搜索框都有一个特点,滑动到刚好看不到搜索框时,固定搜索框到顶部,这也算是一个对用户友好型的操 作. 在看了百度的js和css后自己摸索出来实现效果,还是学艺不 ...

  9. typecho博客组插件:openSug.js百度搜索框下拉提示免费代码

      Typecho候选搜索增强插件:安装openSug插件即可获得带有“搜索框提示”功能的搜索框,让Typecho搜索更便捷! 支持百度.谷歌.雅虎.Yandex.360好搜.UC神马.酷狗.优酷.淘 ...

随机推荐

  1. MHA 一主一从搭建

    安装基本环境介绍 一主一从     MHA manager & slave  node2 192.168.56.27 Master机器 node1 192.168.56.26 VIP   19 ...

  2. HDU 5536 字典树

    题意:就是公式. 这现场赛O(n^3)能过,觉得太没天理了. 做法:字典树,枚举两个数,然后在字典树上贪心的跑. #include <bits/stdc++.h> using namesp ...

  3. VMWARE下CentOS7虚拟机网络配置

    注:本文仅针对新装的虚拟机,#ip addr 获取不到ip信息,无法连接网络的情况提供一种参考解决方案. 1.左上角点击“编辑”->“虚拟网络编辑器”.新建一个NAT模式的网络. 2.配置虚拟机 ...

  4. QS:vue中qs的使用

    关于Vue中,序列化字符串,处理发送请求的参数 使用工具qs来处理参数 步骤: 1.首先先下载: npm i qs 2.然后引入 : import qs from 'qs' 3.qs主要有两个方法 : ...

  5. Android学习笔记_33_Widget时钟(MetaData)

    Widgets在文档docs\guide\topics\appwidgets\index.html下 Android中AppWidget的分析与应用:AppWidgetProvider 一.在 And ...

  6. ISIS Scanner Errors codes

    This section lists errors sorted by number: Error # Defined Constant String Defined In PIXDFLT 0 PIX ...

  7. o'Reill的SVG精髓(第二版)学习笔记——第七章

    第七章:路径 所有描述轮廓的数据都放在<path>元素的d属性中(d是data的缩写).路径数据包括单个字符的命令,比如M表示moveto,L表示lineto.接着是该命令的坐标信息. 7 ...

  8. webpack——安装报错及解决办法

    ①先删除 删除全局webpack-cli webpack4.x开始官方文档是说要安装cli所以如果的在用4.+就需要卸载cli npm uninstall -g webpack-cli # 注释给我这 ...

  9. Java经典书籍-PDF

    密码:rhgr https://pan.baidu.com/s/17MkdVFS9JrsbseMveQePOQ

  10. Hibernate知识点小结(三)-->一对多与多对多配置

    一.多表关系与多表设计 1.多表关系        一对一:            表的设计原则(分表原则):                优化表的性能                基于语意化分表 ...