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

前言

基于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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.NET(C#)连接达梦数据库GUID字段被自动加横线的修复方法

因信创的原因项目需要兼容达梦数据库&#xff0c;今天遇到个比较坑爹的问题&#xff0c;简单记录下解决方案。 数据库存的是这样&#xff1a; 通过DataAdapter.Fill拿出来以后变成了这样 纳尼&#xff1f;谁让你加上这些横杠的&#xff1f;&#xff08;掀桌&#xff09;导致了…

100个实用电气知识

在当今社会&#xff0c;电力作为日常生活和工作中不可或缺的能源&#xff0c;扮演着越来越重要的角色。为了更好地利用电力资源&#xff0c;了解电气知识成为了越来越多人的需求。在电气领域&#xff0c;有很多实用的知识&#xff0c;这些知识对于从事电气工作的人来说是非常重…

Linux系统安全:从面临的攻击和风险到安全加固、安全维护策略(文末有福利)

1. Linux面临的攻击与风险 1.1. Linux系统架构 Linux系统架构解读&#xff1a; 用户之间隔离内核态与用户态之间隔离用户进程一般以低权限用户运行系统服务一般以特权服务运行用户态通过系统调用进入内核态内核对系统资源进行管理和分配 1.2. Linux系统常见安全威胁 1.2.1.…

OSPF认证方式,ISIS简介,ISIS路由器类型

OSPF&#xff1a;转发&#xff0c;泛洪&#xff0c;丢弃

Docker搭建代码托管Gitlab

文章目录 一、简介二、Docker部署三、管理员使用四、用户使用五、用户客户端 一、简介 GitLab是一个基于Git的代码托管和协作平台&#xff0c;类似于GitHub。 它提供了一个完整的工具集&#xff0c;包括代码仓库管理、问题跟踪、CI/CD集成、代码审查等功能。 GitLab的开源版本…

Go语言并发赋值的安全性

struct并发赋值 type Test struct {X intY int }func main() {var g Testfor i : 0; i < 1000000; i {var wg sync.WaitGroup// 协程 1wg.Add(1)go func() {defer wg.Done()g Test{1, 2}}()// 协程 2wg.Add(1)go func() {defer wg.Done()g Test{3, 4}}()wg.Wait()// 赋值…

2024新算法角蜥优化算法(HLOA)和经典灰狼优化器(GWO)进行无人机三维路径规划设计实验

简介&#xff1a; 2024新算法角蜥优化算法&#xff08;HLOA&#xff09;和经典灰狼优化器&#xff08;GWO&#xff09;进行无人机三维路径规划设计实验。 无人机三维路径规划的重要意义在于确保飞行安全、优化飞行路线以节省时间和能源消耗&#xff0c;并使无人机能够适应复杂…

国内首个48小时大模型极限挑战赛落幕,四位“天才程序员”共同夺冠

4月21日晚&#xff0c;第四届ATEC科技精英赛&#xff08;ATEC2023&#xff09;线下赛落幕。本届赛事以大模型为技术基座&#xff0c;围绕“科技助老”命题&#xff0c;是国内首个基于真实场景的大模型全链路应用竞赛。ATEC2023线下赛采用48小时极限挑战的形式&#xff0c;来自东…

Ts支持哪些类型和类型运算(上)

目录 1、元组 2、接口&#xff08;interface&#xff09; 3、枚举&#xff08;Enum&#xff09; 4、字面量类型 5、keyof 6、in keyof 7、类型的装饰 静态类型系统 就是把 类型检查从运行时提前到了编译时&#xff0c;所以ts类型系统中的许多类型与js并无区别 例如&am…

概率图模型在机器学习中的应用:贝叶斯网络与马尔可夫随机场

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

go语言并发实战——日志收集系统(七) etcd的介绍与简单使用

什么是etcd etcd是基于Go语言开发的一个开源且高可用的分布式key-value存储系统&#xff0c;我们可以在上面实现配置共享与服务的注册与发现。 和它比较相似的还有我们之间所提到的Zookeeper以及consul.(注:后面我们学习微服务的时候etcd和consul会有广泛的使用) etcd有以下几…

网络中其他协议

目录 DNS协议 域名简介 ICMP协议 ICMP功能 ICMP协议格式 ping命令 NAT技术 NATP NAT技术的限制 代理服务器 DNS协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&#xff0c;是一个用来将域名转化为IP地址的应用层协议。 为什么有这个协…

W801学习笔记十二:掌机进阶V3版本之驱动(PSRAM/SD卡)

本次升级添加了两个模块&#xff0c;现在要把他们驱动起来。 一&#xff1a;PSRAM 使用SDK自带的驱动&#xff0c;我们只需要写一个初始化函数&#xff0c;并在其中添加一些自检代码。 void psram_heap_init(){wm_psram_config(0);//实际使用的psram管脚选择0或者1&#xff…

基于Linux系统命令行安装KingbaseES数据库

人大金仓通用性数据库&#xff08;Kingbase&#xff09;下载网址&#xff1a;人大金仓-成为世界卓越的数据库产品与服务提供商 选择“软件版本-数据库”&#xff0c;筛选条件Linux、完整版。找到需要的版本&#xff0c;点击下载。我下载的是KingbaseES_V008R006C008B0014_Lin6…

CyclicBarrier(循环屏障)源码解读与使用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 什么是CyclicBarrier&#xff1f; 3. CyclicBarrier与CountDownL…

共享单车(一):项目配置

配置文件 对于很多程序中要用的参数如果是可变的&#xff0c;那么最好的处理方式就是通过main函数参数传递&#xff0c;或者从别的地方去获取&#xff0c;这其中之一就是配置文件&#xff0c;但是在一个成熟和架构完善的系统&#xff0c;一般都会做到自动配置&#xff0c;自动…

【刷题】前缀和入门

送给大家一句话&#xff1a; 既然已经做出了选择&#xff0c;最好还是先假定自己是对的。焦虑未来和后悔过去&#xff0c;只经历一个就够了。 – 张寒寺 《不正常人类症候群》 ☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆ ☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆ ☆ミヾ(∇≦((ヾ…

算法练习第17天|104.二叉树的最大深度 、559.N叉树的最大深度

104.二叉树的最大深度 104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/ 什么是二叉树的深度和高度&#xff1f; 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最大深度…

C语言 三目运算符

C语言 逻辑分支语句中 还有一种 三目运算符 我们编写代码如下 #include <stdio.h>int main() {const char* a 1 1 ? "表达式1" : "表达式2";printf("%s", a);return 0; }这里 我们根据逻辑 先定义一个a 然后 它的值 等于一个 三目运算…

AIGC时代之 - 怎样更好的利用AI助手 - 指令工程

爆火的AIGC 2022年11月30日&#xff0c;OpenAI发布ChatGPT 3 2022年12月4 日&#xff0c;ChatGPT 3 已拥有超过一百万用户 2023年各种大语言模型开始火爆全球 GPT们&#xff0c;已经成为了我工作和学习的非常重要的工具。 ChatGPT也没那么神奇&#xff1f; 不知道大家有没有…