查看完整的代码请到   我的github地址

一、结果展示

   预览地址

二、前期准备:

1.引入汉字转拼音的插件,利用NPM安装 代码指令为 npm install pinyin --save ,详细步骤请到pinyin 
2.引入vue-resource,调用json文件,可以参考目录中的city.json,有条件的也可以自己去扒

三、 分析

所实现的功能点:

1、获取json数据展示城市列表 。

2、侧边字母定位滚动到相应的位置。

3、实现搜索城市

1、实现1的逻辑,主要是引入vue-resource,然后利用其中http的功能去调用json文件,当然api也是同样可以 。

this.$http.get('/static/city.json').then(response => {/* 要进行的数据处理 */})   // '/static/city.json'自己要引入的文件或接口。

渲染列表的时候,将数据组成数组对象的形式,例如这样

这样的话可以一次将字母列表和城市列表一起渲染出来。不过要想把对应的汉字都放到对应的字母后面,我们引入了一个插件,可以用npm直接安装 。

引入汉字转拼音的插件,利用NPM安装 代码指令为 npm install pinyin --save ,详细步骤请到pinyin

引入之后调用

 getFirstLetter: function (str) { //  得到城市第一个字的首字母return pinyin(str)[0][0].charAt(0).toUpperCase()},
 buildLetter: function () {  // 构建字母项letter = []for (let i = 0; i < 26; i++) {let obj = {}obj.letter = String.fromCharCode((65 + i))obj.citylist = []letter.push(obj)}},
  buildItem: function (cityNamesFilter) {  // 构建城市this.buildLetter()let _this = thisfor (let i = 0; i < 26; i++) {letter[i].citylist = []}for (let i = 0; i < cityNamesFilter.length; i++) {let _index = Number(_this.getFirstLetter(cityNamesFilter[i]).charCodeAt() - 65)if (_index >= 0 && _index < 26) {letter[_index].citylist.push(cityNamesFilter[i])}}// 如果letter中citylist中没有值的话,过滤这一项showCity = showCityTemp = letter.filter(function (value) {let len = value.citylist.lengthreturn len > 0})},
<template><div id="city"><header-item message="城市列表" backUrl="/"></header-item><div class="search-city"><input type="text" placeholder="请输入要搜索的城市" v-model="citySearch" :value="citySearch"></div><div><div id="showCityContent"></div><div v-for="item in showCity" class="letter-item"><div><a :id="item.letter">{{item.letter}}</a></div><div v-for="i in item.citylist">{{i}} </div></div></div><aside class="letter-aside"><ul><li v-for="item in showCity" @click="naver(item.letter)">{{item.letter}} </li></ul></aside><div id="tip">{{tipString}}</div></div>
</template>

从上可看出只用了showCity这个数据进行v-for 。

2、构建完主体以后,其实右侧的字母栏与中间的字母生成方式是一致的,在定位的方面采用的是js中的scrolltop的方法,用锚点的方法也是可以的,有兴趣的可以自己试试。

  naver: function (id) { // 点击右边字母滚动this.tipString = idlet obj = document.getElementById(id)let tip = document.getElementById('tip')tip.setAttribute('class', 'tipAppear')setTimeout(function () {tip.removeAttribute('class')}, 500)let oPos = obj.offsetTopreturn window.scrollTo(0, oPos - 36)},

在滚动的同时,中间也加入了字母的显示动画。

这样的话,城市列表的显示和导航基本完成,接下来的重点在于搜索城市。

3、实现搜索城市

原理说起来很简单,就是在列表中去寻找还有输入字符的项,找到了就可以的让他显示出来。

由于vue的便利性,我们不需要去自己进行对dom太多操作,只需要对数据进行操作。

可以看出这一块并没有隐藏第一次渲染出的结构,而是确确实实的没有构建,这都得益于vue对虚拟dom的操作,这里就不细说了。

在实现这个功能的时候,用到了vue中watch,可以用来观察数据的改变,当数据改变的时候,绑定函数。

watch: {citySearch: function (newCitySearch) {  //citySearch是input中输入的值this.cityFilter(newCitySearch)}
   cityFilter: function (city) {  // 城市搜索筛选
        let showCityListTempthis.buildItem(cityNamesFilter)showCity = showCityTempshowCity = showCity.filter(function (value) {showCityList = value.citylistshowCityListTemp = showCityList.filter(function (val) {return (val.indexOf(city) > -1)})value.citylist = showCityListTempreturn value.citylist.length > 0})this.showCity = showCityif (showCity.length === 0) {let _showCityContent = document.getElementById('showCityContent')_showCityContent.innerText = '查询不到结果'_showCityContent.setAttribute('class', 'tipShow')} else {document.getElementById('showCityContent').innerText = ''}}

到这里,基本的的城市算是做完了。

转载请注明原文地址 谢谢!

vue-动手做个选择城市相关推荐

  1. Android上实现一个简单的天气预报APP(七) 切换到新的界面(选择城市界面)

    学习参考资源:https://www.gitbook.com/book/zhangqx/mini-weather/details 前面我们已经设置好了基本界面,并可以从网络上实时获取天气预报信息并解析 ...

  2. 如果你选择城市创业的话,可以先从小本生意做起

    如果你选择城市创业的话,可以先从小本生意做起,比如加盟饮食店,加盟费一般不高,也可以搞加工或者物流快递类的创业项目,一般就是要根据自身优势,多和当地的经验人士取经,相信结果不会太差.总之要看你自己想做 ...

  3. 移动端vue+vant+高德地图实现拖拽选址,周边选址,搜索选址,自动定位,选择城市功能,获取地址经纬度,详细地址

    效果图: 在public文件夹下的index.html文件中head标签下加上script标签如下: <script type="text/javascript">wi ...

  4. 一个简单的VUE选择城市组件

    首先看下效果: ps: 请忽略上面的水印 该组件基于vue + iview搭建而成,可以根据需求自行修改,接下来就是组件的整体的说明了: 一.目录结构 这是一个常规的VUE的目录的结构,我们使用的文件 ...

  5. (超级详细)Vue项目实战App3- - - 城市选择

    一.路由配置 编辑'index.js'文件(路径:src/router/index.js) - - - 创建路由的路径 import Vue from 'vue' import VueRouter f ...

  6. 自己动手做一个上传JSPatch补丁代码的Mac应用

    本文来自简书,原文地址:http://www.jianshu.com/p/efb4bbe72f64 卷首语:自己动手做 JSPatch 补丁代码的上传下发,补丁代码采用 RSA非对称加密 ,安全性有保 ...

  7. 开关面板如何自己印字_如何自己动手做一个智能开关

    现在的智能家居这么火,对于想自己动手的小伙伴们来说,都想自己去做一些家里使用 的智设备.现在的中国不缺卖唱卖惨的,缺的是能动手创造一些能实际使用的而不是哗众取宠的人,天天喊着要反击外国技术封锁.那么我 ...

  8. 「雕爷学编程」Arduino动手做(26)——4X4矩阵键盘模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  9. 「雕爷学编程」Arduino动手做(22)——8X8 LED点阵MAX7219屏

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  10. 【雕爷学编程】Arduino动手做(16)---数字触摸传感器

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

最新文章

  1. hdu A + B Problem II(大数相加,数组实现)
  2. 世界上最大的黑客 Party,有关“DEFCON”的十个冷知识
  3. 集群空间服务器接收不到消息,解决Redis集群条件下键空间通知服务器接收不到消息的问题...
  4. linux c http下载 带确认 进度条
  5. PHP的echo和print小谈
  6. 080_html5 Canvas和SVG
  7. GetGeneratedKeysHelper 与反射
  8. 王者-甄别同一板块强弱股的方法【真假美猴王】
  9. 研究表明:学生经常登录Facebook 课程不及格的概率上升(意译)
  10. WIN10系统安装visio2016失败后修改系统设置,安全
  11. ai如何复制文字并对齐_AI文字怎么对齐? ai文字排版的方法
  12. 如何用计算机计算log除法,对数计算器_如何使用计算器计算对数
  13. Linux基础教程 (第二版) 第2版
  14. 大内高手 内存管理器
  15. matlab 层次聚类不均等巨雷,matlab层次聚类
  16. 智慧小区智慧物业管理系统一体化解决方案
  17. 第九届河南省程序设计大赛 D 导弹发射
  18. 注册ActiveX控件简单方法及控件未被正确授权解决方案
  19. 判断两个数之间是否互质
  20. 35岁程序员危机,有何破解之法

热门文章

  1. pytorch实用工具总结(GFLOPs如何计算)
  2. 面试题,如果上司交代的任务你肯定完成不了,你会怎么处理?
  3. Python+Django开发游戏充值管理后台
  4. 如何设置excel表格表头冻结_excel表格冻结表头怎么设置
  5. latex:表格排版示例
  6. Second season seventeenth episode,Chandler gets a new roommate
  7. python实现遗传算法
  8. LimeSDR实验教程(14) GSM嗅探
  9. 计算机用户目录是什么,c盘里面users是什么文件夹
  10. (10.1.4)拟物设计