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. 20165322 实验二《Java面向对象程序设计》实验报告

    实验二<Java面向对象程序设计>实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实 ...

  2. MySQL:数据库入门篇5

    1.存储引擎 innodb与MyIASM存储引擎的区别: 1.innodb 是mysql5.5版本以后的默认存储引擎, 而MyISAM是5.5版本以前的默认存储引擎. 2.innodb 支持事物,而M ...

  3. [18/12/05]接口(interface)

    一.定义(类之上的公共标准) 一个特殊的类,用interface关键字来表示.只有全局变量和抽象方法.解决Java中子类只能单继承的问题 [语法] [访问修饰符:public 或 default]  ...

  4. sst上传和下载码云

    第一次 Team-----share---->Add----->commit-------remote----->pull 第二次 直接share开始.

  5. WSASocket()与Socket()的区别 转

    /**************************************************** WSASocket是Windows专用,支持异步操作:socket是unix标准,只能同步操 ...

  6. Failed to resolve: com.android.support:appcompat-v7:23.*

    打开 sdk manager ,安装 android support repository.

  7. JWT如何在Spring Cloud微服务系统中在服务相互调时传递

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78676036 本文出自方志朋的博客 在微服务系统中,为了保证微服务系统的安全,常常使用jw ...

  8. IPv4和IPv6的兼容问题

    一网络拓扑 Ipv6网络1 路由器A IPv4网络 路由器B IPv6网络2 二知识补充 [注]双协议栈主机(路由器A.B)通过域名解析器区分传过来的是IPv4还是IPv6 三处理技术 双协议栈 Ip ...

  9. win10永久激活方法-备份

    百度经验 > 游戏/数码 > 电脑 > 笔记本电脑 Win10专业版永久激活方法 听语音 3780404人看了这个视频 返回 暂停 重播 播放 x       1秒后即将播放下一条视 ...

  10. mysql忘记密码重置

    一.更改my.cnf配置文件 0.MySQL 版本查看 mysql --version 1.用命令编辑/etc/my.cnf配置文件,即:vim /etc/my.cnf 或者 vi /etc/my.c ...