当前位置:首页 > VUE

vue实现菜单搜索

2026-02-17 01:30:42VUE

实现菜单搜索功能

在Vue中实现菜单搜索功能需要结合数据过滤和动态渲染。以下是具体实现方法:

基础实现方案

数据准备

data() {
  return {
    menuItems: [
      { id: 1, name: '首页', path: '/' },
      { id: 2, name: '产品', path: '/products' },
      { id: 3, name: '服务', path: '/services' },
      { id: 4, name: '关于我们', path: '/about' }
    ],
    searchQuery: ''
  }
}

模板部分

<template>
  <div>
    <input v-model="searchQuery" placeholder="搜索菜单..." />
    <ul>
      <li v-for="item in filteredMenu" :key="item.id">
        <a :href="item.path">{{ item.name }}</a>
      </li>
    </ul>
  </div>
</template>

计算属性过滤

computed: {
  filteredMenu() {
    return this.menuItems.filter(item => 
      item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
    )
  }
}

高级实现方案(支持嵌套菜单)

数据结构调整

vue实现菜单搜索

data() {
  return {
    menuItems: [
      {
        id: 1,
        name: '产品',
        children: [
          { id: 11, name: '手机' },
          { id: 12, name: '电脑' }
        ]
      },
      {
        id: 2,
        name: '服务',
        children: [
          { id: 21, name: '技术支持' },
          { id: 22, name: '咨询服务' }
        ]
      }
    ],
    searchQuery: ''
  }
}

递归过滤方法

methods: {
  filterMenu(items) {
    return items.filter(item => {
      if (item.children) {
        const filteredChildren = this.filterMenu(item.children)
        return (
          item.name.toLowerCase().includes(this.searchQuery.toLowerCase()) ||
          filteredChildren.length > 0
        )
      }
      return item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
    })
  }
}

计算属性调整

computed: {
  filteredMenu() {
    return this.filterMenu(this.menuItems)
  }
}

性能优化建议

防抖处理

vue实现菜单搜索

import { debounce } from 'lodash'

methods: {
  handleSearch: debounce(function(query) {
    this.searchQuery = query
  }, 300)
}

模板调整

<input @input="e => handleSearch(e.target.value)" placeholder="搜索菜单..." />

样式增强

添加搜索状态样式

.search-highlight {
  background-color: yellow;
  font-weight: bold;
}

高亮匹配文本

methods: {
  highlightText(text) {
    if (!this.searchQuery) return text
    const regex = new RegExp(this.searchQuery, 'gi')
    return text.replace(regex, match => `<span class="search-highlight">${match}</span>`)
  }
}

模板使用

<li v-for="item in filteredMenu" :key="item.id">
  <a :href="item.path" v-html="highlightText(item.name)"></a>
</li>

完整组件示例

<template>
  <div class="menu-search">
    <input 
      v-model="searchQuery" 
      placeholder="搜索菜单..." 
      class="search-input"
    />
    <ul class="menu-list">
      <li 
        v-for="item in filteredMenu" 
        :key="item.id" 
        class="menu-item"
      >
        <a 
          :href="item.path" 
          v-html="highlightText(item.name)"
          class="menu-link"
        ></a>
        <ul v-if="item.children" class="submenu">
          <li 
            v-for="child in item.children" 
            :key="child.id"
            class="submenu-item"
          >
            <a 
              :href="child.path" 
              v-html="highlightText(child.name)"
              class="submenu-link"
            ></a>
          </li>
        </ul>
      </li>
    </ul>
  </div>
</template>

<script>
import { debounce } from 'lodash'

export default {
  data() {
    return {
      menuItems: [
        // 菜单数据
      ],
      searchQuery: ''
    }
  },
  computed: {
    filteredMenu() {
      return this.filterMenu(this.menuItems)
    }
  },
  methods: {
    filterMenu(items) {
      // 递归过滤方法
    },
    highlightText(text) {
      // 高亮文本方法
    },
    handleSearch: debounce(function(query) {
      this.searchQuery = query
    }, 300)
  }
}
</script>

<style>
/* 样式定义 */
</style>

以上方案可根据实际需求进行调整,支持平级菜单和嵌套菜单的搜索功能,并提供了性能优化和用户体验增强的建议。

标签: 菜单vue
分享给朋友:

相关文章

vue按钮实现截屏

vue按钮实现截屏

Vue 按钮实现截屏的方法 在 Vue 项目中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm insta…

vue使用vr实现标注

vue使用vr实现标注

Vue 中使用 VR 实现标注的方法 在 Vue 项目中结合 VR 技术实现标注功能,可以通过 WebXR 和 Three.js 等库实现。以下为具体实现方法: 安装依赖 确保项目中已安装 Thre…

vue  select实现

vue select实现

Vue Select 实现方法 在 Vue 中实现下拉选择功能可以使用原生 <select> 标签或第三方库如 vue-select。以下是两种方法的详细说明: 原生 HTML Sele…

vue实现setinterval

vue实现setinterval

在 Vue 中使用 setInterval Vue 中可以通过生命周期钩子和方法结合 setInterval 实现定时任务。以下是一个完整的实现示例: <template> <…

vue实现登出

vue实现登出

实现Vue登出功能 登出功能通常涉及清除用户会话、令牌或本地存储的数据,并重定向到登录页面。以下是几种常见的实现方式: 清除用户令牌和状态 在Vuex的store中定义一个logout mutat…

jquery实现vue

jquery实现vue

jQuery 和 Vue.js 是两种不同理念的前端工具,jQuery 以 DOM 操作和事件驱动为核心,而 Vue.js 是数据驱动的现代化框架。如果想用 jQuery 实现类似 Vue 的功能(如…