基于Vue.js实现简单搜索框_javascript技巧

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

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

先看效果

这里有两个组件,一个组件是logo部分的,一个是搜索框部分的。

html

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

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

//js还要实例#app
var app = new Vue({
 el: "#app"
})

logo

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

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">×</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.

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索vue.js
搜索框
javascript vue、mongovue javascript、vue.js实现搜索功能、vue搜索、vue.js筛选搜索框,以便于您获取更多的相关知识。

时间: 2024-10-30 05:11:18

基于Vue.js实现简单搜索框_javascript技巧的相关文章

基于Vue.js的表格分页组件_javascript技巧

一.Vue.js简介1.Vue的主要特点: (1) 简洁 (2) 轻量 (3)快速 (4) 数据驱动 (5) 模块友好 (6) 组件化(1) 简洁 下面看一段Angular的实现双向绑定的代码 // html <body ng-app="myApp"> <div ng-controller="myCtrl"> <p>{{ note }}</p> <input type="text" ng-mo

最细致的vue.js基础语法 值得收藏!_javascript技巧

介绍 前段时间接触到一个库叫做Vue.js, 个人感觉很棒,所以整理了一篇博文做个介绍. Vue读音/vju:/,和view类似.是一个数据驱动的web界面库.Vue.js只聚焦于视图层,可以很容易的和其他库整合.代码压缩后只有24kb. 可以去 这里下载 .自己整理了一个Vue.js的demo, https://github.com/chenhao-ch/demo-vue 快速入门以下代码是Vue.js最简单的例子, 当input中的内容变化时,p节点的内容会跟着变化. <!-- html -

Vue.js 60分钟轻松入门_javascript技巧

Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM.它通过一些特殊的HTML语法,将DOM和数据绑定起来.一旦你创建了绑定,DOM将和数据保持同步,每当变更了数据,DOM

JavaScript之Vue.js【入门基础】_javascript技巧

本篇将简单介绍一下Vue.js,并在Node.js环境下搭建一个简单的Demo. 一.简介 我个人理解,Vue.js是一套前端视图层的框架,它只关心视图展示和数据绑定,它的一些语法与Angular 1非常相似,如果有Angular 1相关的使用经验,上手会非常快. 相比较其他的React.Angular 2等MVVM框架,它更加的轻量,效率也更高,也能更好的与其他库集成. 它拥有以下几个出色的特性: 数据双向绑定 指令 模板 组件 当前最新的版本为2.1.4.后续也会在这个版本下演示Demo.

详解vue.js组件化开发实践_javascript技巧

前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然成为了第一个问题.鉴于目前web前端mvvm框架以及组件化开发方式的流行,决定技术栈采用:vue + es6 + 组件化. 这里首先简单说下web前端组件化开发方式的历程: 最早的组件化结构,代码结构可能如下: - lib/components/calendar |- calendar.css |-

Vue.js教程之计算属性_javascript技巧

Vue.js 的内联表达式非常方便,但它最合适的使用场景是简单的布尔操作或字符串拼接.如果涉及更复杂的逻辑,你应该使用计算属性. 计算属性是用来声明式的描述一个值依赖了其它的值.当你在模板里把数据绑定到一个计算属性上时,Vue 会在其依赖的任何值导致该计算属性改变时更新 DOM.这个功能非常强大,它可以让你的代码更加声明式.数据驱动并且易于维护. 通常情况下,使用计算属性会比使用过程式的$watch回调更合适.比如下面的例子: <div id="demo">{{fullNa

深入探讨Vue.js组件和组件通信_javascript技巧

基本是按照官网的 Guide 全部梳理了一遍:http://vuejs.org/guide/index.html 这里我们以一个 Todo List 应用为例来把相关的只是都串起来,这篇里面的全部代码都在github上 https://github.com/lihongxun945/vue-todolist  Vue 实例 一个 Vue 应用是由一个 root vue instance 引导启动的,而 Vue instance 是这么创建的: var vm = new Vue({ // opti

利用css+原生js制作简单的钟表_javascript技巧

利用css+原生js制作简单的钟表.效果如下所示   实现该效果,分三大块:html.javascript.css html部分html部分比较简单,定义一个clock的div,内部有原点.时分秒针.日期以及时间,至于钟表上的刻度.数字等元素,因为量比较多,采用jvascript生成  <!doctype html> <html> <head> <meta charset="UTF-8"> <link rel='stylesheet

Vue.js快速入门实例教程_javascript技巧

什么是vue vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API. 一.基本结构 index.html代码: <script src="../vue.js"></script> <div id="app"> {{ message }} </div> <script src="app.js"></script> <