根据现有html里的元素上面动态创建el-tooltip组件并显示的几种方式

发布于:2024-10-11 ⋅ 阅读:(27) ⋅ 点赞:(0)

       1、 在这个示例中,我们创建了一个 ref 引用来指向我们想要附加 Tooltip 的 DOM 元素。然后在 onMounted 生命周期钩子中,我们创建了 Tooltip 组件的实例,并将其挂载到一个新创建的 DOM 元素上。我们还在触发元素上添加了 mouseentermouseleave 事件监听器来控制 Tooltip 的显示和隐藏。

<template>
  <div class="tooltip-trigger" ref="triggerEl">Hover me</div>
</template>

<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';
import { ElTooltip } from 'element-plus';

const triggerEl = ref(null);
let tooltipInstance = null;

onMounted(() => {
  if (triggerEl.value) {
    // 创建 tooltip 组件实例
    tooltipInstance = defineComponent({
      template: `<div><el-tooltip :content="content" placement="top"><span ref="tooltipTrigger"></span></el-tooltip></div>`,
      components: { ElTooltip },
      data() {
        return {
          content: 'This is a tooltip'
        };
      },
      mounted() {
        // 将 tooltip 的触发元素设置为动态创建的 span
        this.$refs.tooltipTrigger.appendChild(triggerEl.value);
      }
    });

    // 挂载到触发元素上
    const mountNode = document.createElement('div');
    triggerEl.value.appendChild(mountNode);
    tooltipInstance = createApp(tooltipInstance).mount(mountNode);

    // 监听鼠标事件来控制显示和隐藏
    triggerEl.value.addEventListener('mouseenter', () => {
      tooltipInstance.component.proxy.$refs.tooltip.content = 'Updated content';
    });
    triggerEl.value.addEventListener('mouseleave', () => {
      // 隐藏 tooltip
      tooltipInstance.component.proxy.$refs.tooltip.doDestroy();
    });
  }
});

onBeforeUnmount(() => {
  if (tooltipInstance) {
    // 销毁 tooltip 实例
    tooltipInstance.unmount();
  }
});
</script>

<style>
.tooltip-trigger {
  cursor: pointer;
}
</style>

2、下面通过找到一个 容器来进行动态创建虚拟节点的方式

 // 假设属性值存储在变量中
      nextTick(() => {
        const attributeValue = element.id;
        // 构建CSS选择器字符串
        const selector = `[data-element-id="${attributeValue}"]`;
        const container = document.querySelector(selector);
        console.log("container=",container)
        // 创建一个不可见的触发元素
          const trigger = document.createElement('div');
          trigger.style.display = 'none';
          container.appendChild(trigger);
        // 创建一个el-tooltip的虚拟节点
          const tooltipVNode = createVNode(ElTooltip, {
            content: nodeHtml.value,
            placement: 'top',
            offset: 100, // 可以根据需要调整偏移量
            //reference: trigger, // 使用触发元素的引用
            visible: true, // 设置为可见
          });

        
        // 使用render函数将虚拟节点渲染到容器元素上
        render(tooltipVNode, container);     
      })