• 记录--`ElementUI` 中的奇技淫巧


    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

    ElementUI的世界中,不仅有基础的组件和功能,还有一些让你眼前一亮、*得不能再*的高级技巧和窍门。本文将揭示这些技巧,让你在前端开发的舞台上独领风骚。无论你是一个勇敢的创新者还是一个喜欢调皮捣蛋的开发者,这些技巧都将让你的ElementUI应用更加酷炫和有趣!

    直接进入正题

    el-scrollbar滚动条

     自定义滚动条的原理

    warp:滚动的可显示区域,滚动内容就是在这个区域中滚动;

    view:实际的滚动内容,超出warp可显示区域的内容将被隐藏;

    track:滚动条的滚动滑块;

    thumb:上下滚动的轨迹。

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

    管理弹出层的z-indexPopupManager

    ElementUI的弹出层在元素定位上,都有两种实现方式,分别是:

    • append-to-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),但可以进行修改。

    1. // 修改弹出层的`z-index`从3000开始递增
    2. Vue.use(Element, {zIndex: 3000})
    1. <template>
    2.  <div class="container">
    3.    <el-button @click="onClick">增加</el-button>
    4.   z-index: {{ value }}
    5.  </div>
    6. </template>
    7. <script>
    8. import { PopupManager } from 'element-ui/src/utils/popup'
    9. export default {
    10.  data() {
    11.    return {
    12.      value: 0
    13.   }
    14. },
    15.  methods: {
    16.    onClick() {
    17.      // 使用
    18.      this.value = PopupManager.nextZIndex()
    19.   }
    20. }
    21. }
    22. </script>

    实战:一个更灵活的全屏组件

    众所周知,浏览器是有官方的全屏API的:Element.requestFullscreen(),它可以让一个元素立刻铺满视窗,并且置于所有元素之上。官方全屏是设定层级高于一切,那些append-to-body的弹窗,无论z-index多高,也绝对不会被显示出来。而那些非append-to-body模式的弹出层,确实会在某些业务场景不符合要求。

    符合ElementUI层级标准的全屏组件

    和浏览器官方API实现全屏的思路基本一致,但不同的地方在于:

    • 官方全屏会默认置顶,z-index无限大;
    • 封装的全屏组件,z-index符合PopupManager管家的规范。

    示例代码

    1. <template>
    2.    <div :class="{ 'custom-full-screen': isFullScreen }" :style="{zIndex: currentZIndex}">
    3.      <slot></slot>
    4.    </div>
    5.    </template>
    6. <script>
    7. import { PopupManager } from 'element-ui/src/utils/popup'
    8. export default {
    9.  data() {
    10.    return {
    11.      isFullScreen: false,
    12.      currentZIndex: null
    13.   }
    14. },
    15.  methods: {
    16.    request() {
    17.      this.isFullScreen = true
    18.      this.currentZIndex = PopupManager.nextZIndex()
    19.   }
    20. }
    21. }
    22. </script>
    23. <style>
    24. .custom-full-screen {
    25.  position: fixed !important;
    26.  top: 0 !important;
    27.  left: 0 !important;
    28.  right: 0 !important;
    29.  bottom: 0 !important;
    30.  width: 100% !important;
    31.  height: 100% !important;
    32. }
    33. </style>

    万能弹出组件:vue-popper

    ElementUI中的大部分弹出层都是基于vue-popper组件来实现的。比如selectdata-pickercascaderdropdownpopvertooltip等。

    如何使用vue-popper

    通常来说,它的主要用法是混入(mixins)

    可以参考ElementUI select-dropdown中对它的具体使用。

    实战:完全自定义的弹出层
    1. 引入vue-popper,在模板中引入该组件,并定义一个弹出层元素,一个定位元素。
    1. <template>
    2.  
    3.  <div class="custom-picker">
    4.    
    5.    <Popper ref="popper" v-model="showPopper">Popper>
    6.    
    7.    <div ref="fly-piece" v-show="showPopper" class="custom-picker__popper">弹出内容div>
    8.  div>
    9. template>
    10. <script>
    11. // 引入vue-popper组件
    12. import Popper from 'element-ui/src/utils/vue-popper';
    13. export default {
    14.  components: {
    15.    Popper
    16. },
    17.  data() {
    18.    return {
    19.      // 双向绑定,控制弹出层是否弹出
    20.      showPopper: false
    21.   },
    22. },
    23. }
    24. script>
    1. mounted() {
    2. this.$refs.popper.popperElm = this.$refs['fly-piece'];
    3. this.$refs.popper.referenceElm = this.$el;
    4. }
    3.通过控制vue-popperprops.value来控制是否弹出。
    this.showPopper = !this.showPopper
    

    ClickOutside

    ClickOutsideElementUI实现的一个自定义指令,顾名思义,就是点击元素外面才会触发的事件。ElementUI中的selectdropdownpopver等组件都用到该指令。

    1. <template>
    2.    <div v-clickoutside="handleClose" v-show="flag"></div>
    3. </template>
    4. <script>
    5. import Clickoutside from "element-ui/src/utils/clickoutside"
    6. export default{
    7.    data(){
    8.        return {
    9.            flag: true
    10.       }
    11.   },
    12.    directives: { Clickoutside },
    13.    methods: {
    14.        handleClose(){
    15.            this.flag = false;
    16.       }
    17.   }
    18. }    
    19. </script>

    本文转载于:

    https://juejin.cn/post/7276113864123318335

    如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

     

  • 相关阅读:
    Java最强大的技术之一:反射
    2022世界杯结果预测,简单AI模型最有效?附代码!
    查题系统API无限搜题接口搭建
    Auto.js脚本程序打包
    【c语言】字符函数和字符串函数(下)
    探寻JWT的本质:它是什么?它有什么作用?
    C/C++数据结构——虚虚实实(并查集欧拉路)
    java mapper.xml中的result type 和 result map有什么区别
    精心制作的小游戏,没有人玩,失落......
    搜维尔科技:基于人体工学和多形态手势识别的交互式人机交互系统研究与设计
  • 原文地址:https://blog.csdn.net/qq_40716795/article/details/133764558