当前位置:首页 > 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>

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

相关文章

h5 实现列表

h5 实现列表

列表实现方法 在HTML5中,可以通过多种方式实现列表,包括无序列表、有序列表和自定义列表。以下是具体的实现方法。 无序列表 无序列表使用<ul>标签,列表项使用<li>标签…

vue实现列表循环

vue实现列表循环

列表循环的实现方式 在Vue中实现列表循环主要依赖于v-for指令,该指令基于源数据多次渲染元素或模板块。 基础数组循环 使用v-for遍历数组时,语法为item in items或(item, i…

uniapp 内容列表

uniapp 内容列表

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

vue 实现商品列表

vue 实现商品列表

实现商品列表的基本结构 在Vue中实现商品列表,通常需要创建一个组件来展示商品数据。可以使用v-for指令循环渲染商品列表,并通过数据绑定动态显示商品信息。 <template> &…

vue实现列表点击

vue实现列表点击

Vue 实现列表点击的方法 在 Vue 中实现列表点击功能通常涉及 v-for 渲染列表和 v-on(或 @)绑定点击事件。以下是几种常见实现方式: 基础列表点击 使用 v-for 渲染列表,并通过…

vue如何实现列表

vue如何实现列表

使用 v-for 指令渲染列表 在 Vue 中,可以通过 v-for 指令动态渲染列表数据。v-for 需要特殊的语法形式 item in items,其中 items 是源数据数组,item 是数组…