当前位置:首页 > 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中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const BaseCom…

vue实现复选

vue实现复选

Vue 实现复选框 在 Vue 中实现复选框可以通过 v-model 指令绑定数据,同时结合 input 元素的 type="checkbox" 属性来实现。以下是几种常见的实现方式: 单个复选框…

vue 实现表单

vue 实现表单

Vue 表单实现方法 Vue.js 提供了多种方式实现表单,包括双向数据绑定、表单验证和动态表单生成。以下是常见的实现方法: 基础表单绑定 使用 v-model 指令实现表单元素与数据的双向绑定:…

vue实现答题

vue实现答题

Vue 实现答题功能 数据结构设计 使用 Vue 的响应式特性管理题目和答案数据。通常需要以下数据结构: data() { return { questions: [ {…

vue导航实现

vue导航实现

Vue 导航实现方法 在 Vue 中实现导航功能通常涉及路由配置、组件设计和状态管理。以下是几种常见的实现方式: 使用 Vue Router 实现基础导航 安装 Vue Router: npm i…

vue实现treetable

vue实现treetable

Vue实现TreeTable的方法 使用第三方组件库(如Element UI) Element UI的el-table组件支持树形表格展示,通过设置row-key和tree-props属性即可实现。…