Vue2.0组件实现动态搜索引擎(二)

接上一篇,完成logo部分我们就要开始整个项目的核心——panel组件。
摘要由CSDN通过智能技术生成
接上一篇,完成logo部分我们就要开始整个项目的核心——panel组件。

整个panel组件分为3个部分:关键字输入框,相关搜索建议下拉列表和搜索跳转按钮。

由于我们整个项目是设计成父子组件的架构所以在父组件即panel部分开头需要引入子组件:

HTML:

<logo-select @logoNow="changeSource"></logo-select>


JS:

import logoSelect from './logo-new.vue';

export default {
  components: {
    logoSelect //等价于logoSelect: logoSelect
  }


注意使用相对路径不要照搬。


目前的效果如下。



接下来做我们的搜索框,这一步比较简单,设置一个input再用v-model做一个双向绑定到data:

<input type="text" v-model="msgInput">
data: function () {
      return {
        msgInput: '',
        ...
      }
}

顺便加上一个“X”span,方便清空输入栏:

<span class="markDelete" @click="clearInput">x</span>


methods: {
      clearInput: function () {
          this.msgInput = '',//清空输入框
          this.results = ''//清空搜索建议数组
      },
      ...
}

这里比较偷懒用了个X字符代替清除按钮,对样式有追求的童鞋可以找个美观的图片,其他不变。


接下来就是核心功能:如何输入关键字就能自动弹出下拉菜单并且给出搜索建议?

由于我们要做的动态搜索建议,必然要使用其他搜索引擎的接口,那么跨域就成了主要技术难点。

翻阅了相关资料,使用jsonp跨域最为方便,Vue使用jsonp就要考虑vue-resource;


如果是第一次使用就要命令行安装:

npm install vue-resource --save


先在main.js引入vue-resource:

var vueResource = require('vue-resource');
Vue.use(vueResource);
<
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2.0组件实现动态搜索引擎实现思路如下: 1. 创建一个搜索组件,用于接收用户输入的关键字。 2. 创建一个数据列表组件,用于展示搜索结果。 3. 在搜索组件中,监听用户输入关键字的事件,并在输入框中实时显示用户输入的关键字。 4. 将用户输入的关键字传递给数据列表组件,用于筛选数据列表中符合关键字的数据。 5. 在数据列表组件中,根据传递过来的关键字,筛选出符合条件的数据,并展示在页面上。 6. 如果搜索结果为空,展示提示信息。 7. 可以设置搜索框的debounce,防止频繁请求接口,影响用户体验。 具体实现代码如下: 搜索组件: ```javascript <template> <div> <input type="text" v-model="keyword" @input="handleInput" /> </div> </template> <script> export default { data() { return { keyword: '' } }, methods: { handleInput() { this.$emit('search', this.keyword) } } } </script> ``` 数据列表组件: ```javascript <template> <div> <ul> <li v-for="item in filteredData" :key="item.id">{{ item.name }}</li> </ul> <div v-if="filteredData.length === 0">暂无数据</div> </div> </template> <script> export default { props: ['data'], data() { return { keyword: '' } }, computed: { filteredData() { return this.data.filter(item => item.name.includes(this.keyword)) } }, methods: { handleSearch(keyword) { this.keyword = keyword } }, mounted() { this.$on('search', this.handleSearch) } } </script> ``` 使用: ```javascript <template> <div> <search-box @search="handleSearch" /> <data-list :data="data" /> </div> </template> <script> import SearchBox from './SearchBox.vue' import DataList from './DataList.vue' export default { components: { SearchBox, DataList }, data() { return { data: [ { id: 1, name: 'apple' }, { id: 2, name: 'banana' }, { id: 3, name: 'cherry' }, { id: 4, name: 'durian' }, { id: 5, name: 'elderberry' } ] } }, methods: { handleSearch(keyword) { // 根据关键字请求接口,获取数据 // ... } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值