实现列表的字母排序

🚀 个人简介:某大型测绘遥感企业资深Webgis开发工程师,软件设计师(中级)、优快云优质创作者
💟 作 者:柳晓黑胡椒❣️
📝 专 栏:vue实践
🌈 若有帮助,还请关注点赞收藏,不行的话我再努努力💪💪💪

当列表数据过长,需要通过边上的字符按钮点击,通过滚动条跳转到相对于的位置

可以通过 scrollTop 动态的调整滚动条实现

具体思路:

效果链接
1.通过当前 findIndex 方法获取第一个出现该字符的 index
2.通过调整 scrollTop 使定位到目标列表

代码

代码链接

<template>
  <div>
    <h3>模拟音乐列表字母定位</h3>
    <ul class="list" ref="listRef">
      <li class="list-item" :style="{height:itemHeight+'px'}" v-for="(item,index) of data" :key="index">{{ item.label }}</li>
    </ul>
    <button @click="clickBtn('A')">A</button>
    <button @click="clickBtn('B')">B</button>
  </div>
</template>

<script lang="ts" setup>
import {reactive, toRefs, ref} from "vue";
import _ from "lodash";
//  refs
const listRef = ref<any>({})

const model = reactive({
  data: <any>[],
  itemHeight: 30
})
const {data,itemHeight} = toRefs(model)

const clickBtn = (str: string) => {
  const index = model.data.findIndex((item: any) => item.label[0].toLowerCase() === str.toLowerCase())
  console.log(listRef.scrollTop, 2222, index)
  listRef.value.scrollTop = index * model.itemHeight;
}

// 异步数据
setTimeout(() => {
  model.data =
      [
        ..._.fill(new Array(100), {label: 'Asss'}),
        ..._.fill(new Array(100), {label: 'Bsss'})
      ]
  console.log(model.data)
}, 1000)

</script>

<style lang="scss" scoped>
.list {
  width: 500px;
  height: 400px;
  padding: 0 20px;
  margin: 0;
  list-style: none;
  overflow-y: auto;
  border: 1px solid;

  .list-item {
    //height: v-bind(itemHeight);
    box-sizing: border-box;
  }
}

btn {
  padding: 10px;
  border: 1px solid;
  border-radius: 5px;
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳晓黑胡椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值