vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新

下面是一个完整的攻略,分为以下五个步骤:

下面是一个完整的攻略,分为以下五个步骤:

1. 数据来源与处理

首先要确定歌手列表数据的来源,比如可以通过接口获取,或者在本地以json文件的形式存储。所获取到的数据需要进行处理,具体来说就是根据歌手的姓名的首字母对其进行分组。可以使用lodash等工具库的groupBy方法进行处理,得到一个以字母为 key、歌手列表为 value 的对象。

示例代码:

import axios from 'axios'
import { groupBy } from 'lodash'

const fetchSingers = () => {
  return axios.get('/api/singers')
    .then(res => {
      const data = res.data
      const singers = data.map(item => ({
        id: item.id,
        name: item.name,
        img: item.img
      }))
      return singers
    })
}

const processData = singers => {
  const groupObj = groupBy(singers, item => {
    return item.name.slice(0, 1)
  })
  // 排序
  const groups = Object.keys(groupObj).sort()
  const list = groups.map(key => {
    return {
      title: key,
      items: groupObj[key].sort((a, b) => {
        return a.name.localeCompare(b.name, 'zh-Hans-CN', { sensitivity: 'accent' })
      })
    }
  })
  return {list, groups}
}

const {list, groups} = await fetchSingers().then(processData)

2. 渲染歌手列表

在Vue组件中,使用v-for循环渲染各个字母组以及其对应的歌手列表。渲染过程中需要注意的细节包括:列表样式、列表项点击事件、当前项样式等。可以使用Scroll组件实现歌手列表区域的纵向滚动效果。

示例代码:

<!-- 歌手列表区域 -->
<Scroll :data="list">
  <div v-for="(group, index) in list" :key="index">
    <!-- 字母组标题 -->
    <div class="group-title">{{group.title}}</div>
    <!-- 歌手列表 -->
    <ul>
      <li v-for="(item, index) in group.items" :key="index"
          @click="selectSinger(item)">
        <div class="avatar"><img :src="item.img" alt=""></div>
        <div class="name">{{item.name}}</div>
      </li>
    </ul>
  </div>
</Scroll>

3. 实时更新字母排序下拉栏

下拉排序栏是一个简单的UI组件,可通过构造器方式实现。它需要实时监听歌手列表区域的纵向滚动事件,根据当前滚动的位置计算出当前列表项的首字母对应的字母组,然后高亮对应的字母。

示例代码:

<!-- 歌手字母排序下拉栏 -->
<Alphabet :groups="groups" @change="handleAlphabetChange"/>
// Alphabet组件
export default {
  props: {
    groups: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      currentIndex: 0
    }
  },
  methods: {
    handleTouchStart(event) {
      // 获取触摸的字母
      const startY = event.touches[0].clientY
      const rect = this.$refs['alphabet'].getBoundingClientRect()
      const index = Math.floor((startY - rect.top) / rect.height * this.groups.length)
      if (index >= 0 && index < this.groups.length) {
        this.currentIndex = index
        this.$emit('change', this.groups[this.currentIndex])
      }
    },
    handleTouchMove(event) {
      event.preventDefault()
      // 获取触摸的字母
      const touchY = event.touches[0].clientY
      const rect = this.$refs['alphabet'].getBoundingClientRect()
      const index = Math.floor((touchY - rect.top) / rect.height * this.groups.length)
      if (index >= 0 && index < this.groups.length && this.currentIndex !== index) {
        this.currentIndex = index
        this.$emit('change', this.groups[this.currentIndex])
      }
    }
  }
}

4. 滚动歌手列表到对应字母组

当点击或滑动下拉栏的字母时,需要找到对应的字母组在歌手列表区域的位置,然后通过Scroll组件的scrollToElement方法滚动到对应位置。相应的滚动需要在nextTick中执行,以确保DOM更新后滚动生效。

示例代码:

handleAlphabetChange(group) {
  if (group) {
    const ele = this.$refs.listGroup[group.title][0]
    this.$refs.listScroller.scrollToElement(ele, 300)
  }
}

5. 样式优化

最后一步是样式优化的问题,包括:列表和字母栏的布局、样式细节等。这里不再赘述,可以根据具体需求进行设计和调整。

以上就是Vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新的完整攻略。

本文标题为:vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新

基础教程推荐