記錄--`ElementUI` 中的奇技淫巧

来源:https://www.cnblogs.com/smileZAZ/archive/2023/10/10/17755427.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 在ElementUI的世界中,不僅有基礎的組件和功能,還有一些讓你眼前一亮、*得不能再*的高級技巧和竅門。本文將揭示這些技巧,讓你在前端開發的舞臺上獨領風騷。無論你是一個勇敢的創新者還是一個喜歡調皮搗蛋的開發者,這些技巧都將讓你的Elem ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

ElementUI的世界中,不僅有基礎的組件和功能,還有一些讓你眼前一亮、*得不能再*的高級技巧和竅門。本文將揭示這些技巧,讓你在前端開發的舞臺上獨領風騷。無論你是一個勇敢的創新者還是一個喜歡調皮搗蛋的開發者,這些技巧都將讓你的ElementUI應用更加酷炫和有趣!

直接進入正題

el-scrollbar滾動條

 自定義滾動條的原理

warp:滾動的可顯示區域,滾動內容就是在這個區域中滾動;

view:實際的滾動內容,超出warp可顯示區域的內容將被隱藏;

track:滾動條的滾動滑塊;

thumb:上下滾動的軌跡。

<el-scrollbar>
    <li v-for="user in userList" :key="user.id">{{user.name}}</li>
</el-scrollbar>

管理彈出層的z-indexPopupManager

ElementUI的彈出層在元素定位上,都有兩種實現方式,分別是:

  • append-to-body:此模式下,彈出層會被放在<body>元素上,通過position: fixed定位,配合動態的topleft屬性,完成彈出元素的定位。
  • append-to-body:此模式下,彈出層通過position: absolute定位,配合其父元素position: relative來完成彈出元素的定位。

在大多數情況下,ElementUI都是預設使用append-to-body,因為非append-to-body存在嚴重副作用,只有迫不得已的情況下才需要使用。

具體有什麼副作用,可以把你們的理解打在評論區。

ElementUI彈出層的核心實現機制: 只要讓新出現的彈出層,永遠比之前所有彈出層的層級要高,就不會有新彈層舊彈層遮蓋的事情發生。

PopupManager:為彈出層提供獲取實例、註冊、註銷等各種能力,但其最重要的能力,是提供了z-index的層級管理能力。

ElementUI為其內置了一個彈出層z-index基數(2000),但可以進行修改。

// 修改彈出層的`z-index`從3000開始遞增
Vue.use(Element, {zIndex: 3000})
<template>
  <div class="container">
    <el-button @click="onClick">增加</el-button>
    z-index: {{ value }} 
  </div>
</template>
<script>
import { PopupManager } from 'element-ui/src/utils/popup'
export default {
  data() {
    return {
      value: 0
    }
  },
  methods: {
    onClick() {
      // 使用
      this.value = PopupManager.nextZIndex()
    }
  }
}
</script>

實戰:一個更靈活的全屏組件

眾所周知,瀏覽器是有官方的全屏API的:Element.requestFullscreen(),它可以讓一個元素立刻鋪滿視窗,並且置於所有元素之上。官方全屏是設定層級高於一切,那些append-to-body的彈窗,無論z-index多高,也絕對不會被顯示出來。而那些非append-to-body模式的彈出層,確實會在某些業務場景不符合要求。

符合ElementUI層級標準的全屏組件

和瀏覽器官方API實現全屏的思路基本一致,但不同的地方在於:

  • 官方全屏會預設置頂,z-index無限大;
  • 封裝的全屏組件,z-index符合PopupManager管家的規範。

示例代碼

<template>
    <div :class="{ 'custom-full-screen': isFullScreen }" :style="{zIndex: currentZIndex}">
      <slot></slot>
    </div>
    </template>
<script>
import { PopupManager } from 'element-ui/src/utils/popup'
​
export default {
  data() {
    return {
      isFullScreen: false,
      currentZIndex: null
    }
  },
  methods: {
    request() {
      this.isFullScreen = true
      this.currentZIndex = PopupManager.nextZIndex()
    }
  }
}
</script>
<style>
.custom-full-screen {
  position: fixed !important;
  top: 0 !important;
  left: 0 !important;
  right: 0 !important;
  bottom: 0 !important;
  width: 100% !important;
  height: 100% !important;
}
</style>

萬能彈出組件:vue-popper

ElementUI中的大部分彈出層都是基於vue-popper組件來實現的。比如selectdata-pickercascaderdropdownpopvertooltip等。

如何使用vue-popper

通常來說,它的主要用法是混入(mixins)

可以參考ElementUI select-dropdown中對它的具體使用。

實戰:完全自定義的彈出層

  1. 引入vue-popper,在模板中引入該組件,並定義一個彈出層元素,一個定位元素。

<template>
  <!-- 定位元素 -->
  <div class="custom-picker">
    <!-- vue-popper組件 -->
    <Popper ref="popper" v-model="showPopper"></Popper>
    <!-- 彈出組件 -->
    <div ref="fly-piece" v-show="showPopper" class="custom-picker__popper">彈出內容</div>
  </div>
</template>
<script>
// 引入vue-popper組件
import Popper from 'element-ui/src/utils/vue-popper';
​
export default {
  components: {
    Popper
  },
  data() {
    return {
      // 雙向綁定,控制彈出層是否彈出
      showPopper: false
    },
  },
}
</script>

mounted() {
  this.$refs.popper.popperElm = this.$refs['fly-piece'];
  this.$refs.popper.referenceElm = this.$el;
}

3.通過控制vue-popperprops.value來控制是否彈出。

this.showPopper = !this.showPopper

ClickOutside

ClickOutsideElementUI實現的一個自定義指令,顧名思義,就是點擊元素外面才會觸發的事件。ElementUI中的selectdropdownpopver等組件都用到該指令。

<template>
    <div v-clickoutside="handleClose" v-show="flag"></div>
</template>
<script>
import Clickoutside from "element-ui/src/utils/clickoutside"
export default{
    data(){
        return {
            flag: true
        }
    },
    directives: { Clickoutside },
    methods: {
        handleClose(){
            this.flag = false;
        }
    }
}    
</script>

 

本文轉載於:

https://juejin.cn/post/7276113864123318335

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 【學習課程】:【【小白入門 通俗易懂】2021韓順平 一周學會Linux】 https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e054 ...
  • 背景 某機房內部訪問需要配置 HTTPS,網上找的一些證書教程都不是特別好,有些直接生成證書,沒有根 CA 的證書導致信任不了 Ubuntu 機器,有些教程只有功能變數名稱生成,沒有 IP 生成,有些甚至報錯。故發一個筆者在 Ubuntu 22.04 機器上測試正確可用的流程,這裡使用 10.12.0.2 ...
  • 說明:在Linux CentOS系統中,軟體的管理方式有三種:rpm、yum、編譯方式。 一、rpm 優點:對於軟體包的操作比較簡單,通過簡單指令即可操作 缺點: ①安裝時需要自行下載軟體包 ②安裝、卸載軟體時需要考慮到依賴關係 ③軟體的自定義性比較差,不適合有特殊需求的場景 語法 ①查詢 #rpm ...
  • 更改電腦上的遠程桌面的偵聽埠 轉載:https://learn.microsoft.com/zh-CN/windows-server/remote/remote-desktop-services/clients/change-listening-port 適用範圍:Windows Server ...
  • 本文基於內核 5.4 版本源碼討論 通過上篇文章 《從內核世界透視 mmap 記憶體映射的本質(原理篇)》的介紹,我們現在已經非常清楚了 mmap 背後的映射原理以及它的使用方法,其核心就是在進程虛擬記憶體空間中分配一段虛擬記憶體出來,然後將這段虛擬記憶體與磁碟文件映射起來,整個 mmap 系統調用就結束了 ...
  • 2023_10_10_MYSQL_DAY_02_筆記 #在 FROM 子句中使用子查詢 SELECT a.ename, a.sal, a.deptno, b.salavg FROM emp a, (SELECT deptno, AVG(sal) salavg FROM emp GROUP BY de ...
  • 如今,大規模、高時效、智能化數據處理已是“剛需”,企業需要更強大的數據平臺,來應對數據查詢、數據處理、數據挖掘、數據展示以及多種計算模型並行的挑戰,湖倉一體方案應運而生。 《實時湖倉實踐五講》是袋鼠雲打造的系列直播活動,將圍繞實時湖倉的建設趨勢和通用問題,邀請奮戰於企業數字化一線的核心產品&技術專家 ...
  • PostgreSQL 教程 ​ — — — — —— 參考: 菜鳥教程 ORDBMS 術語 在我們開始學習 PostgreSQL 資料庫前,讓我們先瞭解下 ORDBMS 的一些術語: 資料庫: 資料庫是一些關聯表的集合。 數據表: 表是數據的矩陣。在一個資料庫中的表看起來像一個簡單的電子錶格。 列: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...