Skip to content

[Menu] popup 模式移除不存在的 expanded 值会误删最后一项 #6856

Closed

Description

@zhangpaopao0609

tdesign-vue-next 版本

当前 develop(复现基线:9e47c828a)

重现步骤

Menu 和 HeadMenu 在 expandType="popup" 下都会通过内部 open(value, type) 维护展开项。

当执行 remove、但目标 value 不在当前 expanded 数组中时,例如受控 expanded 未同步 popup 的 add 更新、随后 popup 关闭:

const expanded = ['one', 'two'];
const value = 'missing';
const index = expanded.indexOf(value); // -1
expanded.splice(index, 1);             // 误删 'two'

本次测试覆盖率重写通过注入的 TdMenu 上下文稳定复现了该行为,Menu 与 HeadMenu 的实现均受影响。

期望结果

remove 一个不存在的 value 时保持 expanded 不变,不触发错误的展开项更新。

实际结果

splice(-1, 1) 会删除 expanded 的最后一项。

原因定位

  • packages/components/menu/menu.tsx
  • packages/components/menu/head-menu.tsx

两个文件的 popup remove 分支都没有在 splice(index, 1) 前判断 index !== -1。

补充说明

问题是在 #5631 的 Menu 测试覆盖率重写中发现的。测试按当前真实行为断言,后续修复源码时该用例会提示同步更新。

Activity

  1. github-actions commented on Aug 1, 2026

    @github-actions
    Contributor

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

  2. zhangpaopao0609 commented on Aug 1, 2026

    @zhangpaopao0609
    CollaboratorAuthor

    现状回归用例已加入测试覆盖率 PR #6858(Menu 与 HeadMenu 均覆盖);该 PR 仅写测试,不修改源码。

  3. kyui-azusa commented on Aug 3, 2026

    @kyui-azusa
    Contributor

    I'd like to work on this issue. I'll guard popup remove operations in Menu and HeadMenu so a missing expanded value cannot become splice(-1, 1), with regression coverage for both components.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions