文档章节

用Vue.js实现一个简单的搜索框

G
 GreatWall2017
发布于 2017/05/03 14:39
字数 846
阅读 7
收藏 0
点赞 0
评论 0

在github上看到的练习,看个遍代码后自己再练一遍,先放原址:https://github.com/lavyun/vue-demo-search

主要用到的知识很简单,简单的vuejs2.0的知识就够了。源码用了.vue构建和ES6,用了webpack打包等等。我资历还浅,先用一个简单的.js的写。

先看效果 
这里写图片描述
这里有两个组件,一个组件是logo部分的,一个是搜索框部分的。

 

html很简单,就是引用两个组件。

<div id="app">
    <logo-picture></logo-picture>
    <search-panel></search-panel>
</div>

 

先来分析,首先一个<img />显示搜索引擎的图片,这里要响应式的,下面选择了不同的搜索引擎图标就要跟着换。所以<img :src="items[now].src" />。后面的倒三角点击时显示下拉列表<span @click="toggleFlag"> </span>。 
然后是下拉框。如果想要有过渡效果,那个就要包裹在<transition-group中,然后遍历li,记住元素要指定唯一的key。 
想要有hover效果的话,用数据驱动的思维,就是比较index 与hoverindex是否相等,如果相等就加class。 

var app = new Vue({
    el: "#app"
});
Vue.component('logo-picture',{
    template :' \
    <div class="main-logo">\
        <img :src="items[now].src" @click="toggleFlag"/>\
        <span @click="toggleFlag" class="logoList-arrow"> </span>\
        <transition-group tag="ul" v-show="flagShow" class="logoList">\
            <li v-for="(item,index) in items" :key="index" @click="changeFlag(index)" @mouseover="flagHover(index)" :class="{selectback: index == hoverindex}">\
                <img :src="item.src" />\
            </li>\
        </transition>\
    </div>',
    data: function() {
        return {
            items: [{src:'../src/assets/360_logo.png'},{src:'../src/assets/baidu_logo.png'},{src:'../src/assets/sougou_logo.png'}],
            now: 0,
            flagShow: false,
            hoverindex: -1   
        }
    },
    methods: {
        //显示隐藏图片列表
        toggleFlag: function() {
            this.flagShow = !this.flagShow;
        },
        //改变搜索引擎
        changeFlag: function(index) {
            this.now = index;
            this.flagShow = false;
            bus.$emit("change",index);
        },
        //li hover
        flagHover: function(index) {
            this.hoverindex = index;
        }                     
    }
});

 

input因为要双向绑定,所以要v-model="keyword",还要绑定键盘事件@keyup,如果按enter就搜索,向下向上就选中给定的返回信息列表。 
下面的详情框与<logo-picture>下拉列表差不多。 
搜索的话主要是运用$http.jsonp,还有ES6的语法?回掉好像是Promise的.then()。

Vue.component('search-panel',{
    template:'\
    <div class="search-input">\
        <input v-model="search" @keyup="get($event)" @keydown.enter="searchInput()" @keydown.down="selectDown()" @keydown.up.prevent="selectUp()"/>\
        <span @click="clearInput()" class="search-reset">&times;</span>\
        <button @click="searchInput()" class="search-btn">搜一下</button>\
        <div class="search-select">\
            <transition-group tag="ul" mode="out-in">\
                <li v-for="(value,index) in myData" :class="{selectback:index==now}" :key="index" @click="searchThis" @mouseover="selectHover(index)" class="search-select-option search-select-list">\
                    {{value}}\
                </li>\
            </transition-group>\
        </div>\
    </div>',
    data: function() {
        return {
            search: '',
            myData: [],
            flag: 0,
            now: -1,
            logoData: [
                {
                    'name': "360搜索",
                    searchSrc: "https://www.so.com/s?ie=utf-8&shb=1&src=360sou_newhome&q="
                },
                {
                    'name': "百度搜索",
                    searchSrc: "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd="
                },
                {
                    'name': "搜狗搜索",
                    searchSrc: "https://www.sogou.com/web?query="
                }
            ]
        }
    },
    methods: {
        get: function(event) {
            if(event.keyCode == 38 || event.keyCode == 40){  //向上向下
                return ;
            }
            this.$http.jsonp('https://sug.so.360.cn/suggest?word=' + this.search + '&encodein=utf-8&encodeout=utf-8').then(function(res) {
                this.myData = res.data.s;

            }, function() {

            });
        },
        //清除内容
        clearInput: function() {
            this.search = '';
            this.get();
        },
        //搜索
        searchInput: function() {
            alert(this.flag)
            window.open(this.logoData[this.flag].searchSrc+this.search);
        },
        //搜索的内容
        searchThis: function(index) {
            this.search = this.myData[index];
            this.searchInput();
        },
        //li hover
        selectHover: function(index) {
            this.search = this.myData[index];
            this.now = index;
        },
        //向下
        selectDown: function() {
            this.now++;
            if(this.now == this.myData.length) {
                this.now = 0;
            }
            this.search = this.myData[this.now];
        },
        //向上
        selectUp: function() {
            this.now--;
            if(this.now == -1) {
                this.now = this.myData.length - 1;
            }
            this.search = this.myData[this.now];
        }
    },
    created: function() {    //通信
        var self = this;
        bus.$on('change',function(index) {
            self.flag = index;
        })
    }
})

 

<logo-picture>换了搜索引擎的话,<search-panel>要换成相应的搜索引擎。这里要新建一个空的Vue对象做中间,因为两个组件不是父子关系。

var bus = new Vue();

//logo-picture里触发事件,并传递参数
bus.$emit("change",index);

//search-panel里监听事件是否发生
var self = this;
bus.$on('change',function(index) {
    self.flag = index;
})

这里要注意this问题,$on里this指向bus,所以要保存this才能引用search-panel 。

 

转载自http://blog.csdn.net/weixin_35987513/article/details/53308953

本文转载自:http://blog.csdn.net/weixin_35987513/article/details/53308953

共有 人打赏支持
G
粉丝 0
博文 23
码字总数 11916
作品 0
深圳
vue入门环境搭建及demo运行

vue简介: Vue.js 是一套构建用户界面的渐进式框架。他自身不是一个全能框架——只聚焦于视图层。因此它非常容易学习,非常容易与其它库或已有项目整合。在与相关工具和支持库一起使用时,V...

挑战者666888 ⋅ 05/22 ⋅ 0

Vue进阶(五):与 Vuex 的第一次接触

Vue进阶(五):与 Vuex 的第一次接触 在 Vue.js 的项目中,如果项目结构简单,父子组件之间的数据传递可以使用 props 或者 $emit 等方式 (详参博文《Vue进阶(六):组件之间的数据传递》)...

sunhuaqiang1 ⋅ 05/05 ⋅ 0

JavaScript 开发框架横向比对(Vue、React 和 Angular)

1 背景比对 MIT license 与 BSD-license 之间的区别是:MIT license 允许衍生软件加上我们自己的名字做推广,而 BSD license 不可以。 MVVM(Model-View-ViewModel):将其中的View 的状态和...

deniro ⋅ 05/30 ⋅ 0

Vue常用经典开源项目汇总参考-海量

Vue常用经典开源项目汇总参考-海量   Vue是什么?   Vue.js(读音 /vju/, 类似于 view) 是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。...

80368704 ⋅ 2017/04/20 ⋅ 0

Exrick/xmall-front

XMall-Front 基于Vue开发的XMall商城前台页面 项目已部署,在线Demo 前台商城:http://xmall.exrick.cn/ 后台管理系统:http://xmadmin.exrick.cn/ 感谢 yucccc 的开源 vue-mall 项目提供前端...

Exrick ⋅ 04/21 ⋅ 0

你不知道的Vuejs - Vuejs 最佳实践(1)

by yugasun from yugasun.com/post/you-do… 本文可全文转载,但需要保留原作者和出处。 有了前面文章的铺垫,相信一路看过来的新手的你开发一个中型的 Vuejs 应用已经不在话下,包括 Vuejs ...

yugasun ⋅ 06/01 ⋅ 0

基于手淘 flexible 的 Vue 组件:Toast -- 显示框

vue-flexible-components 基于手淘 flexible.js 的 Vue 组件 前言: 目前手头的移动端Vue项目是用手淘的 lib-flexible 作适配的,并用 px2rem 来自动转换成rem。关于lib-flexible和px2rem的配...

冰扬 ⋅ 2017/12/26 ⋅ 0

web前端Vue.js经典开源项目汇总

  Vue是什么?   Vue.js(读音/vju/,类似于view) 是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是,Vue采用自底向上增量开发的设计。Vue的核心库只关注视图层,并且非常容易...

爱前端 ⋅ 2017/12/03 ⋅ 0

西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分

最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理。 情景再现...

闰土大叔 ⋅ 04/25 ⋅ 0

深入理解Vue的watch实现原理及其实现方式

理解Vue中Watch的实现原理和方式之前,你需要深入的理解MVVM的实现原理,如果你还不是很理解,推荐你阅读我之前的几篇文章: 彻底搞懂Vue针对数组和双向绑定(MVVM)的处理方式 vue.js源码解读...

wangweianger ⋅ 05/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 7分钟前 ⋅ 0

482. License Key Formatting - LeetCode

Question 482. License Key Formatting Solution 思路:字符串转化为char数组,从后遍历,如果是大写字母就转化为小写字母,如果是-就忽略,如果遍历了k个字符(排除-)就追加一个-。 Java实现...

yysue ⋅ 26分钟前 ⋅ 0

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 50分钟前 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 57分钟前 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 今天 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 今天 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 今天 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 今天 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 今天 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部