当前位置:首页 > 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;
    }, {});
  }
}

带索引的列表渲染

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

<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>

滚动定位功能

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

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
}

完整组件示例

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

vue实现城市列表

<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>

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

相关文章

uniapp 内容列表

uniapp 内容列表

uniapp 内容列表的实现方法 在uniapp中实现内容列表通常需要结合组件和数据绑定。以下是一个常见的方法: 模板部分 <template> <view class="c…

vue实现影片列表

vue实现影片列表

Vue 实现影片列表 使用 Vue CLI 创建项目 确保已安装 Vue CLI,通过以下命令创建新项目: vue create movie-list cd movie-list 安装依赖 根据…

weex  vue 实现列表

weex vue 实现列表

weex + Vue 实现列表的方法 使用<list>和<cell>组件 在weex中,列表通常通过<list>和<cell>组件实现。<list…

vue实现列表轮播

vue实现列表轮播

实现列表轮播的基本思路 使用Vue实现列表轮播的核心在于动态更新列表数据,结合CSS动画或过渡效果实现平滑切换。通常有两种实现方式:基于CSS动画的无限循环轮播和基于Vue数据绑定的动态更新轮播。…

vue虚拟滚动列表实现

vue虚拟滚动列表实现

虚拟滚动列表的实现原理 虚拟滚动(Virtual Scrolling)通过仅渲染可视区域内的元素来优化长列表性能。核心思想是根据滚动位置动态计算可见项,减少DOM节点数量。 基于vue-virtua…

vue实现菜单列表

vue实现菜单列表

Vue 实现菜单列表的方法 使用 v-for 动态渲染菜单项 通过 Vue 的 v-for 指令可以动态渲染菜单项,数据通常存储在组件的 data 属性中。 <template> &…