为什么有些组件库 Menu 要设计成 trigger + popover,而不是像 antd 那样直接 Popover 包裹, 然后通过属性传入.?

// fluentui 的 menu
export const Default = () => (
    <Menu>
        <MenuTrigger disableButtonEnhancement>
            <Button>Toggle menu</Button>
        </MenuTrigger>

        <MenuPopover>
            <MenuList>
                <MenuItem>New </MenuItem>
                <MenuItem>New Window</MenuItem>
                <MenuItem disabled>Open File</MenuItem>
                <MenuItem>Open Folder</MenuItem>
            </MenuList>
        </MenuPopover>
    </Menu>
);


// antd 的 popover + menu
import React from 'react';
import { Button, Popover } from 'antd';

const content = (
  <div>
    <p>Content</p>
    <p>Content</p>
  </div>
);

const App: React.FC = () => (
  <Popover content={content} title="Title">
    <Button type="primary">Hover me</Button>
  </Popover>
);

我想不出非得这么设计的用例, 直接用 Popover 包裹不就可以了么?

有些组件库选择使用"trigger + popover"的设计模式而不是直接使用Popover组件包裹的方式,可能有以下几个原因:

灵活性:使用"trigger + popover"模式可以提供更大的灵活性和可定制性。通过将触发器(trigger)和弹出层(popover)分离,开发人员可以自由地定义触发器的类型和样式,以及弹出层的内容和行为。这使得组件更加可配置,可以适应各种不同的使用场景和需求。

可扩展性:"trigger + popover"模式使得组件的扩展更加容易。开发人员可以在触发器和弹出层之间添加额外的组件或逻辑,以实现更复杂的功能。这样的设计模式可以支持更多的交互方式和扩展行为,而不会对组件的基本结构和API产生太大的影响。

可访问性:将触发器和弹出层分离也有助于提高组件的可访问性。通过将焦点管理和键盘导航等功能集中在触发器上,可以更好地支持键盘导航和屏幕阅读器等辅助功能。这样的设计模式可以更好地遵循可访问性指南,并提供更好的用户体验。

需要注意的是,每个组件库的设计选择和考虑因素可能不同,因此具体原因可能会有所差异。以上是一些常见的原因,为什么有些组件库选择使用"trigger + popover"的设计模式。

【以下回答由 GPT 生成】

对于为什么有些组件库的Menu组件选择trigger + popover的设计模式,而不直接像antd那样包裹在Popover中,然后通过属性传入,主要有以下原因:

  1. 灵活性和可定制性:使用trigger + popover的设计模式可以更加灵活地控制trigger和popover的样式和交互行为。通过拆分Menu组件为trigger和popover两部分,可以根据具体需求来自定义Menu组件的外观和交互,例如添加额外的样式和交互行为。这种灵活性使得开发者可以根据实际需求来定制Menu组件。

  2. 提供更多的交互方式:trigger + popover的设计模式可以提供更多的交互方式。例如,在fluentui的Menu组件中,可以通过自定义trigger组件来实现点击、悬停或其他交互方式来显示popover。这样可以满足不同场景下对交互方式的定制需求。而直接包裹在Popover中的方式可能只能提供一种固定的交互方式。

  3. 可扩展性:使用trigger + popover的设计模式可以更容易地扩展Menu组件的功能。通过分离trigger和popover两部分,可以通过扩展trigger和popover组件的功能来实现更多的功能。这样可以使Menu组件更加灵活和可扩展。

当然,这也不是说trigger + popover的设计模式就是绝对的优势,每种设计模式都有自己的特点和适用场景。选择哪种模式取决于具体的需求和开发者的偏好。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^