naro

您所在的位置:首页 > 解决方案 > Vue > 正文
vue实现百度关键词搜索 发表时间:2018-05-22 12:39:09 点击:
导言:最近前端面试接到一道这样的题【模拟实现下拉框组件】,看标题好像只需要做一个下拉组件就OK,点进去一看,还有很多戏。

命题要求

模拟实现下拉框组件,基本要求:

1、基本功能同select元素,可以下拉选择;

2、支持直接输入,输入时下拉列表的选项自动前缀匹配;

3、支持异步加载数据;

4、兼容主流浏览器;


当时光看标题,觉得很简单,核心就是模拟input的select,所以做出来效果是这样的(Demo1):

https://www.narofufor.com/html/dropdown.html

后来点进去一看,那个下拉框组件只是效果层面的,更主要的是功能层面的,所以做出来的效果应该是这样的(Demo2):

https://www.narofufor.com/html/keysearch.html


案列剖析

Demo1其实就是一个点击显示、隐藏功能,为了体验可以用css3给弹出、收回做个渐进动画。

我们重点来说下Demo2,命题要求里的异步和自动匹配不得不让我们考虑从后端接口着手,现成的最佳方案当然是百度啦,那么怎样去获取接口呢?

1.jpg

我们可以看到平时用百度搜索时,Request URL基本上都是https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su  后面跟参数


2.jpg

而当我们输入keyword时,返回的字段大致会有这些


3.png

而当我们点击搜索时,会新开页面跳转,URL基本是https://www.baidu.com/s?wd= 后面跟参数


有了上面两个接口,实现关键词联动搜索就无后顾之忧了。


需要注意

1、键盘事件,也就是event.keyCode,这里我们用到三个参数38(方向键向上)、40(方向键向下)和13(回车键)。项目中还应该考虑onfocus、onblur、mouseover、mouseout等复杂交互情况,这里就不赘述了。之前有做过类似项目,因为后端无法提供关键词检索,所以当时是用的localstorage来做的本地历史关键词存储。

2、用百度的接口当然要涉及到跨域问题,好在vue-resource提供this.$http.jsonp方法来解决这个问题,至于axios是否有解决跨域问题的方法,下来可以再研究下。

3、jsonp: "cb",   你可以理解为带callback的json就是jsonp,其中json是数据格式,jsonp是数据调用方式。

4、v-cloak可以解决渲染时页面初始{{value}}的显示问题,点击传送