城市选择26字母页

去哪网做到根据字母选择城市的页面,记录一下这个的实现
首先在给循环出来的li元素上添加点击事件,通过点击事件获取到所点击的字母,通过$emit向父组件发送事件,并将获取到的元素传到父元素中

handleLetterClick (e) {this.$emit('change', e.target.innerHTML)
},

父元素接收并定义事件,现在data中初始化即将收到的字母,然后将子组件传过来的数据,赋值给data中定义的变量,再将数据通过绑定属性的方式传给另外一个组件

<city-list :letter="letter" :cities="cities" :hotCities="hotCities"></city-list>
<city-alphabet @change="handleLetterChange" :cities="cities"></city-alphabet>
data () {return {letter: ''}
},
methods: {handleLetterChange(letter){this.letter = letter}
}

将点击的字母传给list组件后,在props中接收,在list组件中给每个字母所在的area绑定ref属性

<div class="area" v-for="(item, key) of cities" :key="key" :ref="key">
props: {hotCities: Array,cities: Object,letter: String
},

接着通过watch监听letter的变化,一旦letter发生变化,就让页面滚动到该字母所在的位置。这里用到better-scroll的scrollToElement()

watch: {letter() {if(this.letter){const element = this.$refs[this.letter][0]  //获取到的字母所在的DOM元素this.scroll.scrollToElement(element)}}
}

接下来要实现的是滑动右侧的字母,左侧的城市跟着发生变化

(这里用到的计算方法是:获取首字母到顶部的距离,接着获取手指移动的位置到顶部的距离,用手指移动的距离减去首字母到顶部的距离之后除以一个字母的高度,就可以获取到手指具体移动到哪个字母上,然后让左侧滑动相应的字母)

在Alphabet组件中,给循环出来的item绑定三个事件:touchstart、touchmove、touchend

<li class="item" @touchstart="handleTouchStart"@touchend="handleTouchEnd"@touchmove="handleTouchMove"@click="handleLetterClick"v-for="item of letters":ref="item":key="item">{{item}}</li>

在js中获取到从父元素那里传过来的数据,使用计算属性对数据进行处理只要字母,并且在data中初始化touchStatus的状态,如果touchStatus的状态为true,才能触发移动事件,接着实现三个touch事件:

props: {cities: Object
},
data () {return {touchStatus: true}
},
computed: {letters () {const letters = []for(let i in this.cities) {letters.push(i)}return letters}
},
methods: {handleTouchStart() {this.touchStatus = true},handleTouchMove(e) {if (this.touchStatus) {const startY = this.$refs['A'][0].offsetTopconst touchY = e.touches[0].clientY - 79const index = Math.floor((touchY - startY) / 20)if (index >= 0 && index < this.letters.length) {this.$emit('change', this.letters[index])}}},handleTouchEnd(){this.touchStatus = false}
}

性能优化

上面的代码在每次触发touchmove事件的时候,都会计算startY = this.$refs[‘A’][0].offsettop,这就造成页面性能不好,此时可以在data中定义一个startY, 然后在updata钩子函数中计算startY的值

函数截流:
使用函数截流限制一个touchmove执行的频率

首先在data中定义一个timer: null, 接着在handleTouchMove函数中判断this.timer是否是空的,如果是就清除this.timer,将this.timer赋值为定时器setTimeout16秒执行一次

城市选择26字母页 性能优化(vue--去哪儿网)相关推荐

  1. ASP.NET 26个常用性能优化方法

    数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池(Co ...

  2. mysql获取时间戳_服了!阿里Mysql三位封神专家总结1200多页性能优化的千金良方...

    MYSQL(关系型数据库管理系统) MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应 ...

  3. Vue中常见的性能优化,项目优化/单页面性能优化,Vue中六大优化方案

    1.编码优化 1. 下里将所有的数据都放在data中,data中的教据都会增加getter和setter,会收集对应的watcher 2. vue在v-for时给每项元素绑定事件需要用事件代理 3. ...

  4. GitHub已标星72K阿里内部878页性能优化笔记限时免费

    前言 从我们迈入软件行业开始,性能的重要性就一再被强调. 在读书时,我们学习了大量的计算机专业课程,花了大量的时间去讨论怎么让我们计算机系统获得比较好的性能.而当我们去找工作时,大部分的公司在笔试和面 ...

  5. 26条MySQL性能优化的最佳经验

    今天,数据库操作越来越成为应用的性能瓶颈. 对于Web应用尤其明显. 关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情. 当我们去设计数据库表结构.查询表数据时,都 ...

  6. html5 报名页面,h5报名页性能优化总结

    最近做了报名页的第三期,就顺手对该项目进行了一些优化.先看h5报名页优化前后性能的对比吧: 优化后 优化前 . 优化前首屏的秒出率大概是30%左右,优化后的首屏秒出率大概是70%左右.ps:因为主要是 ...

  7. 前端开发性能优化-Vue响应式优化

    vue 开发里面数据响应相关优化 在Vue开发中,经常会有加载大量数据的场景,如果按照原本的流程加载,Vue会对data中的数据设置数据响应式,有时候根本不需要进行响应式,仅仅是对其进行展示,这时候就 ...

  8. 性能优化---vue路由懒加载和异步组件

    1.路由懒加载 整个网页默认是刚打开就去加载所有页面,路由懒加载就是只加载你当前点击的那个模块. 实现方式有: 1.require:加载组件. component: resolve => req ...

  9. Android性能优化之解密ZAKER,网易云阅读等新闻应用的内容缓存加载方式

    我是比较关注时事的, 每天都会花一点事件去看看新闻什么的. 因此类似ZAKER, 网易云阅读等这类的资讯聚合类应用是我的钟爱, 并且这些应用也确实做得很好,值得学习! 前面一篇文章, 讲了缓存的一些构 ...

最新文章

  1. 科学计算:Python VS. MATLAB(4)----图形系统简介
  2. vue打开后端html文件,vue中怎么请求后端数据?
  3. JavaScript的基本语法
  4. 『流畅的Python』第12章:继承的优缺点
  5. cellet 的相关线程
  6. 排序算法--(冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序)
  7. Spring MVC 基础及相关概念(基础一)
  8. 第十五:Pytest-html报告修改与汉化
  9. Spring MVC 反射对象和依赖注入
  10. 在ubuntu上安装Avant Window Navigator (AWN)
  11. vray渲染里服务器信息,vray云服务器渲染部署(vray怎么渲染su)
  12. 硬件设计论坛_零基础学硬件工程师到哪里去培训 上EDA365电子论坛
  13. html常用语言代码大全,常用的html代码大全
  14. Windows 强制删除文件及文件夹命令
  15. 阿里云服务器能怎么玩呢?
  16. 作为一名基层管理者如何利用情商管理自己和团队(二)
  17. 夜神模拟器Nox.exe支持命令行参数列表
  18. 我曾经爱过你---I Loved You
  19. DCA决策曲线的解读和代码实现
  20. 智能手表能测新冠?你的Fitbit可能是一个全功能脉搏血氧计

热门文章

  1. python数据清洗的方法有哪些_7步搞定数据清洗-Python数据清洗指南
  2. 文件加密(一) 凯撒加密(Caesar cipher)
  3. ExpRe[25] bash外的其它shell:zsh和fish
  4. 微信小程序:消息提示框
  5. 【latex】5 如何快速写出公式对应的latex公式
  6. Embarcadero Delphi XE317.0.4625.53395版安装过程
  7. 想要批量查询中通快递单号的话,要用什么辅助软件来实现
  8. 从零开始行人重识别学习笔记
  9. 1. 3:8译码器的设计。(输入端3位地址输入端 ,8个输出,s1 s2 s3共同构成使能端)
  10. linux下将qt程序打包成appimage程序