黑马头条vue2.0项目实战(六)——文章搜索

news2024/9/30 19:32:27

目录

1. 创建组件并配置路由

2. 页面布局

3. 处理页面显示状态

4. 搜索联想建议

4.1 基本功能

4.2 防抖优化

4.3 搜索关键字高亮

5. 搜索结果

5.1 获取搜索关键字

5.2 请求获取数据

5.3 模板绑定

6. 搜索历史记录

6.1 添加历史记录

6.2 展示历史记录

6.3 删除历史记录

6.4 数据持久化


1. 创建组件并配置路由

① 创建 src/views/search/index.vue

② 然后把搜索页面的路由配置到根组件路由(一级路由)

2. 页面布局

① 创建 src/views/search/components/searchHistory.vue

② 创建 src/views/search/components/searchSuggestion.vue

③ 创建 src/views/search/components/searchResult.vue

④ 搜索组件内容如下:

  • 搜索栏

    • van-search 组件

    • 在 van-search 外层增加 form 标签,且 action 不为空,即可在 iOS 输入法中显示搜索按钮。

    • show-action 是否在搜索框右侧显示取消按钮

  • 搜索结果、搜索联想建议、搜索历史记录

3. 处理页面显示状态

需求:

  • 用户点击搜索后显示搜索结果列表,否则显示搜索历史或者是联想建议
  • 当输入框获得焦点的时候,显示搜索列表或者是联想建议
  • 当输入框内有搜索文本的时候显示联想建议,没有则显示搜索历史

① 在 data 中添加数据用来控制搜索结果的显示状态

② 在模板中绑定条件渲染

4. 搜索联想建议

  • 当搜索框输入内容的时候,请求加载联想建议的数据
  • 将请求得到的结果绑定到模板中

4.1 基本功能

① 将父组件中搜索框输入的内容传给联想建议子组件

② 在子组件中监视搜索框输入内容的变化,如果变化则请求获取联想建议数据

  • 获取联系建议接口

  • 不加立即侦听的话,searchValue初次改变的时候,搜索联想建议组件还未渲染完成,所以拿不到值

③ 将获取到的联想建议数据展示到列表中

  • 在 Vue 2.x 中,当 v-if 和 v-for 同时存在于同一个元素上时,由于 v-for 优先级更高,会导致性能问题,因为 v-for 先执行,遍历整个列表,然后每个项目再根据 v-if 条件进行判断渲染。

  • 在 Vue 3.x 中,当 v-if 和 v-for 同时存在于同一个元素上时,v-if 优先级更高。

4.2 防抖优化

  • 节流与防抖?
    • 节流:就是指连续触发事件但是在 n 秒中只执行一次函数。(王者荣耀技能冷却,期间内无法继续释放技能)
    • 防抖:单位时间内,频繁触发的事件,只执行最后一次。(英雄联盟英雄回城,如果被打断了,只能重新B回城)
    • 更多性能优化理解参考:ES6学习笔记(八)——性能优化(节流与防抖)

使用 lodash 库实现防抖优化:

① 安装 lodash

  • yarn add lodash 或者 npm i lodash

② 防抖处理

  •  lodash 支持按需加载,有利于打包结果优化

  • 不建议下面这样使用,因为这样会加载整个模块。
    • import _ from 'lodash'
    • _.debounce()

  • debounce(参数1, 参数2)

    • 参数1: 一个函数,不建议使用箭头函数,因为箭头函数的 this 指向上层作用域。

    • 参数2: 延迟时间,时间是毫秒

    • 返回值:防抖之后的函数值

4.3 搜索关键字高亮

  • 如何将字符串中的指定字符在网页中高亮展示?
    • 将需要高亮的字符包裹 HTML 标签,为其单独设置颜色。
    • "Hello <span style="color: red">World</span>"
  • 在 Vue 中如何渲染带有 HTML 标签的字符串?
    • 使用 v-html 指令
data () {
  return {
    htmlStr: 'Hello <span style="color: red">World</span>'
  }
}
//模版
<div>{{ htmlStr }}</div> //无法渲染为标签
<div v-html="htmlStr"></div>
  • 如何把字符串中指定字符统一替换为高亮(包裹了 HTML)的字符?
let str = 'hello world 哈哈哈 hello world World'
// replace('需要替换的字符', '替换后的字符') 
// 默认只替换匹配到的第一个字符
let newStr = str.replace('world', 'vue')
console.log(newStr) //hello vue 哈哈哈 hello world World

// g全局匹配,不止替换第一个字符
//  i不区分大小写
let reg = /world/gi 
let newStr2 = str.replace(reg, 'vue')
console.log(newStr2)  // hello vue 哈哈哈 hello vue vue

// findIndex 是 JavaScript 数组方法,
// 用于找到数组中第一个符合测试函数条件的元素的索引。如果没有找到符合条件的元素,则返回 -1。
const array = [5, 12, 8, 130, 44]
const index = array.findIndex(item => item === 8)
console.log(index) //2

下面是具体的步骤处理:

① 在 methods 中添加一个方法处理高亮

  • 如果后端返回的联系建议的数组中为空的前况下,sourceText 的值为空 null,此时 sourceText.replace 就会报错,在空的前况下,我们就让返回原有的搜索值

  • /this.searchContent/ 的写法是错误的,正则表达式中的一切内容都会当做字符串使用

  • RegExp 是原生 JavaScript 的内置构造函数

    • 参数1:字符串,注意,这里不要加 //

    • 参数2:匹配模式,g 全局,i 忽略大小写

  • 正则表达式复习参考:JavaScript学习笔记(六)——BOM(Window对象)——十、正则表达式

② 然后在联想建议列表项中绑定调用

③ 拓展方法:使用字符串的 split 结合数组的 join 方法实现高亮

var str = "hello world 你好 hello";

// ["", " world 你好 ", ""]
const arr = str.split("hello");

// "<span>hello</span> world 你好 <span>hello</span>"
arr.join("<span>hello</span>");

5. 搜索结果

思路:

  • 找到数据接口
  • 请求获取数据
  • 将数据展示到模板中

5.1 获取搜索关键字

① 声明接收父组件中的搜索框输入的内容

② 在父组件给子组件传递数据

5.2 请求获取数据

① 在 api/serach.js 添加封装获取搜索结果的请求方法

② 请求获取

  • List 列表 onLoad 加载数据公式:

       1. 请求获取数据
        2. 将结果添加到数组列表中
        3. 将本次加载中的 loading 关闭
        4. 判断是否还有数据
                如果有,则更新获取下一页数据
                如果没有,则将加载状态设置 finished 设置为结束
        5. 加载失败,加载 loading 状态也要停用

5.3 模板绑定

6. 搜索历史记录

需求:

  • 非删除状态
    • 点击列表项,以列表项中的关键字搜索结果

  • 删除状态,点击删除图标显示“全部删除”和“完成”和叉叉小图标。
    • 删除状态点击列表删除历史记录

6.1 添加历史记录

当发生搜索的时候我们才需要记录历史记录。

① 在父组件 data 中添加一个数据用来存储历史记录

② 在触发搜索的时候,记录历史记录

  • 用户点击搜索,存储搜索历史记录

  • 不要有重复历史记录,最新的历史记录排在最前面

6.2 展示历史记录

6.3 删除历史记录

基本思路:

  • 给历史记录中的每一项注册点击事件
  • 在处理函数中判断
    • 如果是删除状态,则执行删除操作
    • 如果是非删除状态,则执行搜索操作

① 处理删除相关元素的展示状态

  • 在 data 中添加一个数据用来控制删除相关元素的显示状态

  • 绑定使用

② 处理删除操作

  • 全部删除

  • 删除某条历史记录或者以某条历史为关键字搜索(即触发父组件中的 onSearch 方法)

6.4 数据持久化

由于后端接口仅支持存储四条历史记录,所以本次持久化采用本地缓存的的方式实现

① 利用 watch 监视统一存储数据

② 初始化的时候从本地存储获取数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nacos集群模式-window版

结构图 步骤 复制一份nacos改为nacos8850##### 修改conf/application.properties再复制nacos改为nacso8860,nacos8870,只需要修改端口号即可 创建数据库nacos 先创建一个名为nacos的数据库&#xff0c;再直接把表拖进去即可 修改cluster.conf.example文件 把该文件名该为clus…

Linux云计算 |【第二阶段】NETWORK-DAY2

主要内容&#xff1a; VLAN技术、TRUNK模式、链路聚合、路由器 一、VLAN技术应用 广播域指接受同样广播消息的节点的集合&#xff0c;如在该集合中的任何一个节点传输一个广播帧&#xff0c;则所有其它能收到这个帧的节点都被认为是该广播帧的一部分&#xff1b; 交换机的所有…

刀片式远程IO

一、功能概述 1.1设备结构 本产品是三格电子远程IO系列刀片式型号&#xff0c;以下刀片式IO。 刀片式IO旨在帮助用户在自动化项目上更便捷的选型和应用。为此刀片式IO采用耦合器和IO模块通过背板总线结合的方式&#xff0c;方便用户根据不同使用场景&#xff0c;灵活搭配扩展…

ITIL服务管理认知与实践

ITIL服务管理认知与实践 ITIL 是什么 ITIL(Information Technology Infrastructure Library&#xff0c;信息技术基础架构库)ITIL的创建旨在解决当年英国政府部门在IT服务管理中存在的混乱和低效问题&#xff0c;提高政府的运营效率和公众服务水平。 发展情况 ITIL最初由英…

springboot仓库仓储管理系统-计算机毕业设计源码14514

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.1.1技术可行性 2.1.2经济可行性 2.1.3操作可行性 2.1.4法律可行性 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加…

Python编码系列—Python装饰器:编写可复用功能的魔法棒

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

kafka零拷贝sendfile及mmap简述

概述 通常在选型比较消息中间件时&#xff0c;都会在备选栏有kafka&#xff1b; kafka突出的特点就是高吞吐&#xff0c;零拷贝&#xff1b; 这里的零拷贝其实就是内核和用户空间之间没有copy&#xff0c;并不是真的0拷贝&#xff1b; 毕竟数据在磁盘&#xff0c;要读到网卡发…

Linux源码阅读笔记19-插入删除模块实战

前面已经讲了Linux模块的基本知识&#xff0c;现在我们来熟悉一下模块相关的基本操作。 模块的编写 #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h>// 插入内核时的函数 static int __init lnm_init(void) {printk("h…

CAN通信(速记版)

CAN 总线简介 CAN 协议经过 ISO 标准化后有两个标准:ISO11898 标准和 ISO11519-2 标准。前者适用通信速率为 125Kbps~1Mbps 场景,后者适用 125Kbps 以下场景。 STM32 自带基本扩展 CAN(bxCAN)。它支持 CAN 协议 2.0A 和 2.0B,都属于11898标准。支持最高传输速率为1 Mbps。CA…

2024河南萌新联赛第(四)场 河南理工大学

B.小雷的神奇电脑 题目&#xff1a; 原题链接 给出量个数n,m&#xff0c;一个有n个数的数组&#xff0c;数组里每个数不超过2^m&#xff0c;求数组任意两个数同或后的最大值。同或定义&#xff1a;二进制下相同为1&#xff0c;不同为0。 思路&#xff1a; 观察同或的定义可…

第十二章:设置pod和容器权限-保障集群内节点和⽹络安全

本章内容包括&#xff1a; 在pod中使用宿主机节点的默认Linux命名空间以不同用户身份运行容器运行特权容器添加或禁用容器内核功能定义限制pod行为的安全策略保障pod的网络安全 谈到了如何保障API服务器的安全。如果攻击者获得了访问API服务器的权限&#xff0c;他们可以通过在…

虹科新品 | PDF记录仪新增蓝牙®接口型号HK-LIBERO CL-Y

新品发布&#xff01;HK-LIBERO CE / CH / CL产品家族新增蓝牙接口型号HK-LIBERO CL-Y&#xff01; PDF记录仪系列新增蓝牙接口型号 HK-LIBERO CL-Y HK-LIBERO CE、HK-LIBERO CH和HK-LIBERO CL&#xff0c;虹科ELPRO提供了一系列高品质的蓝牙&#xff08;BLE&#xff09;多用途…

锂电池充电板电路设计

写这篇文章的目的主要是个人经验的总结&#xff0c;希望能给开发者们提供一种锂电池充电电路以及电源显示的电路思路。接下来从以下几个方面讲述电路。 设计这款电路的初衷是想用一块硬币大小的锂电池作为供电电源&#xff08;3.5V-4.2V&#xff09;&#xff0c;降压供给3.3V电…

c语言学习,isalpha()函数分析

1&#xff1a;isalpha() 函数说明&#xff1a; 检测参数c&#xff0c;是否为英文字母 2&#xff1a;函数原型&#xff1a; int isalpha(int c) 3&#xff1a;函数参数&#xff1a; 参数c&#xff0c;为检测英文字母 4&#xff1a;返回值&#xff1a; 参数c为字母&#xff0c…

Java封装原生ES

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.spring-data-es操作ES1.引入依赖2.application.yml配置uris3…

浮点数及其计算

目录 引言 1.浮点数的表示 1.1浮点数的作用和基本原理 1.2浮点数规格化 左规 右规 2.IEEE 754 标准 2.1图示&#xff1a; 2.2 阶码的全零全一有特殊含义: 2.3 IEEE 754 表示的范围&#xff1a; 2.4 十进制转IEEE 754&#xff1a; 2.5 IEEE 754转十进制&#xff1a…

Electron-builder 打包

项目比较简单&#xff0c;仅使用了 Electron 原生js 安装 electron-builder npm install electron-builder --dev配置 package.json 中的打包命令 {"script":{// ..."dev": "electron .","pack": "electron-builder"} }添…

【QT】Qt 音视频

Qt 音视频 Qt 音视频1. Qt 音频2. Qt 视频 Qt 音视频 在 Qt 中&#xff0c;音频主要是通过 QSound 类来实现。但是需要注意的是 QSound 类只支持播放 wav 格式的音频文件。也就是说如果想要添加音频效果&#xff0c;那么首先需要将非 wav 格式的音频文件转换为 wav 格式。 通…

MySQL 5.7 DDL 与 GH-OST 对比分析

作者&#xff1a;来自 vivo 互联网存储研发团队- Xia Qianyong 本文首先介绍MySQL 5.7 DDL以及GH-OST的原理&#xff0c;然后从效率、空间占用、锁阻塞、binlog日志产生量、主备延时等方面&#xff0c;对比GH-OST和MySQL5.7 DDL的差异。 一、背景介绍 在 MySQL 数据库中&…

普元Devops学习笔记-devops构建后jenkins流水线sleep 1hr 23min的问题

1 背景 java项目命名为 simple2。 命名有点随意&#xff0c;不要在意这个&#xff0c;不重要。 simple2的代码维护在gitlab中。 simple2项目有两个git分支&#xff1a; dev 和 master 开发中的代码在 dev分支&#xff0c;dev分支需要合并(merge)到master主分支。 基于此目…