天天看點

vue實作搜尋框搜尋新增_基于Vue.js實作簡單搜尋框?

在github上看到的練習,看個遍代碼後自己再練一遍,先放原址:https://github.com/lavyun/vue-demo-search

主要用到的知識很簡單,簡單的vuejs2.0的知識就夠了。源碼用了.vue建構和ES6,用了webpack打包等等。我資曆還淺,先用一個簡單的.js的寫。

先看效果

vue實作搜尋框搜尋新增_基于Vue.js實作簡單搜尋框?

這裡有兩個元件,一個元件是logo部分的,一個是搜尋框部分的。

html

html很簡單,就是引用兩個元件。

logo

先來分析,首先一個

vue實作搜尋框搜尋新增_基于Vue.js實作簡單搜尋框?

顯示搜尋引擎的圖檔,這裡要響應式的,下面選擇了不同的搜尋引擎圖示就要跟着換。是以

vue實作搜尋框搜尋新增_基于Vue.js實作簡單搜尋框?

。後面的倒三角點選時顯示下拉清單 。

然後是下拉框。如果想要有過渡效果,那個就要包裹在

想要有hover效果的話,用資料驅動的思維,就是比較index 與hoverindex是否相等,如果相等就加class。

Vue.component('logo-picture',{   template :' \  

\    

vue實作搜尋框搜尋新增_基于Vue.js實作簡單搜尋框?

\     \    \     \      

vue實作搜尋框搜尋新增_基于Vue.js實作簡單搜尋框?

\     \    \   ',   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就搜尋,向下向上就選中給定的傳回資訊清單。

下面的詳情框與下拉清單差不多。

搜尋的話主要是運用$http.jsonp,還有ES6的文法?回掉好像是Promise的.then()。

Vue.component('search-panel',{   template:'\  

\    \     ×\    搜一下\     \     \      \       {{value}}\      \     \     \   ',   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;    })   }  })

兩個兄弟元件通信的問題

換了搜尋引擎的話,要換成相應的搜尋引擎。這裡要建立一個空的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前端元件學習教程》,歡迎大家學習閱讀。

以上就是本文的全部内容,希望對大家的學習有所幫助,也希望大家多多支援腳本之家。