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

頁面tooltip組件限制工具函數(shù)使用示例詳解

 更新時間:2023年09月06日 11:32:11   作者:夕水  
這篇文章主要為大家介紹了頁面tooltip組件的限制工具函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

需求描述

有這樣一個需求:頁面已經(jīng)寫了太多的詳情表單元素,并且每一個表單元素都使用了Tooltip組件來包裹,這樣是不符合需求的,因?yàn)橛脩粜枰薅ó?dāng)表單元素的文本太多時,也就是說出現(xiàn)了省略號才會出現(xiàn)Tooltip組件的包裹。比如項(xiàng)目采用的element UI組件庫。在一個頁面有太多的這樣的表單元素:

<el-form>
   <el-form-item label="姓名" prop="name">
       <el-tooltip :content="form.name">
           <el-input v-model="form.name" disabled="true"></el-input>
       </el-tooltip>
   </el-form-item>
   .....后續(xù)出現(xiàn)多個這樣的元素
</el-form>

如果我每一個都加disabled屬性,那么頁面模板元素有將近一百個,很顯然我這樣加是很耗費(fèi)時間的,很顯然對于追求高效的我是不喜歡一個一個加,然后一個一個判斷的。

在這之前,我們需要確定一點(diǎn),那就是我們控制文本的截?cái)嗍峭ㄟ^CSS代碼來實(shí)現(xiàn)的。也就是如下這段代碼:

.el-input {
    text-overflow:ellipsis;
    white-space:nowrap;
    overflow:hidden;
}

因此,完成以上的需求的第一步就是需要先判斷哪些元素滿足被截?cái)嗟臈l件。那么如何判斷文本是否被截?cái)嗄??關(guān)于這個實(shí)現(xiàn),我想element ui的表格組件符合這種場景,所以我只需要去參考一下element ui的表格組件的截?cái)嗯袛鄬?shí)現(xiàn)就知道了。沒錯,我在源碼中找到了實(shí)現(xiàn)方式。

創(chuàng)建range元素

核心思路就是創(chuàng)建一個range元素,通過獲取range元素width然后與元素的offsetWidth進(jìn)行判斷就行了。所以,我按照element ui的實(shí)現(xiàn)思路完成了這個工具函數(shù)。如下所示:

function isTextOverflow(element) {
    // use range width instead of scrollWidth to determine whether the text is overflowing
    // to address a potential FireFox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1074543#c3
    if (!element || !element.childNodes || !element.childNodes.length) {
        return false;
    }
    const range = document.createRange();
    range.setStart(element, 0);
    range.setEnd(element, element.childNodes.length);
    const rangeWidth = range.getBoundingClientRect().width;
    // if the element has padding style,should add the padding value.
    const padding = (parseInt(getStyle(element, 'paddingLeft'), 10) || 0) + (parseInt(getStyle(element, 'paddingRight'), 10) || 0);
    return rangeWidth + padding > element.offsetWidth || element.scrollWidth > element.offsetWidth;
}
function hasClass(el, cls) {
    if (!el || !cls) {
        return false;
    }
    if (cls.indexOf(" ") > -1) {
        return console.error(`className should not contain space!`);
    }
    if (el.classList) {
        return el.classList.contains(cls);
    } else {
        return (" " + el.className + " ").indexOf(" " + cls + " ") > -1;
    }
}
function camelCase(name) {
    return name.replace(/([\:\_\-]+(.))/g, (_, separator, letter, offset) => offset ? letter.toUpperCase() : letter).replace(/^moz([A-Z])/, "Moz$1")
}
// IE version more than 9
function getStyle(el, styleName) {
    if (!element || !styleName) return null;
    styleName = camelCase(styleName);
    if (styleName === 'float') {
        styleName = 'cssFloat';
    }
    try {
        var computed = document.defaultView.getComputedStyle(element, '');
        return element.style[styleName] || computed ? computed[styleName] : null;
    } catch (e) {
        return element.style[styleName];
    }
}

收集所有的tooltip組件實(shí)例

這只是完成了第一步,接下來是第二步,就是我需要將頁面上所有包含tooltip組件的vue組件實(shí)例都要收集起來。首先我們可以確定頁面所有的toolTip組件實(shí)例應(yīng)該都是當(dāng)前這個表單組件實(shí)例的所有子組件,因此,我想到了遞歸去收集所有包含tooltip組件的組件實(shí)例。代碼如下:

export function findToolTip(children,tooltips = []){
    //這里寫代碼
}

所有的tooltip組件實(shí)例都是vue組件實(shí)例的子組件,所以我們可以知道我們?nèi)パh(huán)組件實(shí)例的子組件,即vm.$children屬性。然后tooltip組件有什么標(biāo)志呢?或者說我們?nèi)绾闻袛嘣撟咏M件實(shí)例就是一個tooltip組件呢?我又參考了element ui tooltip組件的實(shí)現(xiàn),發(fā)現(xiàn)element ui tooltip組件都會有一個doDestory方法。所以我們就可以根據(jù)這個來做判斷。所以遞歸方法,我們就可以寫好了。如下:

//參數(shù)1:子組件實(shí)例數(shù)組
//參數(shù)2:收集組件實(shí)例的數(shù)組
export function findToolTip(children,tooltips = []){
    for(let i = 0,len = children.length;i &lt; len;i++){
        //遞歸條件
        if(Array.isArray(children[i]) &amp;&amp; children[i].length){
            findToolTip(children[i],tooltips);
        }else{
            //判斷如果doDestroy屬性是一個方法,則代表是一個tooltip組件,添加到數(shù)組中
            if(typeof children[i].doDestroy === "function"){
                tooltips.push(children[i]);
            }
        }
    }
    //把收集到的組件實(shí)例返回
    return tooltips;
}
//調(diào)用方式,傳入當(dāng)前組件實(shí)例this對象的所有子組件實(shí)例
//如:findToolTip(this.$children)

我們找到所有tooltip組件實(shí)例了,接下來,我們要遍歷它,然后判斷是否符合截?cái)鄺l件,不符合我們就需要將組件給銷毀,事實(shí)上,我們直接設(shè)置tooltip組件實(shí)例的disabled屬性為true就可以了。接下來,就是這個工具函數(shù)的實(shí)現(xiàn)了。如下:

// 參數(shù)1:當(dāng)前組件實(shí)例this對象
// 參數(shù)2:用于獲取被tooltip包裹的子元素的類名
export function isShowToolTip(vm,className="el-input"){
    //這里寫代碼
}

如何修改tooltip組件?

接下來,我們就要實(shí)現(xiàn)這個工具函數(shù)。首先,我們需要確定的是,因?yàn)閐isabled是props數(shù)據(jù),props是單向數(shù)據(jù)流,vue.js是不建議我們直接修改的,那么我們應(yīng)該如何做到設(shè)置disabled呢?我想了很久,想的辦法就是重新渲染整個組件,利用Vue.compie API也就是編譯API直接重新編譯整個tooltip組件,然后替換原本渲染的tooltip組件。如下:

const res = Vue.compile(`<el-tooltip disabled><el-input value="${ child && child.innerText }" disabled></el-input></el-tooltip>`);
const reRender = new Vue({
    render:res.render,
    staticRenderFns:res.staticRenderFns
}).$mount(parent);//parent為獲取的tooltip組件實(shí)例根元素

所以,接下來在工具函數(shù)里,我們可以這樣實(shí)現(xiàn):

// 參數(shù)1:當(dāng)前組件實(shí)例this對象
// 參數(shù)2:用于獲取被tooltip包裹的子元素的類名
export function isShowToolTip(vm,className="el-input"){
    //為了確保能夠獲取到DOM元素,需要調(diào)用一次nextTick方法
    vm.$nextTick(() => {
        const allTooltips = findToolTip(vm.$children);
        allTooltips.forEach(item => {
            //獲取子元素
            const child = item.$el.querySelector("." + className);
            //判斷是否被截?cái)?
            if(!isTextOverflow(child)){
                //獲取渲染元素
                const parent = item.$el;
                const res = Vue.compile(`<el-tooltip disabled><el-input value="${ child && child.innerText }" disabled></el-input></el-tooltip>`);
                const reRender = new Vue({
                    render:res.render,
                    staticRenderFns:res.staticRenderFns
                }).$mount(parent);
            }
        })
    }};
}

如何使用這個工具函數(shù)?

如此一來,就做到了一個方法完成了以上的需求。如何使用這個方法呢,很簡單,我們可以在詳情組件里面監(jiān)聽表單詳情數(shù)據(jù)的變化。如:

watch:{
    form(val){
        if(typeof val === "object" && val && Object.keys(val).length){
            //將this當(dāng)做參數(shù)傳入即可
            isShowToolTip(this);
        }
    }
}

關(guān)于這個需求更好的實(shí)現(xiàn),如有更好的方法,望不吝賜教。

以上就是頁面tooltip組件的限制工具函數(shù)使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于頁面tooltip組件限制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue3使用echarts tree高度自適應(yīng)支持滾動查看功能

    Vue3使用echarts tree高度自適應(yīng)支持滾動查看功能

    這篇文章主要介紹了Vue3使用echarts tree高度自適應(yīng)支持滾動查看功能,文章同通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-06-06
  • 一文總結(jié)Vue和React的異同

    一文總結(jié)Vue和React的異同

    這篇文章主要介紹了Vue和React的相同點(diǎn)不不同點(diǎn),文中對比介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • Vue使用openlayers加載天地圖

    Vue使用openlayers加載天地圖

    這篇文章主要為大家詳細(xì)介紹了Vue如何使用openlayers加載天地圖,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下
    2024-02-02
  • 在vue中利用全局路由鉤子給url統(tǒng)一添加公共參數(shù)的例子

    在vue中利用全局路由鉤子給url統(tǒng)一添加公共參數(shù)的例子

    今天小編就為大家分享一篇在vue中利用全局路由鉤子給url統(tǒng)一添加公共參數(shù)的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue踩坑記錄之src的動態(tài)綁定賦值問題

    vue踩坑記錄之src的動態(tài)綁定賦值問題

    這篇文章主要介紹了vue踩坑記錄之src的動態(tài)綁定賦值問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • vue 根據(jù)選擇條件顯示指定參數(shù)的例子

    vue 根據(jù)選擇條件顯示指定參數(shù)的例子

    今天小編就為大家分享一篇vue 根據(jù)選擇條件顯示指定參數(shù)的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue + el-tree 實(shí)現(xiàn)插入節(jié)點(diǎn)自定義名稱數(shù)據(jù)的代碼

    vue + el-tree 實(shí)現(xiàn)插入節(jié)點(diǎn)自定義名稱數(shù)據(jù)的代碼

    這篇文章主要介紹了vue + el-tree 實(shí)現(xiàn)插入節(jié)點(diǎn)自定義名稱數(shù)據(jù)的代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • vue實(shí)現(xiàn)超過兩行顯示展開收起的代碼

    vue實(shí)現(xiàn)超過兩行顯示展開收起的代碼

    這篇文章主要介紹了vue實(shí)現(xiàn)超過兩行顯示展開收起的代碼,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue中import導(dǎo)入三種方式詳解

    vue中import導(dǎo)入三種方式詳解

    在使用vue開發(fā)項(xiàng)目的時候,很多使用會import很多模塊,這篇文章主要給大家介紹了關(guān)于vue中import導(dǎo)入三種方式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • vue使用路由router-view的詳細(xì)代碼

    vue使用路由router-view的詳細(xì)代碼

    這篇文章主要介紹了vue使用路由router-view的相關(guān)知識,其原理就是采用?SPA(single-page-application)?模式,就是只有一個?Web?頁面的應(yīng)用,通過?router?來控制頁面的刷新和迭代,感興趣的朋友一起看看吧
    2023-12-12

最新評論

响水县| 灯塔市| 九寨沟县| 苗栗县| 泾阳县| 清流县| 隆安县| 宣恩县| 二手房| 宜黄县| 尼玛县| 乐山市| 保亭| 临江市| 河东区| 武强县| 和龙市| 包头市| 昂仁县| 榆树市| 贡嘎县| 蒙自县| 彭泽县| 印江| 双峰县| 内乡县| 通辽市| 武隆县| 广德县| 平山县| 定陶县| 资溪县| 嘉荫县| 庆阳市| 甘肃省| 上蔡县| 石家庄市| 闽侯县| 桂林市| 临汾市| 金溪县|