vue3表格使用tooltip二次封装,目的使表格内容与悬浮内容不一致

本文介绍了如何使用Element-Plus表格组件的内置属性`show-overflow-tooltip`实现内容过长时的悬浮显示,以及在需求特殊情况下,如何通过二次封装`el-tooltip`来定制悬浮内容,展示表格内不同内容。通过示例代码详细展示了两种实现方式的差异,帮助开发者灵活应对不同的表格展示需求。

在使用element-plus中的表格组件,当内容过长时,悬浮显示,下面👇这个属性是表格的内置属性,表示当表格当前列的内容过长时,省略并悬浮展示,并且内置属性悬浮显示的内容,与表格内置的内容保持一致。
在这里插入图片描述
但是,在我们的实际开发中,可能会有要求,表格内只显示某一段重点内容,但是悬浮的时候显示所有内容,这个时候我们就需要对表格进行二次封装tooltip。两者效果的区别如下
样式1、原来的效果
第一种内置实现
样式2、想要的效果
在这里插入图片描述
具体实现:

一、内置属性(样式1)

<template>
  <el-table :data="tableData" stripe style="width: 500px">
    <el-table-column prop="date" label="Date" width="180" />
    <el-table-column prop="name" label="Name" width="180" />
    <el-table-column prop="address" label="Address" min-width="100" show-overflow-tooltip />
  </el-table>
</template>

<script lang="ts" setup>
const tableData = [
  {
    date: '2016-05-03',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-02',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-04',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
]
</script>

二、二次封装tooltip实现表格内容与悬浮内容不一致(样式2)

<template>
  <el-table :data="tableData" stripe style="width: 500px">
    <el-table-column prop="date" label="Date" width="180" />
    <el-table-column prop="name" label="Name" width="180" />
    <el-table-column prop="address" label="Address" min-width="100">
        <template #default="scope">
          <el-tooltip placement="top" :content="scope.row['address']">
      	{{addressFormat(scope.row["address"])}}
          </el-tooltip>
      </template>
    </el-table-column>
  </el-table>
</template>

<script lang="ts" setup>
const addressFormat = (val:string) =>{
  return val.substring(val.lastIndexOf(',') + 1);
}
const tableData = [
  {
    date: '2016-05-03',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-02',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-04',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
]

</script>

好了,这个小功能就实现了,基于此我们也可以对element-plus中的组件进行举一反三,面对不同的需求加以不同的修改,如何还有什么问题的话,欢迎在评论区指出!👇👇
最后
如何这篇博客对你有用的话,就请你点赞👍、收藏❤️、关注一下🌟吧!!

<think>我们参考引用中给出的示例,主要是使用了`<template #maxTagPlaceholder>`插槽和自定义的`ToolTipTag`组件来实现鼠标悬浮展示更多隐藏tag的功能。 在用户的问题中,他使用的是`a-tree-select`,但原理类似,现在用户询问的是在`a-select`多选时实现同样的功能。 在Ant Design Vue中,`a-select`组件同样支持多选,并且有类似的属性来控制tag的显示。关键点如下: 1. 使用`maxTagCount`属性来控制显示的tag数量,超出部分会被隐藏。 2. 使用`maxTagPlaceholder`插槽(或属性)来定义当tag被隐藏时显示的内容。我们可以在这个插槽中放置一个自定义组件,用于鼠标悬浮时显示所有隐藏的tag。 步骤: 1. 在`a-select`中设置`maxTagCount`,比如设为1,表示只显示1个tag,其余隐藏。 2. 使用`maxTagPlaceholder`插槽(注意:在Ant Design Vue 3.x中,这个插槽可能叫做`#maxTagPlaceholder`)来放置自定义的提示组件。 3. 自定义一个组件(比如`ToolTip`或`Popover`),当鼠标悬浮时显示所有隐藏的选项。 但是,引用中的示例同,引用中使用了自定义的`toolTipTag`组件,并且通过`dealCheckedList`函数来获取当前选中的标签列表。 在`a-select`中,我们可以通过`v-model`获取到选中的值(value数组),然后我们需要根据这些value找到对应的label,以显示在提示框中。 实现思路: 1. 在父组件中,定义`a-select`,并设置`maxTagCount`和`maxTagPlaceholder`插槽。 2. 在插槽内,我们放置一个自定义组件(比如`Tooltip`),当鼠标悬浮在这个占位符上时,显示一个提示框,里面列出所有隐藏的标签。 3. 自定义组件需要接收当前选中的值(value数组)和整个选项列表,然后计算出隐藏的标签(即除了显示出来的标签以外的标签)。 注意:在引用中,他们使用了一个`dealCheckedList`函数来根据value获取选中的选项的完整信息(包括label)。我们也需要类似的函数。 具体代码实现步骤: 1. 定义`a-select`组件: ```vue <a-select mode="multiple" v-model:value="selectedValues" :options="options" :maxTagCount="maxTagCount" > <template #maxTagPlaceholder="omittedValues"> <tooltip-tag :title="omittedValues.map(item => item.label).join(&#39;, &#39;)"> +{{ omittedValues.length }} </tooltip-tag> </template> </a-select> ``` 但是,实际上在Ant Design Vue 3.x中,`maxTagPlaceholder`插槽的参数是一个对象,包含`omittedValues`(被省略的选项的数组,每个选项包含value和label)和`count`(被省略的个数)。然而,根据文档,`maxTagPlaceholder`插槽的参数是`omittedValues`(被省略的选项的数组),所以我们可以直接使用。 2. 自定义`tooltip-tag`组件可以是一个简单的`a-tooltip`封装,或者直接使用`a-tooltip`组件。 但是,引用中使用了自定义的`ToolTipTag`组件,我们也可以简单实现一个: 然而,如果我们需要复杂的样式,可以直接在插槽内使用`a-tooltip`: ```vue <a-select ...> <template #maxTagPlaceholder="omittedValues"> <a-tooltip :title="omittedValues.map(opt => opt.label).join(&#39;, &#39;)"> <span>+{{ omittedValues.length }}</span> </a-tooltip> </template> </a-select> ``` 这样,当鼠标悬浮在`+n`上时,就会显示所有隐藏的标签。 但是,注意:`omittedValues`是当前被省略的选项数组,每个选项是`{ value, label, ... }`。 然而,在Ant Design Vue中,`maxTagPlaceholder`插槽的参数确实是`omittedValues`(被省略的选项数组)和`count`(被省略的数量)?我们需要确认文档。 根据Ant Design Vue的文档(以3.x版本为例): - `maxTagPlaceholder`插槽的参数是一个对象,包含`omittedValues`(被隐藏的选项)和`count`(被隐藏的数量)。 但实际上,在Ant Design Vue 4.x中,这个插槽的参数是`{ values, maxTagCount }`,其中`values`就是被隐藏的选项数组。 由于版本差异,我们需要注意。但通常,我们可以通过打印来查看。 为了兼容性,我们可以这样写: 如果使用的是Ant Design Vue 3.x(基于Vue 3): 根据源码和示例,`maxTagPlaceholder`插槽的参数是`omittedValues`(被省略的选项数组)和`count`(省略的数量)?但实际在3.x的文档中,没有明确说明,我们可以参考示例。 在引用中的示例(tree-select)中,他们并没有在插槽内使用参数,而是通过外部函数和当前选中的值来计算的。这是因为在tree-select中,插槽的参数可能直接提供被省略的选项,或者他们需要更复杂的处理(比如树形结构)。 但在`a-select`中,选项是扁平的,所以我们可以直接使用插槽参数。 因此,我们可以这样实现: 父组件: ```vue <template> <a-select mode="multiple" v-model:value="selectedValues" :options="options" :max-tag-count="maxTagCount" > <template #maxTagPlaceholder="omittedValues"> <!-- omittedValues 是一个数组,包含所有被隐藏的选项对象 --> <a-tooltip> <template #title> <div v-for="item in omittedValues" :key="item.value"> {{ item.label }} </div> </template> <span style="cursor: pointer">+{{ omittedValues.length }}</span> </a-tooltip> </template> </a-select> </template> <script lang="ts"> import { defineComponent, ref } from &#39;vue&#39;; export default defineComponent({ setup() { const selectedValues = ref([]); const options = ref([...]); // 你的选项 const maxTagCount = 1; // 只显示一个,其余隐藏 return { selectedValues, options, maxTagCount }; }, }); </script> ``` 但是,如果选项很多,我们可能需要一个更友好的显示方式,比如用逗号分隔。我们可以直接显示在一个字符串中: ```vue <a-tooltip :title="omittedValues.map(item => item.label).join(&#39;, &#39;)"> <span>+{{ omittedValues.length }}</span> </a-tooltip> ``` 这样,当鼠标悬浮在`+n`上时,就会显示所有隐藏的标签。 但是,如果用户的需求和引用中一样,需要显示当前所有选中的标签(包括显示的和隐藏的)?那就一样了。 根据用户的问题,他需要的是“显示隐藏tag内容”,也就是被隐藏的那些tag的内容。所以我们只显示被隐藏的即可。 另外,引用中的示例还做了自定义组件,因为tree-select的数据结构是树形,他们需要将树形结构扁平化来获取选中的节点标签。而我们的`a-select`选项是扁平的,所以简单很多。 因此,我们给出上述实现。 注意:在Ant Design Vue 4.x中,`a-select`的`maxTagPlaceholder`插槽的参数可能有所同。根据4.x的文档,它接收的参数是`{ values: any[], maxTagCount: number }`,其中`values`就是被省略的选项数组。 所以,如果使用4.x,写法类似。 总结:在Vue 3中,使用Ant Design Vue的`a-select`组件实现多选时鼠标悬浮显示隐藏tag内容,可以通过以下步骤: 1. 设置`max-tag-count`属性(或`:maxTagCount="number"`)来控制显示的最大tag数量。 2. 使用`#maxTagPlaceholder`插槽,并在插槽内使用`a-tooltip`组件,将隐藏的选项的label显示在tooltip中。 代码示例: ```vue <template> <a-select mode="multiple" v-model:value="selectedValues" :options="options" :max-tag-count="1" > <template #maxTagPlaceholder="omittedValues"> <a-tooltip :title="omittedValues.map(item => item.label).join(&#39;, &#39;)"> <span style="cursor: default">+{{ omittedValues.length }}</span> </a-tooltip> </template> </a-select> </template> <script> import { defineComponent, ref } from &#39;vue&#39;; export default defineComponent({ setup() { const selectedValues = ref([]); const options = [ { value: &#39;1&#39;, label: &#39;选项1&#39; }, { value: &#39;2&#39;, label: &#39;选项2&#39; }, { value: &#39;3&#39;, label: &#39;选项3&#39; }, // ...更多选项 ]; return { selectedValues, options }; }, }); </script> ``` 注意:如果选项是动态的,或者需要根据语言环境变化,请确保`options`中的label是正确的。 另外,如果选项是通过`options`属性传入,而是通过`a-select-option`子组件传入,那么插槽参数`omittedValues`可能会包含label,因为这种情况下,组件可能会将label传递给插槽。所以建议使用`options`属性。 如果必须使用`a-select-option`,那么可能需要自己维护一个value到label的映射,然后在插槽内根据value去映射中查找label。但这样会复杂一些。 因此,推荐使用`options`属性。 最后,由于用户要求参考引用,引用中使用了自定义组件,但我们这里为了简便直接使用了`a-tooltip`,用户也可以根据需要封装成自定义组件。 相关问题: 1. 在Ant Design Vue 4.x中,`a-select`的`maxTagPlaceholder`用法有什么同? 2. 如何自定义隐藏tag提示框的样式? 3. 如果选项是通过`a-select-option`子组件传入,如何实现相同的功能? </think> 在 Vue 3使用 Ant Design Vue 的 `a-select` 组件实现多选时鼠标悬浮显示隐藏 tag 内容,可以通过以下步骤实现: ### 解决方案 ```vue <template> <a-select mode="multiple" v-model:value="selectedValues" :options="options" :max-tag-count="maxTagCount" > <template #maxTagPlaceholder="omittedValues"> <a-tooltip :title="getOmittedLabels(omittedValues)"> <span class="tag-placeholder">+{{ omittedValues.length }}</span> </a-tooltip> </template> </a-select> </template> <script setup> import { ref } from &#39;vue&#39;; const selectedValues = ref([]); const maxTagCount = 2; // 显示2个tag,其余隐藏 // 选项数据 const options = ref([ { value: &#39;apple&#39;, label: &#39;苹果&#39; }, { value: &#39;banana&#39;, label: &#39;香蕉&#39; }, { value: &#39;orange&#39;, label: &#39;橙子&#39; }, { value: &#39;grape&#39;, label: &#39;葡萄&#39; }, ]); // 获取被隐藏tag的标签文本 const getOmittedLabels = (omittedValues) => { return omittedValues .map(item => { const option = options.value.find(opt => opt.value === item.value); return option ? option.label : &#39;&#39;; }) .filter(Boolean) .join(&#39;, &#39;); }; </script> <style scoped> .tag-placeholder { background: #f5f5f5; padding: 0 8px; border-radius: 4px; cursor: pointer; } </style> ``` ### 关键点说明 1. **`maxTagCount` 属性** 控制显示的 tag 数量,超出部分会被隐藏。例如 `:max-tag-count="2"` 表示只显示前两个 tag。 2. **`#maxTagPlaceholder` 插槽** 用于自定义隐藏 tag 的展示内容: - 接收参数 `omittedValues`(被隐藏的选项数组) - 使用 `a-tooltip` 实现悬浮提示 3. **获取隐藏项的标签文本** 通过 `getOmittedLabels` 方法将隐藏项的 value 转换为对应的 label: ```js omittedValues.map(item => options.value.find(opt => opt.value === item.value)?.label) ``` 4. **悬浮提示优化** - 使用 Ant Design 的 `a-tooltip` 组件显示完整标签列表 - 通过 CSS 美化占位符样式(灰色背景+圆角) ### 效果 - 当选择超过 `maxTagCount` 的选项时,多余选项会折叠为 `+n` 标签 - 鼠标悬浮在 `+n` 上时,Tooltip 显示所有隐藏选项的标签 - 点击 `+n` 可展开完整选择列表 ### 相关优化建议 1. **动态计算省略数量** 根据容器宽度动态调整 `maxTagCount`: ```js const containerRef = ref(null); // 使用 ResizeObserver 监听宽度变化并计算可显示tag数量 ``` 2. **自定义 Tooltip 内容** 如需更复杂的提示内容(如带图标或样式): ```vue <template #maxTagPlaceholder="omittedValues"> <a-popover> <template #content> <div v-for="item in omittedValues" :key="item.value"> {{ getLabel(item.value) }} </div> </template> <span>+{{ omittedValues.length }}</span> </a-popover> </template> ``` 3. **性能优化** 当选项数量极大时,使用缓存优化查找性能: ```js const labelMap = computed(() => options.value.reduce((map, opt) => ({ ...map, [opt.value]: opt.label }), {}) ); ``` [^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值