当前位置:首页 > VUE

vue怎么实现通讯录

2026-01-12 06:48:20VUE

Vue实现通讯录的方法

数据结构和状态管理

通讯录通常需要管理联系人列表,可以使用Vue的dataVuex/Pinia进行状态管理。基础数据结构示例:

data() {
  return {
    contacts: [
      { id: 1, name: '张三', phone: '13800138000', group: '家人' },
      { id: 2, name: '李四', phone: '13900139000', group: '同事' }
    ],
    newContact: { name: '', phone: '', group: '' },
    searchQuery: ''
  }
}

列表渲染和搜索功能

使用v-for渲染联系人列表,结合计算属性实现搜索过滤:

computed: {
  filteredContacts() {
    return this.contacts.filter(contact => 
      contact.name.includes(this.searchQuery) || 
      contact.phone.includes(this.searchQuery)
    )
  }
}

模板部分:

vue怎么实现通讯录

<input v-model="searchQuery" placeholder="搜索联系人">
<ul>
  <li v-for="contact in filteredContacts" :key="contact.id">
    {{ contact.name }} - {{ contact.phone }}
  </li>
</ul>

分组显示

按分组归类显示联系人,可使用reduce处理数据:

computed: {
  groupedContacts() {
    return this.contacts.reduce((groups, contact) => {
      const group = contact.group || '未分组'
      groups[group] = groups[group] || []
      groups[group].push(contact)
      return groups
    }, {})
  }
}

模板示例:

vue怎么实现通讯录

<div v-for="(groupContacts, groupName) in groupedContacts" :key="groupName">
  <h3>{{ groupName }}</h3>
  <ul>
    <li v-for="contact in groupContacts" :key="contact.id">
      {{ contact.name }} - {{ contact.phone }}
    </li>
  </ul>
</div>

字母索引导航

实现右侧字母快速导航需要:

  1. 提取所有分组首字母
  2. 监听点击事件滚动到对应分组

计算首字母列表:

computed: {
  groupLetters() {
    return Object.keys(this.groupedContacts)
      .map(group => group.charAt(0).toUpperCase())
      .filter((v, i, a) => a.indexOf(v) === i)
      .sort()
  }
}

完整组件示例

<template>
  <div class="address-book">
    <input v-model="searchQuery" placeholder="搜索联系人">

    <div class="index-bar">
      <span 
        v-for="letter in groupLetters" 
        :key="letter"
        @click="scrollToGroup(letter)"
      >
        {{ letter }}
      </span>
    </div>

    <div 
      v-for="(groupContacts, groupName) in filteredGroups" 
      :key="groupName"
      :ref="'group-'+groupName"
    >
      <h3>{{ groupName }}</h3>
      <ul>
        <li v-for="contact in groupContacts" :key="contact.id">
          {{ contact.name }} - {{ contact.phone }}
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      contacts: [...],
      searchQuery: ''
    }
  },
  computed: {
    filteredGroups() {
      // 实现搜索过滤后的分组逻辑
    },
    groupLetters() {
      // 返回首字母列表
    }
  },
  methods: {
    scrollToGroup(letter) {
      const group = this.$refs['group-'+letter]?.[0]
      group?.scrollIntoView({ behavior: 'smooth' })
    }
  }
}
</script>

进阶优化方向

  1. 使用Web Workers处理大量联系人数据的搜索和分组
  2. 添加虚拟滚动优化长列表性能
  3. 集成IndexedDB进行本地数据持久化
  4. 实现联系人编辑和删除功能
  5. 添加拼音库支持中文拼音搜索

实现通讯录核心在于合理组织数据结构,利用Vue的响应式特性和计算属性高效处理数据展示逻辑。根据项目复杂度可选择本地状态管理或引入Vuex/Pinia。

标签: 通讯录vue
分享给朋友:

相关文章

vue实现tab标签

vue实现tab标签

Vue 实现 Tab 标签的方法 使用动态组件和 v-for 渲染标签 通过 v-for 循环生成标签页标题,结合 v-bind:class 动态切换激活状态。使用 v-show 或动态组件 <…

vue实现访问量

vue实现访问量

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

vue怎么实现数据检测

vue怎么实现数据检测

Vue 数据检测的实现方式 Vue 通过响应式系统实现数据检测,核心机制基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3)。以下是具体实现方法: 基于 Vu…

vue实现无线滚动列表

vue实现无线滚动列表

无限滚动列表的实现方法 在Vue中实现无限滚动列表通常结合监听滚动事件和动态加载数据。以下是几种常见方法: 使用自定义指令 创建自定义指令v-infinite-scroll监听滚动事件: Vu…

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成…

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const BaseC…