目标: 城市列表页搜索区域的功能实现

功能:在搜索城市名字或者拼音的时候,能够把搜索的结果显示出来。

搜索列表的布局与逻辑实现

<template><div><div class="search"><input class="search-input" type="text" placeholder="请输入城市或字母"></div><div class="search-content"><ul><li>123</li></ul></div></div>
</template>

样式美化:

.search-contentoverflow hiddenposition absolutetop 1.58remleft 0right 0bottom 0z-index 1background green

要想在这个区域中显示搜索结果,就需要将用户的搜索词与和数据做一个双向绑定。data中设置一个keyword,默认为空字符串,使用vue中的v-model让input框的内容与这个keyword值做一个双向绑定。

<div class="search"><input v-model="keyword" class="search-input" type="text" placeholder="请输入城市或字母">
</div>

此外,City.vue需要向Search.vue传递cities数据:<city-search :cities="cities"></city-search>,Search.vue接收cities数据:

props: {cities: Object
}

Search.vue中在data里面定义一个list空数组,并设置一个watch侦听器来侦听keyword的值,同样的,为了提高性能,我们采用节流的方式:在data中初始化一个值为null的timer,即:

watch: {keyword () {if (this.timer) {clearTimeout(this.timer)}this.timer = setInterval(() => {}, 100);}
}

具体的逻辑实现:

this.timer = setInterval(() => {const result = []for (let i in this.cities) {this.cities[i].forEach((value) => {if (value.spell.indexOf(this.keyword) > -1 || value.name.indexOf(this.keyword) > -1) {result.push(value)}});}this.list = result
}, 100);

代码分析:
在cities中,每一项数据是这样的:

"A": [{"id": 56,"spell": "aba","name": "阿坝"}

循环遍历cities中的数据,判断用户搜索的中文关键词或者拼音是否在这个数据库当中,如果存在的话就把它们放在一个数组里面,最终将这个结果给到this.list用于渲染到页面上的搜索列表当中:

<div class="search-content"><ul><li class="search-item border-bottom" v-for="item of list" :key="item.id">{{item.name}}</li></ul>
</div>

至此,页面上的搜索功能就能实现了,接下来再做进一步的样式优化:

.search-itemline-height .62rempadding-left .2rembackground #fffcolor #666

此时会发现,当我们搜索一个城市的名字,比如果是“阿”开头的,就会显示出很多“阿”开头的城市名字,但是此时的页面无法滚动,超出页面的部分无法查看,我们借助better-scroll插件来实现页面的局部滚动功能(使用这个插件之前不要忘记引入)。

首先,在class="search-content"的div上添加一个ref属性,然后借助生命周期钩子:

mounted () {this.scroll = new Bscroll(this.$refs.search)
}

就可以实现搜索列表的局部滚动了。

但是此时会发现,当我在输入框中删除“阿”后,搜索列表还是显示在那里,所以需要进行一个小的优化。在侦听这个keyword的值的时候,判断当这个keyword不存在时候,就将这个list设置为一个空数组然后return就可以了。

当用户输入的数据在数据库中不存在的时候,搜索列表中没有内容,这时可以给用户一个"没有找到匹配数据"的提示:

<li class="search-item border-bottom">没有找到匹配数据</li>

但是会发现,这个提示语句在一开始搜索的时候以及搜索过程中都会显示,我们想要的效果是,当搜索列表中有数据的时候不显示提示信息,当匹配不到用户搜索的数据的时候才会显示出来。可以使用v-show来实现:

<li class="search-item border-bottom" v-show="!list.length">没有找到匹配数据</li>

上述的效果实现了,但是这个列表区域把之前写过的城市列表全部遮挡住了。这个搜索列表区域的显示语法可以通过一个变量来控制:

<div class="search-content" ref="search"v-show="keyword"
><ul><li class="search-item border-bottom" v-for="item of list" :key="item.id">{{item.name}}</li><li class="search-item border-bottom" v-show="!list.length">没有找到匹配数据</li></ul>
</div>

这就表示,当keyword有值的时候就会显示,没有值的时候就会隐藏。

代码小优化

<li class="search-item border-bottom" v-show="!list.length">没有找到匹配数据</li>

在上面的代码中,v-show指令中有一个取反的运算符!, 我们应该避免在模板当中出现逻辑性的描述。所以,可以定义一个计算属性:

hasNoData () {return !this.list.length
}

所以模板中就变成了:

<li class="search-item border-bottom" v-show="hasNoData">没有找到匹配数据</li>

去哪儿-12-city-search-logic相关推荐

  1. 常去阅读 12个开发人员的博客

    你创造的越多,学到的越多.虽然有很多的开发人员在分享他们的经验,但是关注所有这些人显示是很困难的.所以我们收集了以下资源,为你展示了12个值得一读的博客. 1. Six Revisions 我们不再把 ...

  2. 南京江南贡院值得去吗_这12个地方是一种瘾,值得一去再去,有你想要去的吗?...

    有人说,旅行就是从一个自己呆腻了的地方,到别人呆腻了的地方去. 但大家有没有发现,去过许多地方,看过那么多风景,总有一些地方,第一次初识,第二次上瘾,第三第四次还去不腻? 或是丰富的景观风光,或是丰厚 ...

  3. listrecord根据某个属性去重_去哪网开发实战记录(9):城市选择页(中)

    兄弟组件之间的联动 所谓的兄弟组件之间的联动,其实就是实现点击右侧的字母就能跳转至对应的首字母城市,因此列表组件需要知道右侧的字母列表的点击事件所对应的元素字母,这就需要兄弟组件间的数据传递了(Alp ...

  4. 使用谷歌搜索的20条高效技巧 20 Google Search Tips to Use Google More Efficiently

    谷歌浏览器使用技巧速览 1. Use the tabs 使用好分类标签 2. Use quotes 用好引号 3. Use a hyphen to exclude words 使用减号(-)去除不想搜 ...

  5. xampp去运行php文件_从0开始构建一个属于你自己的PHP框架

    如何构建一个自己的PHP框架 为什么我们要去构建一个自己的PHP框架?可能绝大多数的人都会说"市面上已经那么多的框架了,还造什么轮子?".我的观点"造轮子不是目的,造轮子 ...

  6. LeetCode 79. Word Search

    原题链接在这里:https://leetcode.com/problems/word-search/ 题目: Given a 2D board and a word, find if the word ...

  7. 苹果6运行内存是多少_iPhone 12为什么不标注运行内存?安卓转苹果手机是入11还是入12呢?...

    苹果从不标榜配置参数,重在体验感与功能的实现. 关于苹果运存问题,简单点说: 1.IOS系统底层逻辑不同于安卓,苛刻的内存管理,高效的内存缓存读取, 2.运行当前程序时,后台程序会被暂停,释放出更多运 ...

  8. 谷歌 console_使用Google Search Console有效增加网站流量的15条提示

    谷歌 console Google Search Console is a powerful free tool created by Google to help website owners un ...

  9. Primavera Unifier 19.12.X Patch/Update(补丁/更新)

    了解本文内容前,可以先读之前的关于patch的文章,希望可以给你带来帮助 Oracle Primavera P6 & Unifier等产品 Patch 补丁介绍_Oracle Primaver ...

  10. mysql统计一年12个月的数据,当某个月没数据的时候自动补0

    在mysql中如何去统计12个月的数据,并且给没有数据的月份设置为0 ? 因为每个人的业务都不太一样,所以如何统计数据这个就不说了,不过我相信能看到这篇文章的人应该都已经做好数据统计,只是统计的数据并 ...

最新文章

  1. AI工程师面试知识点:机器学习算法类
  2. 2016012090+小学四则运算练习软件项目报告
  3. 醉话没有测试(QA)的测试
  4. 引:善用backtrace解决大问题
  5. 解决修改/etc/sudoers文件后:报 语法错误 near line 23
  6. Spanning Tree with Maximum Degree
  7. python爬取2017年统计用区划代码和城乡划分代码(截止2017年10月31日)
  8. 自动驾驶——为什么需要仿真?
  9. weka软件使用问题解决(一)
  10. C++继承——以应用抽象类,求圆、圆内接正方形、圆外切正方形的面积和周长为例
  11. 以太坊:在合约里调用指定地址的另一已部署合约
  12. 在软件测试中如何搭建测试环境?
  13. java版本 code128混合条形码制作
  14. Java小白入门200例52之实现淡旺季飞机票打折
  15. 杂谈 python脚本调用接口进行性能和稳定性测试(套路)
  16. JavaScript 开发者年度调查报告
  17. matlab匿名函数解方程,matlab 数学建模 匿名函数@
  18. Google Earth Engine(GEE)——MOD17A3中Npp_QC波段展示(北京市案例分析)
  19. 全球最容易被盗号的密码公布,慎用!
  20. python torch.argmax()

热门文章

  1. Exchange 2007 删除 某时间段 特定主题 的邮件
  2. Nginx限制连接数和下载速度
  3. 如何在Red Hat Linux上安装和配置FreeIPA
  4. OSPF高级特性——LSA-3(Network Summary LSA)的过滤、路由协议——管理距离的修改、外部路由的metric值的修改
  5. php dir变量,[PHP] sys_get_temp_dir()和tempnam()函数报错与环境变量的配置问题
  6. 2021 Spring 自定义注解 +AOP +方法入参
  7. linux服务器 top 查看 内存占用详情
  8. 数组(Array)的常用方法
  9. 【Python】第一个程序---Helloworld!
  10. C#开发笔记之09-如何用C#判断社会信用代码是否合法?