Alphabel.vue字母模块滚动的监听
#添加3个touch事件绑定,因为把cities的值push到letters里了,所以原来循环的cities就变为letters, key值变为item值
<ul class="list">
<li class="item"
v-for="item of letters"
:key="item"
:ref="item"
@click="handleLetterClick"
@touchstart="handleTouchStart"
@touchmove="handleTouchMove"
@touchend="handleTouchEnd">
{{item}}
</li>
</ul>
#因为cities是个对象,而根据下标找到对应的字母,需要数组存储字母列表,在计算属性computed里定义这个数组
computed:{
//构造出letters计算属性,把cities的值push到letters里返回一个数组[‘A’,'B'...]
letters(){
const letters = []
for (let i in this.cities){
letters.push(i)
}
return letters
}
},
#在touchstart之后才可以触发move事件
data(){
return{
//所以定义一个标识位touchStatus
touchStatus:false
}
},
#methods里添加3个touch方法
//当手指触摸的时候
handleTouchStart() {
this.touchStatus = true
},
//当手指滑动的时候
handleTouchMove(e){
if(this.touchStatus){
//找到A元素加[0]才是指DOM元素,通过offsetTop获取它距搜索边框底部的高度
const styrtY = this.$refs['A'][0].offsetTop
//事件对象里touches数组第0项表示手指的一些信息,clientY代表手指距离顶部的高度,再减去顶部和搜索的高度79 = 手指距离距搜索边框底部的高度
const touchY = e.touches[0].clientY - 79
//touchY-styrtY算出当前手指的手指距离字母A的高度/字母的高度20 = 向下取整(字母所排的顺序) = index(当前字母的下标)
const index = Math.floor((touchY -styrtY)/20)
//取到字母change一个事件给外部
if(index >= 0 && index < this.letters.length){
this.$emit('change',this.letters[index])
}
}
},
//当结束滑动
handleTouchEnd(){
this.touchStatus = false
}