實現兩個聯動
一是點擊右側字母的時候,城市列表出現相應首字母下的城市
二是鼠標在字母表上滑動的時候,城市列表實時跟着變化
一.點擊字母出現相應的列表,給每個字母設置handleLetterClick事件
-
<template>
-
<div>
-
<ul class="list">
-
<li class="item"
-
v-for="item of letters"
-
:key="item"
-
@click="handleLetterClick"
-
@touchstart="handleTouchStart"
-
@touchmove="handleTouchMove"
-
@touchend="handleTouchEnd"
-
:ref="item"
-
>
-
{{item}}
-
</li>
-
</ul>
-
</div>
-
</template>
獲取當前點擊的字母,傳給父組件city,再由city組件傳給城市列表list組件,再根據字母滾動到相應的內容
-
<city-alphabet :cities="cities" @change="handleLetterChange"></city-alphabet>
-
handleLetterChange(letter){
-
this.letter=letter
-
}
城市列表list組件獲取到父組件傳過來的letter,並監聽letter的變化
-
props:{
-
hot:Array,
-
cities:Object,
-
letter:String
-
},
-
watch:{
-
//監聽letter,當letter發生變化時觸發
-
letter(){
-
if(this.letter){
-
const element=this.$refs[this.letter][0]
-
this.scroll.scrollToElement(element)
-
}
-
}
-
}
二.當鼠標滑動的時候,城市列表實時地發生變化
實現原理:其實和點擊的時候一樣,當鼠標滑動時,實時地獲取滑動的時候所經過的字母,再把字母傳給城市列表list組件,再跳轉到相應的元素
((鼠標距頂部的距離一79)一A字母距父元素的距離)/每個字母的高度20 計算此時鼠標所在的第幾個字母
-
<template>
-
<div>
-
<ul class="list">
-
<li class="item"
-
v-for="item of letters"
-
:key="item"
-
@click="handleLetterClick"
-
@touchstart="handleTouchStart"
-
@touchmove="handleTouchMove"
-
@touchend="handleTouchEnd"
-
:ref="item"
-
>
-
{{item}}
-
</li>
-
</ul>
-
</div>
-
</template>
-
-
<script>
-
export default {
-
name:"CityAlphabet",
-
data (){
-
return{
-
touchStatus:false,
-
startY:0,
-
//函數截流,提高性能
-
timer:null
-
}
-
},
-
updated(){
-
//A字母元素到父元素頂部的距離
-
this.startY=this.$refs["A"][0].offsetTop
-
-
},
-
props:{
-
cities:Object
-
},
-
computed: {
-
letters () {
-
const letters = []
-
for (let i in this.cities) {
-
letters.push(i)
-
}
-
return letters
-
}
-
},
-
methods:{
-
handleLetterClick(e){
-
//把字母傳給父親,父親再給List
-
//e.target.innerText獲取里邊的內容
-
this.$emit('change',e.target.innerText)
-
},
-
handleTouchStart(){
-
this.touchStatus=true
-
},
-
handleTouchMove(e){
-
if(this.touchStatus){
-
if(this.timer){
-
clearTimeout(this.timer)
-
}
-
this.timer=setTimeout(() => {
-
//touchstart事件:當手指觸摸屏幕時候觸發,即使已經有一個手指放在屏幕上也會觸發。
-
//touchmove事件:當手指在屏幕上滑動的時候連續地觸發。在這個事件發生期間,調用preventDefault()事件可以阻止滾動。
-
//touchend事件:當手指從屏幕上離開的時候觸發。
-
//touches:表示當前跟蹤的觸摸操作的touch對象的數組。
-
//clientY:觸摸目標在視口中的y坐標。
-
//79是綠色底部到頂部的距離
-
const touchY=e.touches[0].clientY-79
-
//每個字母的高度是20
-
const index=Math.floor((touchY-this.startY) / 20)
-
console.log(touchY)
-
if(index >= 0&&index < this.letters.length){
-
this.$emit('change',this.letters[index])
-
}
-
}, 16);
-
-
}
-
},
-
handleTouchEnd(){
-
this.touchStatus=false
-
}
-
}
-
-
}
-
</script>