vue3+elementplus表格表头加图标及文字提示

表头加自定义内容有很多种方法,包括使用el-icon,插槽,CSS 伪元素添加图标还有font-awesome等等。

一、方法一:使用render-header属性

复制代码
<el-table :data="tableData">
  <el-table-column 
    prop="name" 
    label="姓名"
    :render-header="(h, { column }) => {
      return (
        <div>
          <span>{column.label}</span>
          <el-tooltip content="这是姓名列提示" placement="top">
            <i class="el-icon-question" style="margin-left: 5px;"></i>
          </el-tooltip>
        </div>
      )
    }"
  >

二、方法2:使用插槽

复制代码
<el-table :data="tableData">
  <el-table-column prop="age" label="年龄">
    <template #header>
      <div>
        <span>年龄</span>
        <el-tooltip content="这是年龄列提示" placement="top">
          <i class="el-icon-question" style="margin-left: 5px;"></i>
        </el-tooltip>
      </div>
    </template>
  </el-table-column>
</el-table>

三、方法3:通过 CSS 伪元素添加图标

复制代码
<el-table :data="tableData">
  <el-table-column prop="address" label="地址" title="这是地址列提示">
  </el-table-column>
</el-table>

<style>
/* 在特定列后添加图标 */
.el-table__header th:nth-child(3) .cell::after {
  content: "\e609"; /* ElementPlus图标Unicode */
  font-family: "element-icons";
  margin-left: 5px;
}
</style>

四、方法4:封装自定义组件

复制代码
<!-- components/TableHeader.vue -->
<template>
  <div>
    <span>{{ label }}</span>
    <el-tooltip :content="tooltip" placement="top">
      <i class="el-icon-question" style="margin-left: 5px;"></i>
    </el-tooltip>
  </div>
</template>

<script>
export default {
  props: {
    label: String,
    tooltip: String
  }
}
</script>

<!-- 在表格中使用 -->
<el-table :data="tableData">
  <el-table-column prop="email" label="邮箱">
    <template #header>
      <TableHeader label="邮箱" tooltip="这是邮箱列提示" />
    </template>
  </el-table-column>
</el-table>

五、 Font Awesome 图标

1、使用 npm 或 yarn 安装核心库及所需图标集:
复制代码
npm install @fortawesome/fontawesome-svg-core \
            @fortawesome/free-solid-svg-icons \
            @fortawesome/free-regular-svg-icons \
            @fortawesome/free-brands-svg-icons \
            @fortawesome/vue-fontawesome@prerelease
  • fontawesome-svg-core:核心库
  • free-solid-svg-icons:实心图标集
  • free-regular-svg-icons:常规图标集
  • free-brands-svg-icons:品牌图标集
  • vue-fontawesome@prerelease:Vue3 兼容版本
2、在 src/main.js 中导入并注册常用图标:
复制代码
import { createApp } from 'vue'
import App from './App.vue'
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
import { library } from '@fortawesome/fontawesome-svg-core'

// 导入需要的图标
import { 
  faUser, faEnvelope, faPhone, faInfoCircle,
  faEdit, faTrash, faCheck, faTimes 
} from '@fortawesome/free-solid-svg-icons'

// 将图标添加到库中
library.add(faUser, faEnvelope, faPhone, faInfoCircle, 
            faEdit, faTrash, faCheck, faTimes)

createApp(App)
  .component('font-awesome-icon', FontAwesomeIcon) // 全局注册组件
  .mount('#app')
3、在 Vue 模板中直接使用 <font-awesome-icon> 组件
复制代码
<template>
  <div>
    <!-- 基本用法 -->
    <font-awesome-icon icon="user" />
    
    <!-- 带样式的图标 -->
    <font-awesome-icon icon="envelope" class="text-blue-500 text-xl" />
    
    <!-- 品牌图标 -->
    <font-awesome-icon icon="['fab', 'github']" />
    
    <!-- 动态图标 -->
    <font-awesome-icon :icon="currentIcon" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      currentIcon: 'check' // 动态切换图标
    }
  }
}
</script>
4、在特定组件中使用图标
复制代码
<template>
  <div>
    <font-awesome-icon :icon="faUser" />
  </div>
</template>

<script>
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
import { faUser } from '@fortawesome/free-solid-svg-icons'

export default {
  components: {
    FontAwesomeIcon
  },
  setup() {
    return {
      faUser
    }
  }
}
</script>

总结:

我用到的实在特定页面特定表格列使用图标,主要代码:

html:

复制代码
<el-table-column
              v-else-if="!item.show"
              :prop="item.prop"
              :label="item.name"
              header-align="center"
              :width="item.width"
              align="center"
              :render-header="(props) => renderHeaderWithTooltip(props, item)"
            > 
              <template #default="scope">
                <div v-if="item.name=='教育教学信息状态'">
                  <text v-if="scope.row[item.prop] == 0">已填写</text>
                  <text v-else style="color: red">{{ scope.row[item.prop] }}项未填写</text>
                </div>
                <div v-else>
                  <text v-if="scope.row[item.prop] == 0">完善</text>
                  <text v-else-if="item.separate" style="color: red">未完善</text>
                  <text v-else style="color: red">
                    {{ scope.row[item.prop] }}项未完善 
                  </text>
                </div>
              </template>
            </el-table-column>

js:

复制代码
//引入
import { h } from 'vue';
import { ElTooltip } from 'element-plus';
import 'font-awesome/css/font-awesome.min.css';

/ 表头展示图标及提示
const renderHeaderWithTooltip = (props, item) => {
  const tooltipContent = {
    '编制信息状态': '该教师除"隶属集团"外的字段未填写的数量',
    '教育教学信息状态': '近5年教育教学填写情况',
    '个人信息状态': '该教师除"曾用名"外的字段未填写的数量'
  }[item.name];
  
  if (tooltipContent) {
    return h(
      ElTooltip,
      { placement: 'top', content: tooltipContent },
      {
        default: () => h(
          'div',
          { class: 'flex items-center justify-center' },
          [
            h('i', {
              class: 'fa fa-info-circle mr-3 text-primary',
               style:{'font-size': '16px','margin-top': '3px'} }),
            h('span', props.column.label)
          ]
        )
      }
    );
  } else {
    // 对于不需要提示的列,直接显示标签
    return h('span', props.column.label);
  }
};
相关推荐
mldong3 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排4 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60614 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角5 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!6 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰6 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi7 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen8 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马9 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu9 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss