Vue实现选择城市功能


Posted in Javascript onMay 27, 2017

查看完整的代码请到   我的github地址  https://github.com/qianyinghuanmie/vue2.0-demos

一、结果展示

Vue实现选择城市功能

二、前期准备:

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'自己要引入的文件或接口。

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

Vue实现选择城市功能

这样的话可以一次将字母列表和城市列表一起渲染出来。不过要想把对应的汉字都放到对应的字母后面,我们引入了一个插件,可以用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 = this
  for (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.length
   return 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 = id
  let obj = document.getElementById(id)
  let tip = document.getElementById('tip')
  tip.setAttribute('class', 'tipAppear')
  setTimeout(function () {
   tip.removeAttribute('class')
  }, 500)
  let oPos = obj.offsetTop
  return window.scrollTo(0, oPos - 36)
  },

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

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

3、实现搜索城市

Vue实现选择城市功能

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

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

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

Vue实现选择城市功能

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

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

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

查看完整的代码请到   我的github地址  https://github.com/qianyinghuanmie/vue2.0-demos

以上所述是小编给大家介绍的Vue实现选择城市功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS 实现获取打开一个界面中输入的值
Mar 19 Javascript
javascript使用正则表达式检测IP地址
Dec 03 Javascript
浅析Node.js实现HTTP文件下载
Aug 05 Javascript
JavaScript中的编码和解码函数
Feb 15 Javascript
vue指令以及dom操作详解
Mar 04 Javascript
jQuery实现下拉菜单的实例代码
Jun 19 jQuery
基于axios封装fetch方法及调用实例
Feb 05 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
Mar 21 Javascript
Vue三层嵌套路由的示例代码
May 05 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
Apr 23 jQuery
JavaScript中break、continue和return的用法区别实例分析
Mar 02 Javascript
js验证账户名是否重复
May 26 Javascript
使用 Node.js 对文本内容分词和关键词抽取
May 27 #Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 #Javascript
javascript回调函数的概念理解与用法分析
May 27 #Javascript
原生JavaScript实现的简单省市县三级联动功能示例
May 27 #Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
May 27 #Javascript
详细讲解vue2+vuex+axios
May 27 #Javascript
AngularJS获取json数据的方法详解
May 27 #Javascript
You might like
同一空间绑定多个域名而实现访问不同页面的PHP代码
2006/12/06 PHP
PHP实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
解析strtr函数的效率问题
2013/06/26 PHP
php基础教程
2015/08/26 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
PHP递归实现汉诺塔问题的方法示例
2017/11/25 PHP
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
js正则表达式replace替换变量方法
2016/05/21 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
Python实现新浪博客备份的方法
2016/04/27 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
TensorFlow平台下Python实现神经网络
2018/03/10 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
详解python pandas 分组统计的方法
2019/07/30 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
在购买印度民族服饰:Soch
2020/09/15 全球购物
什么是类的返射机制
2016/02/06 面试题
西部世纪.net笔试题面试题
2014/04/03 面试题
历史学专业毕业生求职信
2013/09/27 职场文书
在校硕士自我鉴定
2014/01/23 职场文书
创建服务型党组织实施方案
2014/02/25 职场文书
见习期自我鉴定范文
2014/03/19 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
母亲节感言
2015/08/03 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书