最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于ElementUI實(shí)現(xiàn)v-tooltip指令的示例代碼

 更新時(shí)間:2024年09月30日 08:42:29   作者:carl_chen  
文本溢出隱藏并使用tooltip 提示的需求,相信在平時(shí)的開發(fā)中會(huì)經(jīng)常遇到,常規(guī)做法一般是使用 elementui 的 el-tooltip 組件,在每次組件更新的時(shí)候去獲取元素的寬度/高度判斷是否被隱藏,本文給大家介紹了基于ElementUI實(shí)現(xiàn)v-tooltip指令,需要的朋友可以參考下

文本溢出隱藏并使用tooltip 提示的需求,相信在平時(shí)的開發(fā)中會(huì)經(jīng)常遇到。

常規(guī)做法一般是使用 elementui 的 el-tooltip 組件,在每次組件更新的時(shí)候去獲取元素的寬度/高度判斷是否被隱藏。

受益于 element-plus的虛擬觸發(fā) tooltip 的實(shí)現(xiàn),決定探究在 vue2 上也以一種簡(jiǎn)單的方式實(shí)現(xiàn) tooltip 提示。

探究 tooltip 源碼

源碼地址:https://github.com/ElemeFE/element/blob/dev/packages/tooltip/src/main.js

render 階段,可以看出 tooltip 組件會(huì)提取插槽中的第一個(gè)子元素進(jìn)行渲染

  render(h) {
    // ....
    const firstElement = this.getFirstElement();
    if (!firstElement) return null;

    const data = firstElement.data = firstElement.data || {};
    data.staticClass = this.addTooltipClass(data.staticClass);

    return firstElement;
  },

所以在 mounted 階段, $el 會(huì)獲取到的其實(shí)就是傳入插槽的第一個(gè)元素。

并且在這個(gè)階段,會(huì)給元素添加上mouseenter、mouseleave的事件監(jiān)聽,來控制 hover 狀態(tài)下是否顯示 tooltip

mounted() {
    this.referenceElm = this.$el;
    if (this.$el.nodeType === 1) {
      this.$el.setAttribute('aria-describedby', this.tooltipId);
      this.$el.setAttribute('tabindex', this.tabindex);
      on(this.referenceElm, 'mouseenter', this.show);
      on(this.referenceElm, 'mouseleave', this.hide);
      // ...
}

函數(shù)式調(diào)用 tooltip

在了解了 el-tooltip 的運(yùn)行原理之后,我們能夠封裝一個(gè)模板,并且支持函數(shù)式調(diào)用。

通過 getEl 獲取一個(gè) DOM 元素,以便在喚起 tooltip 時(shí)元素的所處位置。

<template>
  <el-tooltip ref="triggerRef" :manual="true">
    <template #content>
      {{ internalContent }}
    </template>
  </el-tooltip>
</template>

<script>
// useOverflowHidden 的邏輯自行定義
import { useOverflowHidden } from './use-overflow-hidden'
export default {
  name: 'TooltipFunction',
  props: {
    getEl: {
      type: Function,
      default: () => null
    },
    getContent: {
      type: Function,
      default: () => ''
    }
  },
  data() {
    return {
      internalContent: '',
      isHover: false,
    }
  },
  mounted() {
    const el = this.getEl()
    if (!el) return

    this.$refs.triggerRef.referenceElm = el;

    el.addEventListener('mousemove', this.onMouseEnter, false)
    el.addEventListener('mouseleave', this.onMouseLeave, false)
  },
  methods: {
    onMouseEnter() {
      if (!this.isHover && useOverflowHidden(this.getEl())) {
        this.internalContent = this.getContent()
        this.isHover = true
        this.$refs.triggerRef.showPopper = true
      }
    },
    onMouseLeave() {
      if (this.isHover) {
        this.isHover = false;
        this.$refs.triggerRef.showPopper = false
      }
    },
    onDestroy() {
      const el = this.getEl()
      if (!el) return

      el.removeEventListener('mousemove', this.onMouseEnter)
      el.removeEventListener('mouseleave', this.onMouseLeave)
    }
  },
}

</script>

模版完成過后,我們還需要再寫一個(gè)函數(shù)用來調(diào)用 TooltipFunction。

import Vue from 'vue'
import TooltipFunction from './tooltipFunction.vue'

function useTooltip(el) {
  const Ctor = Vue.extend(TooltipWrapper)
  const instance = new Ctor({
    propsData: {
      getContent,
      getEl: () => el,
    },
  })

  instance.$mount()
  return instance
}

在代碼中,我們只需在 mounted 中對(duì)需要 tooltip 的元素進(jìn)行一次注冊(cè)即可。

<template>
    <div ref="dataRef">foo</div>
</template>

<script>
import useTooltip from './use-tooltip.js'
export default {
    mounted() {
        const el = this.$refs.dataRef
        if (el) {
           // 獲取 content 的函數(shù)邏輯自行定義
           this.tooltipIns = useTooltip(el, () => 'foo')
        }
    },
    beforeDestory() {
        this.tooltipIns?.onDestroy()
        this.tooltipIns?.$destroy()
    }
}
</script>

自定義指令 v-tooltip

上述雖然實(shí)現(xiàn)了函數(shù)式調(diào)用 tooltip 的方式,但是還需要對(duì)每個(gè)元素進(jìn)行 ref 聲明獲取 DOM,以及組件銷毀時(shí) tooltip 的生命周期管理。vue 的自定義指令恰好能輕松解決這兩件事情。

function setupTooltipDirection() {
  const tooltipSymbol = Symbol('tooltip')
  Vue.directive('tooltip', {
    bind(el: HTMLElement) {
     // 這里我們使用 DOM 元素上的 tooltip-content 作為 通信
      const instance = createTooltipFactory(el, () => el.getAttribute('tooltip-content') || '')
      Reflect.set(el, tooltipSymbol, instance)
    },
    unbind(el) {
      const ins = Reflect.get(el, tooltipSymbol)
      if (!ins) return

      ins.onDestroy()
      ins.$destroy()
      Reflect.set(el, tooltipSymbol, null)
    },
  })
}

在業(yè)務(wù)中,即可通過簡(jiǎn)單的指令實(shí)現(xiàn) tooltip 的提示需求:

<template>
    <div v-tooltip tooltip-content="hello">hello</div>
</template>

到此這篇關(guān)于基于ElementUI實(shí)現(xiàn)v-tooltip指令的示例代碼的文章就介紹到這了,更多相關(guān)ElementUI實(shí)現(xiàn)v-tooltip內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3 + CSS實(shí)現(xiàn)一個(gè)噴火龍動(dòng)畫效果

    Vue3 + CSS實(shí)現(xiàn)一個(gè)噴火龍動(dòng)畫效果

    不知不覺中,2023年已然逝去了,龍年到了,所以本文小編使用Vue3 + CSS實(shí)現(xiàn)一個(gè)噴火龍的動(dòng)畫效果,文中有相關(guān)的代碼示例供大家參考,具有一定的參考價(jià)值,感興趣的同學(xué)可以自己動(dòng)手嘗試一下
    2024-02-02
  • 教你利用Vue3模仿Windows窗口

    教你利用Vue3模仿Windows窗口

    最近學(xué)習(xí)了Vue3,利用vue3做了個(gè)好玩的項(xiàng)目,所以下面這篇文章主要給大家介紹了關(guān)于如何利用Vue3模仿Windows窗口的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 解決vue多層彈框時(shí)存在遮擋問題

    解決vue多層彈框時(shí)存在遮擋問題

    本文給大家介紹vue多層彈框時(shí)存在遮擋問題,解決思路首先想到的是找到對(duì)應(yīng)的遮擋層的css標(biāo)簽,然后修改z-index值,但是本思路只能解決首次問題,再次打開還會(huì)存在相同的問題,故該思路錯(cuò)誤,下面給大家?guī)硪环N正確的思路,一起看看吧
    2022-03-03
  • axios請(qǐng)求的一些常見操作實(shí)戰(zhàn)指南

    axios請(qǐng)求的一些常見操作實(shí)戰(zhàn)指南

    axios是一個(gè)輕量的HTTP客戶端,它基于XMLHttpRequest服務(wù)來執(zhí)行 HTTP請(qǐng)求,支持豐富的配置,支持Promise,支持瀏覽器端和 Node.js 端,下面這篇文章主要給大家介紹了關(guān)于axios請(qǐng)求的一些常見操作,需要的朋友可以參考下
    2022-09-09
  • vue使用富文本編輯器vue-quill-editor的操作指南和注意事項(xiàng)

    vue使用富文本編輯器vue-quill-editor的操作指南和注意事項(xiàng)

    vue中很多項(xiàng)目都需要用到富文本編輯器,在使用了ueditor和tinymce后,發(fā)現(xiàn)并不理想,所以果斷使用vue-quill-editor來實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于vue使用富文本編輯器vue-quill-editor的操作指南和注意事項(xiàng),需要的朋友可以參考下
    2023-05-05
  • Vue利用dayjs封裝實(shí)現(xiàn)時(shí)間實(shí)時(shí)刷新

    Vue利用dayjs封裝實(shí)現(xiàn)時(shí)間實(shí)時(shí)刷新

    Day.js庫(kù)本身專注于簡(jiǎn)化JavaScript日期和時(shí)間的操作,它的API設(shè)計(jì)直觀,且功能強(qiáng)大,可以方便地格式化日期、添加或減去時(shí)間間隔、比較日期等,本文主要介紹了Vue利用dayjs封裝實(shí)現(xiàn)時(shí)間實(shí)時(shí)刷新,需要的朋友可以參考下
    2024-07-07
  • 用Vue?Demi同時(shí)支持Vue2和Vue3的方法

    用Vue?Demi同時(shí)支持Vue2和Vue3的方法

    這篇文章主要介紹了用Vue?Demi同時(shí)支持Vue2和Vue3的方法,實(shí)際開發(fā)中,同一個(gè)API在不同的版本中可能導(dǎo)入的來源不一樣,比如ref方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 3分鐘了解vue數(shù)據(jù)劫持的原理實(shí)現(xiàn)

    3分鐘了解vue數(shù)據(jù)劫持的原理實(shí)現(xiàn)

    這篇文章主要介紹了3分鐘了解vue數(shù)據(jù)劫持的原理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • vue中使用echarts并根據(jù)選擇條件動(dòng)態(tài)展示echarts圖表

    vue中使用echarts并根據(jù)選擇條件動(dòng)態(tài)展示echarts圖表

    雖然老早就看過很多echarts的例子, 但自己接觸的項(xiàng)目中一直都沒有真正用到過,直到最近才開始真正使用,下面這篇文章主要給大家介紹了關(guān)于vue中使用echarts并根據(jù)選擇條件動(dòng)態(tài)展示echarts圖表的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 前端 Vue.js 和 MVVM 詳細(xì)介紹

    前端 Vue.js 和 MVVM 詳細(xì)介紹

    這篇文章主要介紹了前端 Vue.js 和 MVVM 詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12

最新評(píng)論

伽师县| 资中县| 大宁县| 比如县| 南靖县| 咸阳市| 永川市| 闽清县| 班玛县| 祥云县| 馆陶县| 扎赉特旗| 大新县| 晋城| 什邡市| 梅州市| 屏东市| 油尖旺区| 德保县| 密云县| 滦平县| 七台河市| 荆州市| 卢氏县| 江永县| 石阡县| 平原县| 天全县| 育儿| 汉沽区| 巧家县| 抚州市| 嵊泗县| 和龙市| 泸西县| 潜江市| 武隆县| 武城县| 林周县| 嘉善县| 天门市|