惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
月光博客
月光博客
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
IT之家
IT之家
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
S
SegmentFault 最新的问题
宝玉的分享
宝玉的分享
博客园 - Franky
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
爱范儿
爱范儿

博客园 - 一丝心情

Volta 安装和使用指南 免费国产ai试用总结 glb格式3d模型压缩 nuxt.js 项目流水线自动部署设置 免费的云数据库 vue 实用指令 IntelliJ IDEA license server 激活(亲测有效) win10/win11专业版激活码(亲测有效) Git 常用指令完全指南 npm 安装依赖报错整理 css3文字渐变, svg文字渐变 http/https与websocket的ws/wss的关系 vue 自定义指令实现v-overflow-tooltip element-ui NavMenu 多级嵌套封装 常用css vue.config.js config.resolve.alias 目录别名配置 three.js 在低版本浏览报THREE.WebGLProgran: shader error 报错解决办法 nuxt 低版本浏览器兼容babel编译配置 常用软件历史版本下载 前端常用指令 数组常用方法总结 vue 中 echarts 添加事件 常用正则
指令 v-tooltip
一丝心情 · 2023-07-25 · via 博客园 - 一丝心情

利用element ui el-tooltip 组件实现

一、创建全局指令

1.创建tooltip指令

import Vue from 'vue'
/* eslint-disable */

Vue.directive('tooltip', {
  inserted(el, binding, vnode, oldVnode) {
    // 获取app.vue根节点下的 ref为tooltip的el-tooltip组件
    const tooltip = vnode.context.$root._vnode.child.$refs.tooltip
    // const { content, placement='top' } = binding.value || { content: '', placement: 'top' }

    // 给添加指令的el对象添加鼠标移入事件
    el.__vueTooltipMouseenter__ = function() {

     const { content, placement='top' } = el.tooltip_binding_value || binding.value || { content: '', placement: 'top' }

// 获取content值,如果没有则取innerText 或 textContent
      tooltip.$parent.$data.tooltipContent = content || el.innerText || el.textContent;
      tooltip.$parent.$data.tooltipPlacement = placement;
      // 关联el
      tooltip.referenceElm = el;
      // 隐藏之前打开的popper
      tooltip.$refs.popper && (tooltip.$refs.popper.style.display = 'none');
      tooltip.doDestroy();
      tooltip.setExpectedState(true);
      tooltip.handleShowPopper();
    } 
    // 给添加指令的el对象添加鼠标移入事件
    el.__vueTooltipMouseleave__ = function() {
      tooltip.setExpectedState(false);
      tooltip.handleClosePopper();
    } 
    // 绑定事件
    el.addEventListener('mouseenter', el.__vueTooltipMouseenter__);
    el.addEventListener('mouseleave', el.__vueTooltipMouseleave__);
  },
  unbind(el, binding, vnode, oldVnode) {

      el.__vueTooltipMouseleave__()

    el.removeEventListener('mouseenter', el.__vueTooltipMouseenter__);
    el.removeEventListener('mouseleave', el.__vueTooltipMouseleave__);
    delete el.__vueTooltipMouseenter__;
    delete el.__vueTooltipMouseleave__;
  },
  update: function () {

// 同步更新指令形参数据,在鼠标移入时读取显示新数据

      el.tooltip_binding_value= binding.value

  },
  componentUpdated: function () {}
})

2.  .app.vue 添加全局el-tooltip组件

<template>
  <div id="app">
    ...
    <router-view/>
    <!-- 添加全局公用el-tooltip -->
    <el-tooltip  :placement="tooltipPlacement" ref="tooltip" :content="tooltipContent"></el-tooltip>
  </div>
</template>
<script>
export default {
  data() {
    return {
      /* 为el-tooltip设置content值 */
      tooltipContent: '',
      /* 为el-tooltip设置placement值 */
      tooltipPlacement: 'top'
    }
  },
  components: {
  },
  mounted() {
  },
  created() {
  },
  methods: {
  }
}
</script>

3.main.js 引入tooltip指令

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import 'element-ui/lib/theme-chalk/index.css'
import ElementUI from 'element-ui'
// 引入tooltip指令
import '@/directive/tooltip'


Vue.config.productionTip = false
Vue.use(ElementUI)
Vue.use(window.ELEMENT, {
  size: 'small'
})
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

4.应用v-tooltip 指令

<template>
  <div>
        <div class="t-ellipsis" v-tooltip">
            文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位
        </div>
        <div class="t-ellipsis" v-tooltip="{content: '描述说明'}" >
            文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位
        </div>
        <div class="t-ellipsis" v-tooltip="{content: '描述说明', placement: 'right' }" >
            文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位文字占位
        </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
    }
  },
  mounted() {
  },
  methods: {
  }
}
</script>
<style>
</style>