iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue实现全局菜单搜索框的示例
  • 587
分享到

Vue实现全局菜单搜索框的示例

Vue全局菜单搜索框Vue搜索框 2023-02-09 12:02:25 587人浏览 薄情痞子
摘要

目录前言一、过滤路由二、搜索框展示路由三、雏形出现但有缺陷四、优化搜索方式五、完整代码展示结论前言 本篇文章分享一下我在实际开发 Vue 项目时遇到的需要 —&mdash

前言

本篇文章分享一下我在实际开发 Vue 项目时遇到的需要 —— 全局菜单搜索。全局菜单搜索本质是 router 的使用,该功能已经实现,接下来分享一下开发心得。

一、过滤路由

首先需要过滤出符合条件的路由信息,过滤的条件包含两个:

  • 路由可以显示出现(hidden: false
  • 路由元信息中包含 title 属性

代码展示:

  
  const generateRoutes = (routes, basePath = '/', prefixTitle = []) => {
    let filterRoutes = []

    for (const route of routes) {
      // 如果路由已经隐藏,跳过这次
      if (route.hidden) {
        continue
      }

      const data = {
        path: path.resolve(basePath, route.path),
        title: [...prefixTitle],
      }

      // 仅推送有标题的路由
      if (route.meta && route.meta.title) {
        data.title = [...data.title, route.meta.title]

        if (route.redirect !== 'noReDirect') {
          filterRoutes.push(data)
        }
      }

      // 循环子路由
      if (route.children) {
        const childRoutes = generateRoutes(route.children, data.path, data.title)
        if (childRoutes.length >= 1) {
          filterRoutes = [...filterRoutes, ...childRoutes]
        }
      }
    }
    return filterRoutes
  }

注意:如果路由包含子路由,就要递归调用 generateRoutes 方法, 在递归结束之后把符合条件的路由赋值给 filterRoutes,之后将其返回。

二、搜索框展示路由

实现搜索框使用的是 el-select 组件,在刚进入页面时需要在 onMounted 声明周期中调用 generateRoutes 方法,将其赋值给变量 searchPool

  onMounted(() => {
    searchPool.value = generateRoutes(JSON.parse(jsON.stringify(authRoute)))
  })

接下来,需要定义 el-select 组件的 远程搜索方法change 事件。其中远程搜索方法 query 作用是把符合搜索结果的信息筛选出来赋值给 options,之后通过下拉选项展示这些信息。而 change 事件是当选中路由时实现路由的跳转并完成一些变量的初始化。

  // 搜索框的远程搜索方法
  const query = (queryVal) => {
    if (queryVal !== '') {
      options.value = fuse.value.search(queryVal)
    } else {
      options.value = []
    }
  }
  
  
  const change = (val) => {
    if (val) {
      router.push({
        path: val,
      })
    }
    options.value = []
    search.value = ''
    isshowSearch.value = false
  }  

三、雏形出现但有缺陷

经过不断探索,终于实现了一个全局菜单搜索框,但是这时我们会发现一个 bug

在这里插入图片描述

这个问题是必须要输入完整的路由名称,路由才会在下拉框中展示,也就是说没有实现模糊查询功能,接下来针对这一问题进行解决。

四、优化搜索方式

路由搜索过程中没有实现模糊搜索的功能,接下来将借助 fusejs 实现这一功能。fuse.js 具体用法请参照 Fuse 官网。
初始化 fuse:

  
  const fuseInit = (list) => {
    fuse.value = new Fuse(list, {
      shouldSort: true,
      threshold: 0.4,
      location: 0,
      distance: 100,
      minMatchCharLength: 1,
      keys: [
        {
          name: 'title',
          weight: 0.7,
        },
        {
          name: 'path',
          weight: 0.3,
        },
      ],
    })
  }

另外,需要不断监听 searchPool,当 searchPool 改变时 调用 fuseInit 方法。

  
  watch(searchPool, (list) => {
    fuseInit(list)
  })

添加了模糊搜索功能之后,全局菜单搜索框就基本实现,接下来看一下展示效果

在这里插入图片描述

五、完整代码展示

<template>
  <div class="search">
    <el-tooltip content="菜单搜索" placement="bottom">
      <el-icon style="font-size: 20px"><Search @click="handleSearch" /></el-icon>
    </el-tooltip>
    <el-dialog
      v-model="isShowSearch"
      class="header_dialog"
      width="600px"
      destroy-on-close
      :show-close="false"
    >
      <el-select
        style="width: 100%"
        ref="headerSearchSelect"
        v-model="search"
        :remote-method="query"
        filterable
        default-first-option
        remote
        placeholder="菜单搜索 :支持菜单名称、路径"
        class="header_search_select"
        @change="change"
      >
        <el-option
          v-for="item in options"
          :key="item.item.path"
          :value="item.item.path"
          :label="
            item.item && item.item.title && item.item.title.length && item.item.title.join(' > ')
          "
        >
        </el-option>
      </el-select>
    </el-dialog>
  </div>
</template>
<script lang="ts" setup>
  import { onMounted, ref, watch } from 'vue'
  import { useRouter } from 'vue-router'

  import path from 'path-browserify'
  import Fuse from 'fuse.js'

  import authRoute from '@/router/modules/authRoute'

  const router = useRouter()
  const search = ref('')
  const isShowSearch = ref(false)
  const searchPool = ref([])
  const options = ref([])
  const fuse = ref(null)

  
  const fuseInit = (list) => {
    fuse.value = new Fuse(list, {
      shouldSort: true,
      threshold: 0.4,
      location: 0,
      distance: 100,
      minMatchCharLength: 1,
      keys: [
        {
          name: 'title',
          weight: 0.7,
        },
        {
          name: 'path',
          weight: 0.3,
        },
      ],
    })
  }

  
  watch(searchPool, (list) => {
    fuseInit(list)
  })

  
  const generateRoutes = (routes, basePath = '/', prefixTitle = []) => {
    let filterRoutes = []

    for (const route of routes) {
      // 如果路由已经隐藏,跳过这次
      if (route.hidden) {
        continue
      }

      const data = {
        path: path.resolve(basePath, route.path),
        title: [...prefixTitle],
      }

      // 仅推送有标题的路由
      if (route.meta && route.meta.title) {
        data.title = [...data.title, route.meta.title]

        if (route.redirect !== 'noReDirect') {
          filterRoutes.push(data)
        }
      }

      // 循环子路由
      if (route.children) {
        const childRoutes = generateRoutes(route.children, data.path, data.title)
        if (childRoutes.length >= 1) {
          filterRoutes = [...filterRoutes, ...childRoutes]
        }
      }
    }
    return filterRoutes
  }

  
  const handleSearch = () => {
    isShowSearch.value = true
  }

  onMounted(() => {
    searchPool.value = generateRoutes(JSON.parse(JSON.stringify(authRoute)))
  })

  // 搜索框的远程搜索方法
  const query = (queryVal) => {
    if (queryVal !== '') {
      options.value = fuse.value.search(queryVal)
    } else {
      options.value = []
    }
  }

  
  const change = (val) => {
    if (val) {
      router.push({
        path: val,
      })
    }
    options.value = []
    search.value = ''
    isShowSearch.value = false
  }
</script>
<style lang="sCSS" scoped>
  .search {
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;

    :deep(.el-dialog) {
      .el-dialog__header {
        display: none;
      }
      .el-dialog__body {
        padding: 0;
      }
    }
    .header_search_select {
      height: 50px;
      :deep(.el-input__wrapper) {
        height: 50px;
      }
    }
  }
</style>

结论

到此这篇关于Vue实现全局菜单搜索框的示例的文章就介绍到这了,更多相关Vue 全局菜单搜索框内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue实现全局菜单搜索框的示例

本文链接: https://www.lsjlt.com/news/195325.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue实现全局菜单搜索框的示例
    目录前言一、过滤路由二、搜索框展示路由三、雏形出现但有缺陷四、优化搜索方式五、完整代码展示结论前言 本篇文章分享一下我在实际开发 Vue 项目时遇到的需要 —&mdash...
    99+
    2023-02-09
    Vue 全局菜单搜索框 Vue 搜索框
  • Vue3如何实现全局搜索框
    这篇文章主要介绍“Vue3如何实现全局搜索框”,在日常操作中,相信很多人在Vue3如何实现全局搜索框问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3如何实现全局搜索框”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-05
  • 简单实现Android端搜索框示例详解
    目录正文一、效果展示二、快速使用及属性介绍快速使用具体代码主要方法介绍1、搜索框监听2、搜索列表点击事件3、改变最近(历史)搜索item背景4、动态设置热门搜索热度属性介绍Searc...
    99+
    2022-11-13
    Android端搜索框 Android 搜索框
  • Vue实现简单搜索功能的示例代码
    目录1、概述2、功能逻辑2.1功能流程2.2 流程图3、功能实现3.1 vue组件化3.2 代码3.3 动态效果1、概述 在vue项目中,搜索功能是我们经常需要使用的一个场景,最常用...
    99+
    2023-03-19
    Vue实现搜索功能 Vue搜索功能 Vue搜索
  • vue+element实现下拉菜单并带本地搜索功能示例详解
    需求: 后台返回数组对像,前端组合成数组,根据name组合成一个个数组并把后台返回的值当成一个children推入数组,在数组中自定义属性备份数据防止搜索的时候改变原数组使得数组无...
    99+
    2024-04-02
  • js实现带菜单栏目搜索的下拉菜单
    在下拉菜单栏目比较多的时候,用户查找栏目阅读会很麻烦,为了提高用户体验度,加个栏目搜索会很方便。这篇文章主要介绍了js实现带菜单栏目搜索的下拉菜单,感觉挺实用的,需要的朋友可以参考下...
    99+
    2022-12-22
    js下拉菜单 带菜单栏目搜索的下拉菜单
  • vue实现自定义全局右键菜单
    前段时间公司在做一个webIDE项目,其中有对文件树的各种操作,主要通过右键菜单实现,今天就来记录一下怎么在vue项目中实现全局的自定义右键菜单。效果如图所示: 注意: 需要在项目...
    99+
    2024-04-02
  • Xamarin如何实现全局搜索
    这篇文章主要为大家展示了“Xamarin如何实现全局搜索”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Xamarin如何实现全局搜索”这篇文章吧。全局搜索新版本的一个顶级特征就是工具栏上的全局搜...
    99+
    2023-06-27
  • Vue+java实现时间段的搜索示例
    实现效果如图: 标红的是需要注意的地方!Vue操作:1,如图: 2,如图:(数据初始化) 2.0初始化今天的日期和时间的样式: 2.1今天的日期: // 时间范围–...
    99+
    2024-04-02
  • Vue之全局水印的实现示例
    目录1.创建水印Js文件 2.引入操作 2.1 在App.vue中引用或其他页面 2.2 在router配置文件中引用【需求】系统内页面显示水印,登录页面没有水印(退出登录时,登录页...
    99+
    2024-04-02
  • vue怎么实现自定义全局右键菜单
    本篇内容介绍了“vue怎么实现自定义全局右键菜单”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果如图所示:注意:需要在项目中找到页面整体布...
    99+
    2023-06-29
  • DIV+CSS怎么实现搜索框布局
    这篇文章主要讲解了“DIV+CSS怎么实现搜索框布局”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“DIV+CSS怎么实现搜索框布局”吧!搜索表单控件效果截图...
    99+
    2024-04-02
  • vue实现带放大镜的搜索框
    本文实例为大家分享了vue实现带放大镜的搜索框,供大家参考,具体内容如下 字体图标在input单标签中的用法: 第一步,先在main.js 中全局引入iconfont图标; 第二步...
    99+
    2024-04-02
  • vue全局挂载实现APP全局弹窗的示例代码
    目录需求背景需求分析代码展示需求背景 app端对接网页端的客服系统,在用户实现网页客户系统发起询问时,app不论在哪个页面都需要弹窗提示 需求分析 这个需求分为两步,一个是负责双向...
    99+
    2024-04-02
  • Flutter实现自定义搜索框AppBar的示例代码
    目录介绍效果图实现步骤完整源码总结介绍 开发中,页面头部为搜索样式的设计非常常见,为了可以像系统AppBar那样使用,这篇文章记录下在Flutter中自定义一个通用的搜索框AppBa...
    99+
    2024-04-02
  • vue实现菜单权限控制的示例代码
    大家在做后台管理系统时一般都会涉及到菜单的权限控制问题。当然解决问题的方法无非两种——前端控制和后端控制。我们公司这边的产品迭代速度较快,所以我们是从前端控制路由迭代到后端控制路由。...
    99+
    2024-04-02
  • 图文详解Vue3实现全局搜索框步骤(附代码)
    @charset "UTF-8";@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.markdown-body{word-break:break-word...
    99+
    2023-05-14
    vue3
  • Ajax实现搜索框提示功能
    html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF...
    99+
    2024-04-02
  • 如何用Linux命令实现全局搜索
    本篇文章为大家展示了如何用Linux命令实现全局搜索,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在Linux中一切皆为文件,这就显得文件管理尤为重要,当文件找不到时可以使用全局搜索命令。 第一种:...
    99+
    2023-06-28
  • Vue实现自定义右击删除菜单的示例
    目录一、定义和使用二、语法三、使用细节四、案例4.1 自定义右击删除菜单步骤4.2 技术点4.3 html代码4.4 CSS样式4.5 基础数据4.6 模拟数据4.7 添加日期列4....
    99+
    2023-02-02
    Vue 右击删除菜单 Vue 自定义右击删除
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作