Element UI 表格搜索高亮

需求:

输入关键词后点击搜索或按回车,匹配的行将变为浅蓝色背景。支持姓名和部门模糊匹配。

代码实现:
复制代码
<template>
    <div id="app">
        <div class="app-container">
            <div class="header">
                <h2>员工信息表 - 搜索高亮演示</h2>
                <div class="search-area">
                    <el-input
                        v-model="searchKeyword"
                        placeholder="请输入姓名或部门进行搜索"
                        prefix-icon="el-icon-search"
                        clearable
                        style="width: 250px;"
                        @keyup.enter.native="handleSearch"
                    ></el-input>
                    <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
                    <el-button icon="el-icon-refresh" @click="resetSearch">重置</el-button>
                </div>
            </div>

            <el-table
                :data="tableData"
                style="width: 100%"
                :row-class-name="tableRowClassName"
                border
                stripe
                highlight-current-row
            >
                <el-table-column prop="date" label="入职日期" width="180" sortable></el-table-column>
                <el-table-column prop="name" label="姓名" width="180" sortable>
                    <template slot-scope="scope">
                        <span :style="{ fontWeight: scope.row.name.includes(searchKeyword) && searchKeyword ? 'bold' : 'normal' }">
                            {{ scope.row.name }}
                        </span>
                    </template>
                </el-table-column>
                <el-table-column prop="department" label="部门" width="180" sortable></el-table-column>
                <el-table-column prop="address" label="地址"></el-table-column>
                <el-table-column label="操作" width="120">
                    <template slot-scope="scope">
                        <el-button size="mini" type="text" @click="handleEdit(scope.row)">编辑</el-button>
                    </template>
                </el-table-column>
            </el-table>
            
            <div class="tips">
                * 提示:输入关键词后点击搜索或按回车,匹配的行将变为浅蓝色背景。支持姓名和部门模糊匹配。
            </div>
        </div>
    </div>
</template>

<script>
export default {
  name: 'table-data',
  data() {
    return {
		searchKeyword: '',
		// 原始数据,用于重置
		originalTableData: [
			{ date: '2023-01-15', name: '张三', department: '技术部', address: '北京市朝阳区科技路1号' },
			{ date: '2023-02-20', name: '李四', department: '产品部', address: '上海市浦东新区创新路2号' },
			{ date: '2023-03-10', name: '王五', department: '技术部', address: '深圳市南山区高新园3号' },
			{ date: '2023-04-05', name: '赵六', department: '市场部', address: '杭州市西湖区文一路4号' },
			{ date: '2023-05-12', name: '孙七', department: '人事部', address: '成都市高新区天府大道5号' },
			{ date: '2023-06-18', name: '周八', department: '技术部', address: '武汉市洪山区光谷广场6号' },
			{ date: '2023-07-22', name: '吴九', department: '财务部', address: '南京市玄武区中山路7号' },
			{ date: '2023-08-30', name: '郑十', department: '产品部', address: '西安市雁塔区曲江新区8号' }
		],
		// 当前显示的数据
		tableData: []
    }
  },
  created(){
	// 初始化数据
	this.tableData = [...this.originalTableData];
  },
  mounted(){
    
  },
  methods: {
	/**
	 * 核心方法:动态行类名
	 * Element UI 会在每次渲染行时调用此函数
	 * @param {Object} param - { row, rowIndex }
	 * @returns {String} - 类名字符串
	 */
	tableRowClassName({ row, rowIndex }) {
		if (!this.searchKeyword) {
			return '';
		}
		
		const keyword = this.searchKeyword.toLowerCase();
		// 匹配姓名或部门
		const matchName = row.name && row.name.toLowerCase().includes(keyword);
		const matchDept = row.department && row.department.toLowerCase().includes(keyword);
		
		if (matchName || matchDept) {
			return 'highlight-row';
		}
		return '';
	},
	
	/**
	 * 搜索按钮点击事件
	 * 这里我们不需要过滤数据,只需要触发视图更新即可
	 * 因为 tableRowClassName 依赖 searchKeyword,Vue 的响应式系统会自动处理
	 */
	handleSearch() {
		// 强制刷新表格视图(通常不需要,但为了保险起见可以调用)
		// this.$forceUpdate(); 
		this.$message.success(`已搜索关键词: "${this.searchKeyword}"`);
	},
	
	/**
	 * 重置搜索
	 */
	resetSearch() {
		this.searchKeyword = '';
		this.$message.info('已重置搜索条件');
	},
	
	handleEdit(row) {
		this.$message.info(`编辑用户: ${row.name}`);
	}
  }
}
</script>

<style lang="less" scoped>

	.app-container {
		max-width: 1200px;
		margin: 0 auto;
		background: #fff;
		padding: 20px;
		border-radius: 8px;
		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
	}
	.header {
		margin-bottom: 20px;
		display: flex;
		justify-content: space-between;
		align-items: center;
	}
	.search-area {
		display: flex;
		gap: 10px;
	}

	/* 
	 * 关键样式:高亮行背景色 
	 * 使用 !important 确保优先级高于 Element UI 默认样式
	 */
	.el-table .highlight-row {
		background-color: #e6f7ff !important;
		color: #1890ff;
	}

	/* 
	 * 关键样式:高亮行悬停时的背景色 
	 * 防止鼠标移上去时背景色变回默认灰色
	 */
	.el-table__body tr.highlight-row:hover > td {
		background-color: #bae7ff !important;
	}

	/* 针对斑马纹表格的特殊处理,如果开启了 stripe */
	.el-table--striped .el-table__body tr.el-table__row--striped.highlight-row td {
		background-color: #e6f7ff !important;
	}

	.tips {
		margin-top: 10px;
		font-size: 12px;
		color: #909399;
	}
</style>
代码说明:
  1. ‌核心逻辑 ‌:利用 Element UI el-table 的 :row-class-name 属性,绑定 tableRowClassName 方法。该方法在每次表格渲染或数据更新时执行,根据当前的 searchKeyword 判断每一行是否匹配。
  2. ‌响应式更新 ‌:当用户在输入框输入内容并点击"搜索"或按回车时,searchKeyword 变量更新。由于 Vue 的响应式机制,表格会重新渲染,从而重新执行 tableRowClassName,实现动态高亮。
  3. ‌样式穿透 ‌:使用了 CSS 类 .highlight-row 并配合 !important 来覆盖 Element UI 默认的表格行背景色和悬停色,确保高亮效果明显且不被 hover 状态覆盖。
  4. ‌用户体验‌:添加了重置按钮、回车搜索支持、以及简单的操作反馈(Message 提示),界面采用卡片式布局,整洁美观。
相关推荐
panxianren4 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
陈随易6 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
可乐鸡翅yeah_7 小时前
FFmpeg 生成 HLS 独立分片 independent‑segments 参数到底有什么用
javascript·ffmpeg·音视频·safari·m3u8
福兮说7 小时前
canvas 旋转图片的六个坑:四角被裁、Math.ceil 多出 1px 黑边、JPG 角发黑、翻转方向反了
前端·javascript·图像处理·canvas
传奇开心果编程8 小时前
【SwiftUI提高练中学】第8课 网络层架构:拦截器、重试、缓存与离线优先
学习·macos·ui·ios·swiftui
Ai-_Man9 小时前
您您这可以把Grok的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑
传人once9 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
传奇开心果编程9 小时前
【现代声明式UI学与练】第7课 组件通信——父传子、子传父、跨层级通信、状态提升与 Context
学习·flutter·react native·ui·swiftui·android jetpack
Eric.469 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
liangshanbo121510 小时前
JavaScript 异步核心主线
javascript·事件循环·异步操作