我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue3如何实现全局搜索框

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue3如何实现全局搜索框

这篇文章主要介绍“Vue3如何实现全局搜索框”,在日常操作中,相信很多人在Vue3如何实现全局搜索框问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3如何实现全局搜索框”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一. 文件准备

前期你需要准备三个文件,来完成这个全局搜索框

  • SearchBar.ts 文件

  • SearchBar.vue 文件

  • useSearch.ts 文件

Vue3如何实现全局搜索框

二. 搜索框的样式

样式问题不是本文的重点,你可以花费五分钟在 SearchBar.vue 文件内速写一个非常简易的正方形 div 包裹着一个 input 标签即可快速进行下面的学习。

但是首先我们需要理清思路,这个组件是会出现在我们页面的最顶部的,所以它组件内部需要用到绝对布局。我们去 SearchBar.vue 去设置一个样式给最外层的 div,这里其它样式的写法使用的是 Uno CSS,没用过的小伙伴也不需要担心,它只是单纯的样式,和本文中心内容不牵扯。(CSS写成计算属性在这个场景也毫无特殊意义,只是单纯设计时考虑多了)Vue3如何实现全局搜索框Vue3如何实现全局搜索框

Vue3如何实现全局搜索框

三. 渲染函数 hrender 函数(重点)

  • 打开之前准备的 SearchBar.ts 文件,从 vue 里引入这两个函数,并且把在上一步写好的简陋版搜索框(SearchBar.vue)引入到这个文件内。

    Vue3如何实现全局搜索框

  • 首先我们从官网的介绍,先看一下这个函数的定义。Vue3如何实现全局搜索框
    可以看出,这个函数第一个参数是必填的,可以是一个 stringComponent,这篇文章重点讨论参数为 Component 的情况。重点是这个函数的返回值,是一个 VNode,这个你一定不陌生,Virtual Node ,看本篇文章的读者可能对虚拟 dom 的原理可能不是那么清楚,但是我相信你们一定知道它的基本机制。Vue 其实是先渲染 虚拟 dom -->然后 转换成真实 dom

  • 先别急着写代码,我想你可能更清楚这样的写法,比如我们前面在 SearchBar.vue 文件内写的简单的弹出框。Vue3如何实现全局搜索框

  • 整个组件的样式都是在 Vue 提供的 <template> 组件内写的,但是你要知道,Vue 在底层还是通过调用 h() 来完成虚拟 dom 的构建。而 <template> 仅仅只是 Vue 为了让你用熟悉的原生 html 开发而为你提供的语法糖?而已。(嗯,你可以这样理解)

  • 那么我们可以根据上面 h() 函数的介绍,它接收的第一参数可以是 Component ,那我们这个 SearchBar.vue 不就是组件吗?那如果我不想使用 <template> 去展示这个组件的话,我是否可以这样写呢?h(SearchBar.vue)。没错,是的,你就是可以这样写。别忘了 h 的返回值就是我们想拿到的 Vnode ,所以按照正确的写法是这样的。Vue3如何实现全局搜索框

三. 编写 SearchBarMaker 构造函数和 present 方法

  • 让我们回到 SearchBar.ts 文件。

    Vue3如何实现全局搜索框

  • 首先思考,这个搜索框一定有一个出现的函数,和一个消失的函数?,ok,起名字,一个 present,一个 dismiss
    Vue3如何实现全局搜索框

  • 接下来我需要创建出一个 VNode ,然后想办法处理成真实 dom。经过上面的学习,第一步马上就可以想到下面的写法。
    Vue3如何实现全局搜索框

  • 下面这位更是重量级,render() 函数。虚拟 dom 有了,真实dom 该如何拿到呢? Vue 为我们提供了这样一个函数,这里我们需要重点去看这个函数的类型是值,是一个 RootRenderFunction 类型的。Vue3如何实现全局搜索框

  • 这里我们转变一下思路,我们看一下 render 函数的第二个参数是 一个 container:HostElement ,然后让我们打开我们 main.ts 文件,我们跳进 mount的定义部分,Vue3如何实现全局搜索框Vue3如何实现全局搜索框发现神奇的地方了吗,我们虽然不知道 HostElement 的类型是什么,但是你知道你 mount 函数内填的参数是什么了吗?(忘掉的转头自觉复习官网哈。)
    没错,就是全局唯一的一个真实 dom,一个朴实无华的id叫 appdiv 元素。Vue3如何实现全局搜索框

  • 由于篇幅限制,在这里你可以先暂时简单的理解,render 函数会将你的虚拟 dom 包装成一个真实 dom 元素,但是你需要给它一个真实的 外壳dom 来告诉它将虚拟 dom 渲染到哪个位置。

  • ok,拿到一个包装后的虚拟 dom ,接下来就是告诉浏览器在哪里渲染这个元素。这里我们需要思考?,既然是全局都可以弹出的,并且需要在所有组件之上弹出。Vue3如何实现全局搜索框那么最简单的方法就是让它出现在 body的第一个元素,那么它一定会和我们网页所有的组件同级别(tips:通常我们所有的页面构成都会写在 body内 的一个 div 内。什么?你问我为什么?请打开你的 index.html 看一下,你是否忘记了我们的 App.vue 是挂在这个真实的,id为 app 的元素内的)Vue3如何实现全局搜索框

  • 那其实我们的操作的思路就是非常简单的,当我按下全局搜索按钮,那么你就在 <div id="app"> 的元素之前插入我的组件即可。

    Vue3如何实现全局搜索框

  • ok,到这里我们已经可以看到基本效果了,我们来测试一下。让我们在 App.vue 组件内随便写一个按钮,然后调用 SearchBarCreator 实例身上的 present 方法。(maker 感觉不是那么合理,之后我们将 SearchBarMaker 变更为 SeachBarCreator 的叫法,仅仅是名字变了而已,逻辑什么的根本没变哦。?)Vue3如何实现全局搜索框

    效果如下:
    Vue3如何实现全局搜索框

  • 到这里 searchBar 已经可以呈现在页面上了,但是我们还不知道怎样让它消失,其实也非常简单,我们只需要在合适的时机移除这个 dom 元素即可。Vue3如何实现全局搜索框在这里我们需要知道一点,我们需要将 searchBar 提升到当前文件的全局,不能仅只在 open中去 new 了。
    Vue3如何实现全局搜索框

    ok,我们测试一下
    Vue3如何实现全局搜索框

四. 优化 SearchBarCreator 构造函数的代码逻辑

写到这里的时候,你可能发现了一个小问题,当我一直去按搜索按钮的时候,它会出现多个搜索框,但是我们希望的是它在全局只能出现一个搜索框。换个角度思考,也就是同一时间,这个被我们 new 出来的 SeachBar 实例只能出现一个。思考一下?,我加一个变量,isShowing 是否正在被展示 ,如果正在被展示的话,那么用户再次调用 present 的时候,我就去调用实例自身的 dismiss 方法让它消失,是否可行呢?
Vue3如何实现全局搜索框

测试一下:
Vue3如何实现全局搜索框
OK,看来完美解决当前的问题了。

五. 编写全局唯一的调用实例

  • 在上面的这种情况下,我们已经可以在 App.vue 文件内去 new 一个实例来调用这个搜索框了。但是我们加入现在需要在 XXX.vue 文件内调用这个搜索框呢?我难道还需要重新去引入,然后重新 new 吗?nonono,某位大佬说过,程序员都是很懒的,不可能写这种低级的重复代码的。那么该如何实现呢

  • 打开我们之前准备的 useSearch.ts 文件,我们把之前在 App.vue 的全局生成的这个 SearchBar 实例转换思路,使它在全局的一个 ts 文件内生成一个,然后把这个实例自身的一些方法封装成函数,暴露给外部。那么我就可以在全局任意一个地方去调用这个实例身上的这两个方法。Vue3如何实现全局搜索框

  • 让我们在 App.vue 去试一下。
    这是我们之前的 App.vue 文件的调用方法。Vue3如何实现全局搜索框我们改造一下它。Vue3如何实现全局搜索框我们再次测试一下功能有没有什么问题

    Vue3如何实现全局搜索框
    如此一来就方便很多了,我们可以在任意位置去调用这个“唯一的搜索框”

六. 添加全局的快捷键 Command + K

  • 再此之前,我们需要理解一个概念,注意我们的 main.ts 文件,我们是把谁挂在了全局的那一个 id='app' 的真实 dom 下的?

    Vue3如何实现全局搜索框
    没错,就是前面我们提到的 App.vue 组件。

  • 那么假如我在这个 App.vue 组件挂载的时候,给全局 window 对象身上添加一个键盘事件,是不是就可以了呢?怎么添加呢?其实非常非常简单,要用到见组合按键,我们就需要使用到 “keydown”,具体为什么不是 “keypress” ,读者可以自行查阅这两者的区别,不属于本文的主要探讨内容。Vue3如何实现全局搜索框

  • 这时候,我们先来按一下 command 看看打印的内容是什么。这里重点的内容是该键盘事件身上的metaKey 属性。Vue3如何实现全局搜索框在这里我们还可以推算出按下 “ctrl” 的事件为

    Vue3如何实现全局搜索框

  • keydown 事件支持多个按键同时按下。当我们同时按下 “command” 和 “K” 键,会发生什么呢?Vue3如何实现全局搜索框但是我们发现好像并没有 K:true 这个属性呀,那我们怎么去判断呢?别着急接着往下看。

  • 我们可以看到键盘事件 event 身上有个 key 属性,它的值恰好是字符串类型的 “k”

    Vue3如何实现全局搜索框

这里我直接公布写法,js 允许我们这样判断是否同时按下两个按键。Vue3如何实现全局搜索框

  • 我们测试一下,我们去吧 App.vue 文件内的这两个按钮给去掉Vue3如何实现全局搜索框然后再打印一下我们按下 commandk 的时候。Vue3如何实现全局搜索框测试一下:

    Vue3如何实现全局搜索框

七. 添加出现的动画

  • 在上面我们可以看到,这样突然的出现好像有一丝丝的突兀。我希望这个搜索框在出现的时候,可以有那么一丝丝的平移效果,(类似于下面的效果)该如何做呢??Vue3如何实现全局搜索框

  • 我这里介绍一种较为简单的思路,我们在 App.vue 文件的 style 内预设一个 Css 动画,并起好名字。叫做 "searchInput"Vue3如何实现全局搜索框

  • 然后回到我们 searBar.vue 的组件去,给我们这个组件最外层的起一个好听的名字,我这里就叫做 searchBarWrapperVue3如何实现全局搜索框

  • 然后回到我们的 SearchBar.ts 文件内,也就是放我们 SeachBarCreator 构造函数的那个文件内。(tips:不是 useSearch.ts 哦)我这里解释一下思路,在调用 render 函数后,这个组件其实已经渲染成为一个真实的 dom 元素,只不过我们还没给它指定渲染的位置。既然是真实的 dom ,那么我们就可以通过 document.getElementById这个方法(querySelector同理,一个意思)拿到这个SearchBar.vue组件 ,接下来我只需要在调用 document.body.insertBefore 方法前,给它添加上刚刚我们在 App.vue 里预设好的类名,searchInput ,就完美达成我们想要的效果了。Vue3如何实现全局搜索框

  • 注意:style ,这个点仅仅是类名选择器,不要忘记了基础知识。Vue3如何实现全局搜索框

  • 测试一下效果:

    Vue3如何实现全局搜索框

八. 自动聚焦

在弹出框的 input 框实现自动聚焦相比于之前讲的就非常简单了,我在这里一笔带过了。只需要在 nextTick 中调用 input 本身的 focus 方法即可。
Vue3如何实现全局搜索框

源码

import { h, render } from "vue"import SearchBar from "./SearchBar.vue"class SearchBarCreator {  container: HTMLElement  appElement: HTMLElement | null  showing: boolean  _dismiss: () => void  constructor() {    this.container = document.createElement("div")    this.showing = false    this.appElement = document.body.querySelector("#app")    this.present.bind(this)    this.dismiss.bind(this)    this._dismiss = this.dismiss.bind(this)  }  present() {    if (this.showing) {      this.dismiss()    } else {      const SearchBar = h(h(SearchBar))      render(SearchBar, this.container)      const searchBarWrapperDOM =        this.container.querySelector("#searchBarWrapper")      searchBarWrapperDOM?.classList.add("animate-searchInputAnimation")      document.body.insertBefore(this.container, document.body.firstChild)      this.showing = true      this.appElement?.addEventListener("click", this._dismiss)    }  }  dismiss() {    if (this.showing && this.container) {      render(null, this.container)      document.body.removeChild(this.container)      this.showing = false      this.appElement?.removeEventListener("click", this._dismiss)    } else {      console.log("不需要关闭")    }  }}

到此,关于“Vue3如何实现全局搜索框”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue3如何实现全局搜索框

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

下载Word文档

猜你喜欢

Vue3如何实现全局搜索框

这篇文章主要介绍“Vue3如何实现全局搜索框”,在日常操作中,相信很多人在Vue3如何实现全局搜索框问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3如何实现全局搜索框”的疑惑有所帮助!接下来,请跟着小编
2023-07-05

Xamarin如何实现全局搜索

这篇文章主要为大家展示了“Xamarin如何实现全局搜索”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Xamarin如何实现全局搜索”这篇文章吧。全局搜索新版本的一个顶级特征就是工具栏上的全局搜
2023-06-27

图文详解Vue3实现全局搜索框步骤(附代码)

本篇文章给大家带来了关于Vue3的相关知识,其中主要介绍了Vue3是怎么实现一个全局搜索框,我会分享一下自己完整实现的思路,下面一起来看一下吧,希望对需要的朋友有所帮助。
2023-05-14

如何用Linux命令实现全局搜索

本篇文章为大家展示了如何用Linux命令实现全局搜索,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在Linux中一切皆为文件,这就显得文件管理尤为重要,当文件找不到时可以使用全局搜索命令。 第一种:
2023-06-28

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

本文主要介绍了Vue实现全局菜单搜索框的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-09

pycharm如何全局搜索

pycharm可以使用“快捷键”或者“菜单选项”进行全局搜索:1、快捷键“Ctrl + Shift + F”打开全局搜索窗口,在弹出的搜索框中输入内容,指定搜索范围在结果列表中点击文件名即可;2、在菜单栏中依次选择“Edit”“Find”“
pycharm如何全局搜索
2023-12-11

Android如何实现搜索框

这篇文章主要介绍了Android如何实现搜索框,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下展示效果代码区SouActivitypublic class SouA
2023-05-30

win8全局搜索该如何设置(2种方法调出搜索框)

刚刚转到Win8系统的用户可能会一是找不到“搜索”功能了,因为原本在开始菜单中的搜索功能随着开始菜单的取消也没有了,那么在Win8中我们要怎样才能使用搜索呢?本期的《Win8大百科》我们就说说Win8的全局搜索。搜索
2022-06-04

eclipse如何搜索全局变量

要在Eclipse中搜索全局变量,可以按照以下步骤进行:1. 打开Eclipse并进入要搜索的项目。2. 在Eclipse的菜单栏中,选择"Search"(搜索)选项。3. 在下拉菜单中,选择"File"(文件)。4. 在弹出的搜索框中,点
2023-09-07

Android如何实现顶部搜索框

这篇文章给大家分享的是有关Android如何实现顶部搜索框的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。本文介绍两种SearchView的使用情况,一种是输入框和搜索结果不在一个activity中,另一种是在一个
2023-05-30

css如何实现带搜索图标的搜索框功能

这篇文章给大家分享的是有关css如何实现带搜索图标的搜索框功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言给大家分享一下前端用处很多的带小图标的搜索框的制作方法。效果展示基本思路1、搜索图像用绝对定位放到搜
2023-06-08

win10搜索框全黑如何解决

这篇“win10搜索框全黑如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10搜索框全黑如何解决”文章吧。win
2023-07-01

Vue3指令之搜索框输入防抖功能实现

在Vue开发中遇到了搜索框输入防抖处理,算是防抖的使用场景之一吧,这篇文章主要给大家介绍了关于Vue3指令之搜索框输入防抖功能实现的相关资料,需要的朋友可以参考下
2022-12-29

angular4如何实现带搜索的下拉框

这篇文章主要讲解了“angular4如何实现带搜索的下拉框”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“angular4如何实现带搜索的下拉框”吧!思路:1、站在巨人的肩膀上,确定了boot
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录