Debug-027-el-tooltip组件的使用及注意事项

前言:

        这两天,碰到这个饿了么的el-tooltip比较多。这个组件使用起来也挺简单的,常用于展示鼠标 hover 时的提示信息。但是有一些小点需要注意。这里不再机械化的介绍文档,不熟悉的话可以先看一下:

https://element-plus.org/zh-CN/component/tooltip.htmlicon-default.png?t=O83Ahttps://element-plus.org/zh-CN/component/tooltip.html

(1)定制化样式:

建议看一下这个,因为我们项目中并没有使用默认的样式,而是对el-tooltip有定制化的内容,在全局中设置统一的样式,这个案例需要各位参考一下:

(2) 悬浮显示的内容content是可以采用插槽slot的形式的,这样就比较灵活。参考这个:

下面两个属性是我才知道的:

(3)支持disabled控制Tooltip 组件是否禁用

(4)show-after:可以控制悬浮几秒之后才显示提示信息。个人觉得这个属性很贴心,因为鼠标快速移动会有很多Tooltip被触发,这会让列表显示很乱,因为这个触发很快。设置延迟就会效果很好。

使用el-tooltip配合(3)(4)两个属性在el-tree中可以实现当某一层级字数过多,对名称有一个缩写,并且悬浮显示全部名称的效果,这里还配合使用了动态样式使用getWidth()方法。

        <el-tree
          ref="treeRef"
          class="flow-tree"
          :data="treeData"
          :props="defaultProps"
          node-key="name"
          expand-on-click-node
          :current-node-key="currentNodeKey"
          :default-expanded-keys="treeNodeArr"
          highlight-current
          :filter-node-method="filterNode"
          @node-click="handleTreeClick"
        >
          <!-- `${130 + node.level * 10}px`  -->
          <template #default="{ node, data }">
            <div class="tree-label">
              <!-- <div class="name" :style="{ width: getWidth(node) }" :title="node.label">
                {{ ellipsis(node) }}
              </div> -->
              <el-tooltip
                placement="top-start"
                effect="customized"
                :show-after="1000"
                :content="node.label"
                :disabled="node.label.length <= 13"
                :enterable="false"
              >
                <span class="name" :style="{ width: getWidth(node) }">{{ node.label.length > 13 ? `${node.label.slice(0, 13)}...` : node.label }}</span>
              </el-tooltip>
              <div>
                <span v-if="data.name !== '未分组' && data.level !== 5" v-authorize="141">
                  <circle-plus class="el-icon-delete" @click.stop="append(node, data)" />
                </span>
                <span v-if="data.name !== '未分组'" v-authorize="143">
                  <delete class="el-icon-delete" style="margin-left: 10px;" @click.stop="remove(node, data)" />
                </span>
              </div>
            </div>
          </template>
        </el-tree>



function getWidth(node:any) {
  const temp = 10
  const width = 150 + (node.level === 1 ? 5 * temp : node.level === 2 ? 4 * temp : node.level === 3 ? 3 * temp : node.level === 4 ? 2 * temp : node.level === 5 ? 1 * temp : 0)
  return `${width}px`
}

效果大致如下:

这里其实还可以被优化。

(5)Popover 和Tooltip 是有相似的属性的,你可以尝试把Popover的属性用在Tooltip上,说不定可以成功。不过我忘记是什么属性了。没事儿可以试一下。

(6)项目中还遇到一个问题我想也可以放在这里讲:

在el-table组件中其实是有这两个属性使用的。当然也要配合show-overflow-tooltip属性去使用。

这里我想说的是,当我们的表格中的某一列单元格的内容超级多的时候,肯定是需要设置show-overflow-tooltip实现鼠标悬浮显示全部信息的。

但是默认的悬浮提示框,会撑满整个屏幕:

这里也调研了一会儿,需要使用万能的CSS:

.is-dark{
  max-width: 30%;
}

 这里因为tooltip-effect的默认样式就是dark,这个样式找了很久,最开始没注意到。让它的宽度最大30%

tooltip-effect属性默认是使用dark的,所以这里需要用is-dark,如果是light估计样式就会是is-light。

### 实现 `el-select` 组件选中时触发 `el-tooltip` 为了实现当用户选择 `el-select` 中的一个选项时,能够显示对应的 `el-tooltip` 提示信息,可以采用如下方法: #### 方法一:通过监听 `change` 事件 可以在 `el-select` 上绑定一个 `@change` 事件处理器,在该处理函数内动态设置要展示的工具提示内容并控制其可见性。 ```html <template> <div style="display:inline-block;"> <!-- Select Component --> <el-select v-model="selectedValue" placeholder="请选择..." @change="handleSelectChange"> <el-option v-for="(item,index) in options" :key="index" :label="item.label" :value="item.value"> </el-option> </el-select> <!-- Tooltip Component --> <el-tooltip effect="dark" placement="top-start" ref="tooltipRef"> <template #content>{{ tooltipContent }}</template> <span></span> <!-- Empty span to act as the trigger element --> </el-tooltip> </div> </template> <script setup lang="ts"> import { ref, nextTick } from 'vue'; const selectedValue = ref(''); const tooltipContent = ref(''); let timeoutId; // Options data for select component const options = [ { value: 'option1', label: '黄金糕' }, { value: 'option2', label: '双皮奶' } ]; function handleSelectChange(value) { const selectedItem = options.find(option => option.value === value); if (selectedItem && selectedItem.label) { // Set new content and show after a short delay. tooltipContent.value = `${selectedItem.label} 的详细介绍`; clearTimeout(timeoutId); // Hide immediately before showing again with updated text. hideTooltip(); setTimeout(() => { showTooltip(); // Automatically close it after some time or when another selection is made. timeoutId = window.setTimeout(hideTooltip, 3000); }, 50); } } async function showTooltip() { await nextTick(); // Ensure DOM updates are completed first. const instance = this.$refs.tooltipRef; if (!instance || !instance.showPopper) return; instance.showPopper(); } function hideTooltip() { const instance = this.$refs.tooltipRef; if (!instance || !instance.hidePopper) return; instance.hidePopper(); } </script> ``` 这种方法利用了 Vue 的响应式特性以及 `nextTick()` 来确保更新后的视图已经被渲染出来之后再操作 `el-tooltip` 的实例对象。这样做的好处是可以精确地控制何时何地显示或隐藏提示框[^1]。 另外一种更简单的方式是在每次更改时手动调用 `doLayout()` 或者直接修改样式来调整位置和状态,但这通常不如上述方式灵活且容易维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小白-RMS

谢谢老板

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值