当前位置:首页 > VUE

vue实现index list

2026-02-18 23:44:19VUE

实现 Index List 的基本思路

在 Vue 中实现 Index List(索引列表)通常需要结合字母或数字索引,并支持快速跳转到对应分组。常见场景如联系人列表、城市选择等。

vue实现index list

安装依赖

使用 better-scrollvue-better-scroll 库可以简化滚动逻辑。安装命令:

npm install better-scroll --save

组件结构设计

创建两个主要组件:

  • IndexList.vue:主组件,包含列表和右侧索引栏
  • IndexSection.vue:每个索引分组的子组件

核心代码实现

IndexList.vue

<template>
  <div class="index-list" ref="wrapper">
    <div class="content">
      <index-section 
        v-for="(group, index) in data" 
        :key="index"
        :title="group.title"
        :items="group.items"
      />
    </div>
    <div class="index-bar">
      <ul>
        <li 
          v-for="(item, index) in indexList" 
          :key="index"
          @touchstart="handleTouchStart"
          @touchmove.prevent="handleTouchMove"
          @touchend="handleTouchEnd"
        >
          {{ item }}
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
import IndexSection from './IndexSection'
import BScroll from 'better-scroll'

export default {
  components: { IndexSection },
  props: {
    data: {
      type: Array,
      required: true
    }
  },
  data() {
    return {
      scroll: null,
      touch: {
        y1: 0,
        y2: 0
      }
    }
  },
  computed: {
    indexList() {
      return this.data.map(group => group.title)
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.scroll = new BScroll(this.$refs.wrapper, {
        probeType: 3
      })
    })
  },
  methods: {
    handleTouchStart(e) {
      const index = e.target.innerText
      this.touch.y1 = e.touches[0].pageY
      this.scrollTo(index)
    },
    handleTouchMove(e) {
      this.touch.y2 = e.touches[0].pageY
      const delta = (this.touch.y2 - this.touch.y1) / 20 | 0
      const index = this.indexList.indexOf(e.target.innerText)
      const targetIndex = index + delta
      if (targetIndex >= 0 && targetIndex < this.indexList.length) {
        this.scrollTo(this.indexList[targetIndex])
      }
    },
    handleTouchEnd() {
      // 触摸结束处理
    },
    scrollTo(index) {
      const target = document.querySelector(`[data-index="${index}"]`)
      if (target) {
        this.scroll.scrollToElement(target, 300)
      }
    }
  }
}
</script>

IndexSection.vue

<template>
  <div class="index-section" :data-index="title">
    <div class="index-title">{{ title }}</div>
    <ul>
      <li v-for="(item, index) in items" :key="index">
        {{ item }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  props: {
    title: {
      type: String,
      required: true
    },
    items: {
      type: Array,
      required: true
    }
  }
}
</script>

样式设计

/* IndexList.vue 样式 */
.index-list {
  position: relative;
  height: 100%;
  overflow: hidden;
}

.index-bar {
  position: absolute;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  background: rgba(0, 0, 0, 0.1);
  border-radius: 10px;
  padding: 10px 5px;
}

.index-bar li {
  padding: 3px;
  text-align: center;
  color: #333;
}

/* IndexSection.vue 样式 */
.index-section {
  padding: 0 10px;
}

.index-title {
  padding: 5px 0;
  font-weight: bold;
  background: #f5f5f5;
}

.index-section ul li {
  padding: 10px 0;
  border-bottom: 1px solid #eee;
}

使用示例

<template>
  <index-list :data="listData" />
</template>

<script>
import IndexList from './components/IndexList'

export default {
  components: { IndexList },
  data() {
    return {
      listData: [
        {
          title: 'A',
          items: ['Apple', 'Amazon']
        },
        {
          title: 'B',
          items: ['Banana', 'Baidu']
        },
        // 更多数据...
      ]
    }
  }
}
</script>

性能优化建议

  1. 对于大数据量使用虚拟滚动
  2. 添加节流函数防止快速滑动时频繁触发事件
  3. 考虑添加当前索引高亮提示
  4. 移动端适配触摸事件处理

这种实现方式结合了 BetterScroll 的平滑滚动和 Vue 的响应式特性,能够创建流畅的索引列表体验。根据实际需求可以进一步扩展功能,如添加搜索框、分组折叠等。

vue实现index list

标签: vueindex
分享给朋友:

相关文章

vue实现访问量

vue实现访问量

Vue 实现访问量统计的方法 使用前端计数 在 Vue 中可以通过简单的计数器实现页面访问量的统计。这种方法适合小型项目或演示用途。 // 在 Vue 组件中 data() { return…

vue实现页面截屏

vue实现页面截屏

使用html2canvas库实现截屏 html2canvas是一个流行的JavaScript库,可以将DOM元素转换为Canvas图像。在Vue项目中安装html2canvas: npm inst…

vue 实现表单

vue 实现表单

Vue 表单实现方法 Vue.js 提供了多种方式实现表单,包括双向数据绑定、表单验证和动态表单生成。以下是常见的实现方法: 基础表单绑定 使用 v-model 指令实现表单元素与数据的双向绑定:…

vue实现选择

vue实现选择

Vue 实现选择功能的方法 在 Vue 中实现选择功能可以通过多种方式完成,以下介绍几种常见的实现方法。 使用 v-model 绑定单选 通过 v-model 可以轻松实现单选功能。以下是一个简单…

实现vue框架

实现vue框架

Vue框架的基本实现 Vue是一个渐进式JavaScript框架,用于构建用户界面。以下是实现Vue框架的基本步骤: 安装Vue 通过CDN引入Vue是最简单的方式: <script src…

vue实现发帖

vue实现发帖

使用 Vue 实现发帖功能 前端实现 创建发帖表单组件,包含标题和内容输入框,以及提交按钮。使用 v-model 绑定表单数据。 <template> <div>…