tdesign-vue-next icon indicating copy to clipboard operation
tdesign-vue-next copied to clipboard

[Menu]在nuxt3里面鼠标悬浮或者点击子菜单不出现 元素代码里面出现一瞬间就消失了

Open ouyangtsin opened this issue 3 years ago • 5 comments
trafficstars

tdesign-vue-next 版本

0.15.4

重现链接

No response

重现步骤

[导航菜单]在nuxt3里面鼠标悬浮或者点击子菜单不出现 元素代码里面出现一瞬间就消失了 fcfc9bf8e64a137fd04aeea139f71bf

期望结果

No response

实际结果

No response

框架版本

3.2.33

浏览器版本

101.0.4951.67

系统版本

win10

Node版本

14.18.1

补充说明

tdesign-vue-next-nuxt-starter这个示例里面也不行刷新了就不行了

ouyangtsin avatar Jun 05 '22 14:06 ouyangtsin

👋 @ouyangtsin,感谢给 TDesign 提出了 issue。 请根据 issue 模版确保背景信息的完善,我们将调查并尽快回复你。

github-actions[bot] avatar Jun 05 '22 14:06 github-actions[bot]

任何人都可以处理此问题。 请务必在您的 pull request 中引用此问题。 :sparkles: 感谢你的贡献! :sparkles:

github-actions[bot] avatar Jul 12 '22 10:07 github-actions[bot]

♥️ 有劳 @LeeJim @amadeus711 尽快确认问题。 确认有效后将下一步计划和可能需要的时间回复给 @ouyangtsin 。

github-actions[bot] avatar Jul 25 '22 06:07 github-actions[bot]

@ardor-zhang 处理中

PengYYYYY avatar Aug 09 '22 06:08 PengYYYYY

问题定位

这个的具体原因我并未找到,但还是在这里做个简单的记录.

其中 li 上订阅了 onmouseenter onmouseleave,这里都是小写的。

// tdesign-vue-next/src/menu/submenu.tsx
 if (this.mode === 'popup') {
      events = {
        onmouseenter: this.handleMouseEnter,
        onmouseleave: this.handleMouseLeave,
      };
    }
    if (Object.keys(this.$slots).length > 0) {
      child = this.isHead ? this.renderHeadSubmenu() : this.renderSubmenu();
    }
    return (
      <li class={this.classes} {...events}>
        {child}
      </li>
    );

由于 jsx 的习惯,因此,我将这里的小写改成了大写,即 onMouseenter onMouseleave,问题便得到了解决

问题探究

一开始我以为是 jsx 编译的问题,于是查找了对应的编译库 "@vitejs/plugin-vue-jsx": "^1.3.3",用 vite 进行了测试,发现大小写都是可行的,所以似乎可以排除 jsx 编译的问题。

后来我只好在 nuxt 编译后的结果中看,其中使用 vuecreateVNode 进行最终的渲染,所以现在想来可能这里有些原因吧,但还未找到问题的所在,还需要再探索一下

  render: function render() {
   
    var events = {};

    if (this.mode === "popup") {
      events = {
        onmouseenter: this.handleMouseEnter,
        onmouseleave: this.handleMouseLeave
      };
    }
    
    return __vite_ssr_import_2__.createVNode("li", __vite_ssr_import_2__.mergeProps({
      "class": this.classes
    }, events), [child]);
  }

如何解决以及后续

解决办法就是将小写改成大写。 后续呢,如果能找到原因最好,要是找不到的话,就先挂着吧,看看是否会出现更底层的问题。

zhangpaopao0609 avatar Aug 11 '22 08:08 zhangpaopao0609

按照上述解决方案进行修改,需要对非 nuxt 场景下做测试。

如下,可以看到,修改为 onMouseenter onMouseleave 后 DOM 元素 li 正常的订阅了对应的事件,同时也触发了相应的弹窗,因此判定可行

企业微信截图_63d273a9-d3f0-45ea-925c-c4eb97c74660

zhangpaopao0609 avatar Aug 12 '22 05:08 zhangpaopao0609

0.20.0版本已修复

PengYYYYY avatar Aug 15 '22 08:08 PengYYYYY