element-plus [Component] [drawer] 关于 Dialog/Drawer useZIndex 是否符合预期的问题

nwo49xxi  于 5个月前  发布在  其他
关注(0)|答案(3)|浏览(59)

Bug Type: Component

Environment

  • Vue Version: 3.2.0
  • Element Plus Version: 2.2.14
  • Browser / OS: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
  • Build Tool: Vue CLI

Reproduction

  • el-drawer

Docs

Steps to reproduce

以官方文档 Drawer 组件的「不添加 Title」这个 Example 为例

  1. 打开开发者工具,查看 Drawer 组件外层 .el-overlay 容器的内联 z-index 属性
  2. 反复打开关闭 Drawer

What is Expected?

按道理讲 z-index 不应该自增,因为它会带来潜在的问题。

What is actually happening?

z-index 会不断自增。

Additional comments

文档提供了 z-index prop 的说明,但并没有提到不传递 z-index prop 直接使用默认值(2000)时 z-index 值会自增的细节,我在翻阅相关的源码以后才了解到这个细节。

如果这个 useZIndex 自增的逻辑是符合预期的,至少应该在文档上告知用户。

在我们的产品里,Drawer 组件中有一个用来预览文件的 Preview 组件,起初我们观察到 Drawer 的遮罩默认 z-index 是2000,于是我们设置的 Preview 组件层级是3000,但随着 useZIndex 内部的值不断自增,如果用户长期停留在这个页面进行操作,Preview 组件被渲染在 Drawer 组件下面是迟早的事情,这给 Drawer/Dialog 组件带来了额外的使用心智负担。

dsekswqp

dsekswqp1#

补充:

实际测试发现 useZIndex 似乎是全局共享的,我们的页面上使用了很多 tooltip 之类的悬浮展示/交互的组件,鼠标在页面上晃一晃再打开 drawer 发现 z-index 自增了50多……😭

解决的方案有如下:

  1. 给 drawer 设置 z-index prop 让其层级固定
  2. 在自己的组件里从 element-plus 中导出 useZIndex 动态的设置 z-index ,让它跟着一起增💦💦💦
gcxthw6b

gcxthw6b2#

补充:

实际测试发现 useZIndex 似乎是全局共享的,我们的页面上使用了很多 tooltip 之类的悬浮展示/交互的组件,鼠标在页面上晃一晃再打开 drawer 发现 z-index 自增了50多……😭

解决的方案有如下:

  1. 给 drawer 设置 z-index prop 让其层级固定
  2. 在自己的组件里从 element-plus 中导出 useZIndex 动态的设置 z-index ,让它跟着一起增💦💦💦

我目前是这么使用的:

import { useZIndex } from 'element-plus'

export const useComponentZIndex = () => {
  const { nextZIndex } = useZIndex()
  const zIndex = ref(nextZIndex())

  function updateZIndex() {
    zIndex.value = nextZIndex()
  }

  return {
    zIndex,
    updateZIndex,
  }
}
const { zIndex, updateZIndex } = useComponentZIndex()
const dropdownStyle = computed(() => {
  return {
    zIndex: zIndex.value
  }
})

function onSelectTriggered() {
  if(!isOpen.value) {
    updateZIndex()
    isOpen.value = true
  }
}
idv4meu8

idv4meu83#

我觉得这也是一种方法。

其实只要理解了它的原理,规避本身还是很容易的,只是这个对于开发者来说心智有点高,而且在遇到它之前大概率也是不太可能想到的……

相关问题