基于Vue+ElementPlus自定义带历史记录的搜索框组件

news2025/3/11 0:40:24

前言

基于Vue2.5+ElementPlus实现的一个自定义带历史记录的搜索框组件

效果如图:

基本样式:

获取焦点后:

这里的历史记录默认最大存储10条,同时右侧的清空按钮可以清空所有历史记录。

同时搜索记录也支持点击搜索,按下enter也可以直接搜索

vue代码

为什么叫vue2.5是因为我在vue3的框架下同时写vue2和vue3的语言。

这里要提前在main.js中提前注册element-plus中的图标,或者按需引入也可以。

这里我通过将历史记录直接存入到一个列表,然后存储在本地存储,每次有新的搜索记录时,unshift列表头部元素,这样每次在最上方展示的历史记录就是最新的,同时也方便删除旧的历史记录时直接pop掉即可。

实现起来比较简单,可以根据不同需求应用不同场景。

<template>
    <!-- 搜索框 -->
    <div class="search-area" ref="searchbar">

        <el-input v-model="searchcontent" style="max-width: 500px;width: 500px;" :placeholder="placeholder"
            class="input-with-select" maxlength="56" size="large" @focus="isshow = true" @keydown.enter="searchblog">
            <template #append>
                <el-button style="background-color: #fc5531;" size="large" @click="searchblog" :disabled="isclick">
                    <span style="color: white;font-weight: 500;display: flex;">
                        <el-icon style="margin-right: 10px;">
                            <Search></Search>
                        </el-icon>
                        搜索
                    </span>
                </el-button>
            </template>
        </el-input>
        <div class="search-drop-menu" v-show="isshow">
            <div class="search-history" v-show="searchhistorylist.length > 0">
                <div class="search-title">
                    搜索历史
                    <span class="search-clear" @click="clearhistory">
                        <el-icon>
                            <Delete></Delete>
                        </el-icon>
                        <span>清空</span>
                    </span>
                </div>
                <div>
                    <div v-for="(item, index) in searchhistorylist" :key="index" class="history-item">
                        <div @click="searchhistory(item)">{{ item }}</div>
                    </div>
                </div>
            </div>
            <div class="search-hot">
                <!-- 留着做推荐 -->
                <div class="search-title">搜索发现</div>
            </div>
        </div>
    </div>
</template>

<script>

import { ElMessage } from 'element-plus';

export default {
    name: 'SearchInput',
    data() {
        return {
            searchcontent: '',//搜索内容
            placeholder: '请输入',//以后有了推荐系统可以预置用户想搜索的内容
            isshow: false,
            searchhistorylist: [],   //搜索历史列表
        }
    },
    methods: {
        //搜索博客内容
        searchblog() {
            //先判断输入是否为空
            if (this.searchcontent == '') {
                ElMessage({ type: 'info', message: '输入不能为空', duration: 1500 });
                return;
            }
            //隐藏搜索框
            this.isshow = false;
            //加入到搜索历史列表
            this.searchhistorylist.unshift(this.searchcontent);
            //判断列表长度是否大于10 如果大于了就删除一个最旧的
            while (this.searchhistorylist.length > 10) {
                this.searchhistorylist.pop();
            }
            //保存到本地存储
            localStorage.setItem("search_history_list", JSON.stringify(this.searchhistorylist));
            //跳转搜索内容页面
            location.href = '/blog/search?q=' + this.searchcontent;
        },
        //搜索历史内容
        searchhistory(val) {
            //隐藏搜索框
            this.isshow = false;
            //加入到搜索历史列表
            this.searchhistorylist.unshift(val);
            //判断列表长度是否大于10 如果大于了就删除一个最旧的
            while (this.searchhistorylist.length > 10) {
                this.searchhistorylist.pop();
            }
            //保存到本地存储
            localStorage.setItem("search_history_list", JSON.stringify(this.searchhistorylist));
            //跳转搜索内容页面
            location.href = '/blog/search?q=' + val;
        },
        
        //清除历史记录
        clearhistory() {
            this.searchhistorylist = [];
            localStorage.removeItem('search_history_list');
            ElMessage({ type: 'success', message: '历史记录清除成功', duration: 1500 });
        }
    },
    mounted() {
        //获取用户搜索历史
        let list = JSON.parse(localStorage.getItem("search_history_list")) || null;
        if (list == null) {
            console.log("无本地搜索历史");
            return;
        }
        this.searchhistorylist = list;
        //设置一个监听 点击搜索框其他区域就隐藏
        document.addEventListener(
            "click",
            (e) => {
                if (e.target.className=='el-main') {
                    this.isshow = false;
                }
            },
            true
        );
    }

}
</script>

<style scoped>
.search-drop-menu {
    position: absolute;
    width: 100%;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    padding: 8px 0 12px;
    font-size: 14px;
    font-weight: 400;
    -webkit-box-shadow: 0 0 10px 2px rgb(0 0 0 / 6%);
    box-shadow: 0 0 10px 2px rgb(0 0 0 / 6%);
    border-radius: 0 0 4px 4px;
    background: #fff;
    color: #555666;
    top: 39px;
    left: 0;
    min-height: 200px;
    height: auto;
    text-align: left;
    z-index: 9999; /* 设置一个很高的值确保在最上层 */

}

.search-history {
    width: 50%;
    float: left;
}

.search-hot {
    width: 50%;
    float: left;
}

.search-title {
    padding-left: 16px;
    height: 32px;
    font-size: 12px;
    color: #fc5531;
    line-height: 32px;
    position: relative;
}

.history-item {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    position: relative;
    display: block;
    width: 100%;
    padding: 0 16px 0 16px;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    height: 32px;
    line-height: 32px;
    cursor: pointer;
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-pack: justify;
    -ms-flex-pack: justify;
    justify-content: space-between;
    -webkit-box-align: center;
    -ms-flex-align: center;
    align-items: center;
}

.search-clear {

    right: 0px;
    color: #ccccd8;
    position: absolute;
    height: 100%;
    right: 16px;
    top: 0;
    cursor: pointer;
}
</style>

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

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

相关文章

2013-2021年各省经济韧性相关测度指标面板数据

2013-2021年各省经济韧性相关测度指标面板数据 1、时间&#xff1a;2013-2021年 2、指标&#xff1a;城镇化率 %、财政科学技术支出&#xff08;亿元&#xff09;、万人高等教育在校人数&#xff08;万人&#xff09;、财政教育支出&#xff08;亿元&#xff09;、第三产业占…

【后端】PyCharm的安装指引与基础配置

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、PyCharm是什么二、PyCharm安装指引安装PyCharm社区版安装PyCharm专业版 三、配置PyCharm&#xff1a;四、总结 前言 随着开发语言及人工智能工具的普及&am…

Discuz! X系列版本安装包

源码下载地址&#xff1a;Discuz! X系列版本安装包 很多新老站长跟我说要找Discuz! X以前的版本安装包&#xff0c;我们做Discuz! X开发已经十几年了&#xff0c;这些都是官方原版安装包&#xff0c;方便大家使用&#xff08;在官网已经找不到这些版本的安装包了&#xff09; …

4.23日总结(项目总结)

1.项目&#xff1a; 今日项目通过一个在登录界面的一个静态变量&#xff0c;完成了区分老师和学生&#xff0c;能够分开老师和学生&#xff0c;并且不同身份的人进去会有不同的显示&#xff0c;以及登录链接主界面&#xff0c;还有学生和老师的不同的表&#xff0c;其次就是创…

实现Spring底层机制(二)

文章目录 阶段2—封装bean定义信息到Map1.代码框架图2.代码实现1.文件目录2.新增注解Scope存储单例或多例信息Scope.java3.修改MonsterService.java指定多例注解4.新增bean定义对象存储bean定义信息BeanDefinition.java5.修改pom.xml增加依赖6.修改容器实现bean定义信息扫描Sun…

修改element-ui中el-calendar(日历)的样式

效果图如下&#xff1a; <template><div class"dashboard-container"><el-card style"width: 350px; height: auto; border-radius: 8px"><div class"custom-style"><p class"new-data">{{ newDate }}&…

Qt使用miniblink第三方浏览器模块

文章目录 一、前言二、miniblink简介三、miniblink使用四、运行效果五、工程结构 一、前言 本文取自刘典武大师&#xff1a;Qt编写地图综合应用58-兼容多浏览器内核 用Qt做项目过程中&#xff0c;遇到需要用到浏览器控件的项目&#xff0c;可能都会绕不开一个问题&#xff0c;那…

12-Makefile_03(续)

使用变量 使用C自动编译成*.o的默认规则有个缺陷&#xff0c;由于没有显式地表示*.o依赖于.h头文件&#xff0c;假如修改了头文件的内容&#xff0c;那么*.o并不会更新&#xff0c;这是不可接受的。并且默认规则使用固定的“cc”进行编译&#xff0c;假如想使用ARM-GCC进行交叉…

Nacos原理简单介绍

注册中心原理 官网&#xff1a;Nacos 注册中心的设计原理 | Nacos nacos注册中心采用了 &#xff1a;pull &#xff08;客户端的轮询&#xff09;和push &#xff08;服务端主动push&#xff09;策略 客户端启动时会将当前服务的信息包含ip、端口号、服务名、集群名等信息封装…

树莓教育坚持特色引领,建设一流应用型影像培训

树莓教育&#xff0c;作为树莓集团旗下的子公司&#xff0c;自创立以来已经走过了十余个春秋。在这漫长的教育征程中&#xff0c;树莓教育始终坚守初心&#xff0c;秉持着七个坚持和十项行动的原则为数字影像产业的建设和发展做出了巨大的贡献。 七个坚持&#xff0c;是树莓教育…

【网络编程】Java网络编程中的基本概念及实现UDP、TCP客户端服务器程序(万字博文)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】Java网络编程中的基本概念及实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 目录 …

大小端解释以及如何使用程序判断IDE的存储模式

今天让我们来了解一下大小端的概念吧 什么是大小端&#xff1f; 大端&#xff08;存储&#xff09;模式&#xff1a;指的是数据的低位保存在内存的高地址处&#xff0c;而数据的高位则保存在内存的低地址处。 小端&#xff08;存储&#xff09;模式&#xff1a;指的是数据的低位…

使用表格法插入公式和编号

如何将公式和编号优雅地插入到论文当中呢&#xff1f; 首先插入一个1行2列的表格 调整一下 输入公式方法一&#xff1a;感觉墨迹公式挺好用的&#xff0c;word自带的 输入公式方法二&#xff1a;图片转LATEX代码 这个方法更快 分享一个公式识别网站 图片识别得到LATEX代码&…

免费PNG素材网站推荐:设计效率倍增!

一、即时设计 新一代协同设计工具即时设计&#xff0c;内置丰富社区资源&#xff0c;可以在此获得设计前线的各类PNG图像&#xff0c;以及矢量图标&#xff0c;包括毛玻璃、3D混搭、全息投影、单色、平面化等&#xff0c;都是符合目前市场的主流风格。通过最近更新、作品、资源…

【ks爬虫软件】把快手评论API接口封装成GUI采集工具

用Python开发爬虫采集软件&#xff0c;可自动抓取快手评论数据&#xff0c;且包含二级评论。 快手的评论接口URL&#xff1a; # 请求地址 url https://www.kuaishou.com/graphql开发者模式分析过程&#xff1a; 进而封装成GUI界面软件&#xff0c;如下&#xff1a; 软件效…

【Linux】开关机命令和服务管理类命令

一般Linux是不会经常进行关机的,关机的正确流程是: sync->shutdown->reboot->poweroff sync: 将内存中的数据同步到硬盘中poweroff: 关闭系统,等同于shutdown -h nowreboot: 重启系统,等同于 shutdown -r nowshutdown[选项] [时间] shutdown命令常见用法: shutdown:…

[vite] ts写配置根目录别名

参考:配置 Vite | Vite 写对象的形式吧 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],resolve: {alias: {"": path.resolve(__dirname…

电磁仿真--基本操作-CST-(2)

目录 1. 回顾基操 2. 操作流程 2.1 创建工程 2.2 修改单位 2.3 创建 Shape 2.4 使用拉伸 Extrude 2.5 修改形状 Modify Locally 2.6 导入材料 2.7 材料解释 2.8 材料分配 2.9 查看已分配的材料 2.10 设置频率、背景和边界 2.11 选择 Edge&#xff0c;设置端口 2.…

Linux-进程间通信:System V消息队列

目录 System V IPC概述标识符与IPC Key System V消息队列创建或打开一个消息队列发送消息接收消息控制消息队列1、IPC_STAT2、IPC_SET3、IPC_RMID 查看系统当前的消息队列代码示例 System V IPC&#xff08;Inter-Process Communication&#xff09;是一组用于在 Unix-like 操作…

五款最受欢迎的上网行为管理软件

五款最受欢迎的上网行为管理软件 员工上网看视频怎么办&#xff1f;员工偷偷刷抖音怎么办&#xff1f;员工天天上招聘网&#xff0c;是不是有离职打算&#xff1f; 解决上述困扰的最好办法是使用监控软件了解员工一言一行。以下是几款推荐的上网行为管理和监控软件&#xff1a;…