实现两个联动

一是点击右侧字母的时候,城市列表出现相应首字母下的城市

二是鼠标在字母表上滑动的时候,城市列表实时跟着变化

一.点击字母出现相应的列表,给每个字母设置handleLetterClick事件

  1. <template>
  2.     <div>
  3.        <ul class="list">
  4.            <li class="item"
  5.             v-for="item of letters"
  6.             :key="item"
  7.              @click="handleLetterClick"
  8.              @touchstart="handleTouchStart"
  9.              @touchmove="handleTouchMove"
  10.              @touchend="handleTouchEnd"
  11.              :ref="item"
  12.              >
  13.              {{item}}
  14.              </li>
  15.        </ul>
  16.     </div>
  17. </template>

获取当前点击的字母,传给父组件city,再由city组件传给城市列表list组件,再根据字母滚动到相应的内容

  1. <city-alphabet :cities="cities" @change="handleLetterChange"></city-alphabet>
  2. handleLetterChange(letter){
  3.               this.letter=letter
  4.           }

城市列表list组件获取到父组件传过来的letter,并监听letter的变化

  1. props:{
  2.            hot:Array,
  3.            cities:Object,
  4.            letter:String
  5.        },
  6.  watch:{
  7.          //监听letter,当letter发生变化时触发
  8.          letter(){
  9.             if(this.letter){
  10.                 const element=this.$refs[this.letter][0]
  11.                 this.scroll.scrollToElement(element)
  12.             }
  13.          }
  14.        }

二.当鼠标滑动的时候,城市列表实时地发生变化

实现原理:其实和点击的时候一样,当鼠标滑动时,实时地获取滑动的时候所经过的字母,再把字母传给城市列表list组件,再跳转到相应的元素

((鼠标距顶部的距离一79)一A字母距父元素的距离)/每个字母的高度20 计算此时鼠标所在的第几个字母

  1. <template>
  2.     <div>
  3.        <ul class="list">
  4.            <li class="item"
  5.             v-for="item of letters"
  6.             :key="item"
  7.              @click="handleLetterClick"
  8.              @touchstart="handleTouchStart"
  9.              @touchmove="handleTouchMove"
  10.              @touchend="handleTouchEnd"
  11.              :ref="item"
  12.              >
  13.              {{item}}
  14.              </li>
  15.        </ul>
  16.     </div>
  17. </template>
  18.  
  19. <script>
  20.     export default {
  21.         name:"CityAlphabet",
  22.         data (){
  23.             return{
  24.                 touchStatus:false,
  25.                 startY:0,
  26.                 //函数截流,提高性能
  27.                 timer:null
  28.             }
  29.         },
  30.         updated(){
  31.             //A字母元素到父元素顶部的距离
  32.            this.startY=this.$refs["A"][0].offsetTop
  33.  
  34.         },
  35.         props:{
  36.             cities:Object
  37.         },
  38.          computed: {
  39.             letters () {
  40.             const letters = []
  41.             for (let i in this.cities) {
  42.                 letters.push(i)
  43.             }
  44.             return letters
  45.             }
  46.         },
  47.         methods:{
  48.             handleLetterClick(e){
  49.                //把字母传给父亲,父亲再给List
  50.                //e.target.innerText获取里边的内容
  51.                this.$emit('change',e.target.innerText)
  52.             },
  53.             handleTouchStart(){
  54.                 this.touchStatus=true
  55.             },
  56.             handleTouchMove(e){
  57.                 if(this.touchStatus){
  58.                    if(this.timer){
  59.                        clearTimeout(this.timer)
  60.                    }
  61.                    this.timer=setTimeout(() => {
  62.                        //touchstart事件:当手指触摸屏幕时候触发,即使已经有一个手指放在屏幕上也会触发。
  63.    //touchmove事件:当手指在屏幕上滑动的时候连续地触发。在这个事件发生期间,调用preventDefault()事件可以阻止滚动。
  64.   //touchend事件:当手指从屏幕上离开的时候触发。
  65.                        //touches:表示当前跟踪的触摸操作的touch对象的数组。
  66.                        //clientY:触摸目标在视口中的y坐标。
  67.                        //79是绿色底部到顶部的距离
  68.                        const touchY=e.touches[0].clientY-79
  69.                        //每个字母的高度是20
  70.                        const index=Math.floor((touchY-this.startY) / 20)
  71.                        console.log(touchY)
  72.                         if(index >= 0&&index < this.letters.length){
  73.                             this.$emit('change',this.letters[index])
  74.                         }
  75.                    }, 16);
  76.  
  77.                 }
  78.             },
  79.             handleTouchEnd(){
  80.                 this.touchStatus=false
  81.             }
  82.         }
  83.  
  84.     }
  85. </script>

vue 城市列表与字母表联动的更多相关文章

  1. Vue2.5开发去哪儿网App 城市列表开发之 兄弟组件间联动及列表性能优化

    一,  兄弟组件间联动 1.  点击城市字母,左侧对应显示 给遍历的 字母 添加一个点击事件: Alphabet.vue @click="handleLetterClick" ha ...

  2. vue实现城市列表选择

    成果展示 最后的成果就是下面所展示的内容,因为gif图没有做,只能截图所展示,接下来,会带着大家一步一步的完成下面功能,脚手架搭建和node安装在本次案例不会讲解,如果了解,可以在我的博客园找到有详细 ...

  3. 基于MVC4+EasyUI的Web开发框架经验总结(7)--实现省份、城市、行政区三者联动

    为了提高客户体验和进行一些技术探索,现在正准备把我自己的客户关系管理系统CRM在做一个Web的版本,因此对基于MVC的Web界面继续进行一些研究和优化,力求在功能和界面上保持和Winform一致,本文 ...

  4. vue-cli 3.0 实现A-Z字母滑动选择城市列表

    项目地址: https://github.com/caochangkui/vue-cli3 项目代码: 城市列表首页: City.vue <template> <div id=&qu ...

  5. 用vue实现省市县三级联动

    我真的没想到这个会困扰到我.最开始以为,不就是直接找个简单的插件就实现了吗,jquery插件找了几个,都没有达到目的. 需求是这样的: 点击input框,弹出一个popup,然后可以滚动选择省,市,县 ...

  6. vue移动端地址三级联动组件(一)

    vue移动端地区三级联动 省,市,县.用的vue+mintUi 因为多级联动以及地区的规则比较多.正好有时间自己写了一个.有问题以及建议欢迎指出.涉及到dom移动,所以依赖vue+jquery.这边数 ...

  7. (转)基于MVC4+EasyUI的Web开发框架经验总结(7)--实现省份、城市、行政区三者联动

    http://www.cnblogs.com/wuhuacong/p/3841338.html 为了提高客户体验和进行一些技术探索,现在正准备把我自己的客户关系管理系统CRM在做一个Web的版本,因此 ...

  8. Android例子源码非第三方实现根据字母排序的城市列表

    values 下dimens.xml <resources> <!-- Default screen margins, per the Android Design guidelin ...

  9. 获取中央气象台API 完整城市列表简单方式

    activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android& ...

随机推荐

  1. RTT之柿饼UI

    console.log("strings")//向单片机通过串口发送日志提示信息 this.setData({label1: { value : "Hello RT-Th ...

  2. E. Swapping Characters 一个喳喳的做法

    http://codeforces.com/contest/903/problem/E 题意是,对于每个字符串都要交换两个位置的字符(id),使得结果所有字符串是一样的,输出那个字符串. 正解是,先比 ...

  3. 性能测试工具Jmeter06-Jmeter元件作用域和执行顺序

    元件作用域 8类可被执行的元件(测试计划与线程组不属于可执行元件),这些元件中,取样器(sampler)是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(配置元件 ...

  4. [转]如何在.NET MVC中使用jQuery并返回JSON数据

    本文转自:http://blog.sina.com.cn/s/blog_48e42dc90100xp1p.html 二.开始实践 - jQuery端 假设我们要从服务器端获取一个文章列表,并把文章条目 ...

  5. 在PHP中使用全局变量的几种方法

    简介 即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的.一些常见的全局数据有:程序设定类.数据库连接类.用户资料等等.有很多方法能够使这些数据 ...

  6. Linux Bird

    o / : 2GB o /boot: 200MB o /usr : 4GB o /var : 2GB o /tmp : 1GB o swap : 1GB o /home: 5GB,并且使用 LVM 模 ...

  7. C#中 计时器用法 运行时间

    有时候我们会需要计算某段代码运行的时间 比如一个sql查询,记录一段代码所花费的时间等等代码如下: System.Diagnostics.Stopwatch watch = new System.Di ...

  8. MySQL查询上个月数据

    SELECT * FROM order o WHERE o.payTime BETWEEN DATE_FORMAT(DATE_ADD(NOW(),INTERVAL MONTH),'%Y-%m-01') ...

  9. 详解HTML中的表单元素

    代码详讲: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  10. spring笔记2-注解

    一.属性与成员变量的区别: 属性:对外暴露的,getxxx/setxxx称为属性; 成员变量:private String name称为成员变量或字段 二.applicationContext.xml ...