指令 v-tooltip

利用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.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>        
复制代码

 

posted @   一丝心情  阅读(816)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示