当前位置:首页 > VUE

vue实现城市列表

2026-02-19 09:09:40VUE

Vue 实现城市列表

数据结构设计

使用数组存储城市数据,每个城市对象包含 idname 等字段:

const cities = [
  { id: 1, name: '北京' },
  { id: 2, name: '上海' },
  { id: 3, name: '广州' }
];

基础列表渲染

通过 v-for 指令循环渲染城市列表:

<template>
  <ul>
    <li v-for="city in cities" :key="city.id">
      {{ city.name }}
    </li>
  </ul>
</template>

按字母分组

对城市数据进行分组处理,使用计算属性实现:

computed: {
  groupedCities() {
    return this.cities.reduce((groups, city) => {
      const firstLetter = city.name.charAt(0).toUpperCase();
      if (!groups[firstLetter]) {
        groups[firstLetter] = [];
      }
      groups[firstLetter].push(city);
      return groups;
    }, {});
  }
}

带索引的列表渲染

结合字母分组和索引栏实现:

vue实现城市列表

<div class="city-list">
  <div v-for="(letter, index) in Object.keys(groupedCities)" :key="index">
    <h3>{{ letter }}</h3>
    <ul>
      <li v-for="city in groupedCities[letter]" :key="city.id">
        {{ city.name }}
      </li>
    </ul>
  </div>
</div>

添加索引导航

在右侧添加字母索引导航栏:

<div class="index-bar">
  <div 
    v-for="letter in Object.keys(groupedCities)" 
    :key="letter"
    @click="scrollToLetter(letter)"
  >
    {{ letter }}
  </div>
</div>

滚动定位功能

实现点击索引字母滚动到对应位置:

vue实现城市列表

methods: {
  scrollToLetter(letter) {
    const element = document.querySelector(`[data-letter="${letter}"]`);
    if (element) {
      element.scrollIntoView({ behavior: 'smooth' });
    }
  }
}

样式优化

添加基础样式提升用户体验:

.city-list {
  height: 500px;
  overflow-y: auto;
}
.index-bar {
  position: fixed;
  right: 10px;
  top: 50%;
  transform: translateY(-50%);
}

性能优化

对于大数据量场景,建议使用虚拟滚动技术:

import { RecycleScroller } from 'vue-virtual-scroller';
components: {
  RecycleScroller
}

完整组件示例

整合所有功能的完整组件代码:

<template>
  <div class="city-container">
    <RecycleScroller
      class="scroller"
      :items="flattenCities"
      :item-size="50"
      key-field="id"
    >
      <template v-slot="{ item }">
        <div v-if="item.isLetter" class="letter-header">
          {{ item.letter }}
        </div>
        <div v-else class="city-item">
          {{ item.name }}
        </div>
      </template>
    </RecycleScroller>

    <div class="index-bar">
      <div 
        v-for="letter in letters" 
        :key="letter"
        @click="scrollToLetter(letter)"
      >
        {{ letter }}
      </div>
    </div>
  </div>
</template>

标签: 城市列表
分享给朋友:

相关文章

vue实现列表添加

vue实现列表添加

使用 Vue 实现列表添加功能 数据绑定与列表渲染 在 Vue 中,通过 v-for 指令可以轻松实现列表渲染。首先需要定义一个数组来存储列表数据,并在模板中使用 v-for 循环渲染。 <t…

vue 实现列表多选

vue 实现列表多选

Vue 实现列表多选的方法 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动处理多选逻辑。适用于复选框(checkbox)场景。 <template> &…

vue列表展开实现

vue列表展开实现

Vue 列表展开实现方法 使用 v-for 和 v-show 控制展开状态 通过 v-for 渲染列表项,配合 v-show 控制子内容的显示隐藏。需要为每个列表项维护一个展开状态。 <…

vue实现伸缩列表

vue实现伸缩列表

Vue 实现伸缩列表的方法 使用 Vue 实现伸缩列表可以通过动态绑定样式或类名,结合过渡效果实现平滑的展开和收起动画。以下是几种常见实现方式: 动态绑定高度 通过 v-if 或 v-show 控制…

vue 实现列表更换

vue 实现列表更换

实现列表更换的方法 在Vue中实现列表更换通常涉及数据绑定和响应式更新。以下是几种常见的方法: 使用v-for指令绑定数组 通过修改数据源数组实现列表内容的动态更换。Vue的响应式系统会自动更新DO…

vue 实现列表全选

vue 实现列表全选

实现列表全选功能 在Vue中实现列表全选功能,可以通过绑定数据和事件处理来实现。以下是一个完整的示例代码: <template> <div> <in…