From 33d72d53a0798778d7840bb386d92cc369f92e1a Mon Sep 17 00:00:00 2001 From: maxin <48519459+nnmax@users.noreply.github.com> Date: Mon, 20 Dec 2021 11:24:11 +0800 Subject: [PATCH] feat(dropdown): set active status on Button or IconButton when visible (#1697) * feat(dropdown): set active status on Button or IconButton when visible * docs(dropdown): add story of dropdown Co-authored-by: maxin --- src/button/Button.tsx | 4 +- src/button/IconButton.tsx | 4 +- src/dropdown/Dropdown.tsx | 24 +++-- src/dropdown/demos/Dropdown.stories.tsx | 111 +++++++++++++++++------- src/dropdown/demos/DropdownPage.tsx | 21 ++++- src/dropdown/interface.ts | 4 +- src/list/inner/baseItem.tsx | 14 +-- 7 files changed, 137 insertions(+), 45 deletions(-) diff --git a/src/button/Button.tsx b/src/button/Button.tsx index af2dd41614..28d3454814 100644 --- a/src/button/Button.tsx +++ b/src/button/Button.tsx @@ -56,7 +56,9 @@ const Button = WithRef((props, ref) => { ); }); -Button.displayName = 'Button'; +export const BUTTON_DISPLAY_NAME = 'Button'; + +Button.displayName = BUTTON_DISPLAY_NAME; Button.defaultProps = { type: 'primary', diff --git a/src/button/IconButton.tsx b/src/button/IconButton.tsx index 7dbf908af7..b40b2ea082 100644 --- a/src/button/IconButton.tsx +++ b/src/button/IconButton.tsx @@ -13,7 +13,9 @@ const IconButton = React.forwardRef((props, return + + +); + +export const Disabled = () => ( + <> +

不可用的菜单项,和分割线。

+

如果不想 Dropdown 自动隐藏,可以在 ListItem 上添加 onClick 监听器,阻止事件冒泡。

+ - } /> - } /> + Apple + Orange + + + Banana + - - - ), - children: ( - - ), -}; + } + > + + + +); diff --git a/src/dropdown/demos/DropdownPage.tsx b/src/dropdown/demos/DropdownPage.tsx index 69d0dc210a..3e1d9b2945 100644 --- a/src/dropdown/demos/DropdownPage.tsx +++ b/src/dropdown/demos/DropdownPage.tsx @@ -13,7 +13,22 @@ export default function DropdownPage() {
  • 样式变化:新版dropdown等下拉菜单拥有更圆润的边框。
  • APi变动:包装的Popover,弹出内容更名为content,children包装触发器。
  • -
  • Dropdown 封装自popover
  • +
  • Dropdown 封装自 popover
  • +
  • + Dropdown 在非受控模式下,会在 content 外包一层 div,并且监听该 div 的 onClick 事件,以实现自动隐藏和显示。 +
  • +
  • + 如果需要阻止 Dropdown 自动隐藏,可以使用 List.Item 或者 CascaderItem 的 onClick 回调函数,调用 + event.stopPropagation() 来实现 +
  • +
  • + 在 Table 中使用 Dropdown,如果 该 Table 有 rowClick 监听事件,则可以使用 Dropdown 的 onContentClick 回调函数的 + event.stopPropagation() 停止事件传递 +
  • +
  • + 如果触发元素为 Button 或者 IconButton,Dropdown 在展开的时候会添加一个 active 参数,如果不需要,可以在 Button + 或者 IconButton 中设置 active={`{false}`} 来强制覆盖。 +
{formatMessage({ defaultMessage: '代码演示' })} {formatMessage({ defaultMessage: '样例' })} @@ -24,6 +39,10 @@ export default function DropdownPage() { + {formatMessage({ defaultMessage: '不可用的菜单项,和分割线' })} + + + {formatMessage({ defaultMessage: '参数说明' })} diff --git a/src/dropdown/interface.ts b/src/dropdown/interface.ts index 14efc26b38..23a496dd77 100644 --- a/src/dropdown/interface.ts +++ b/src/dropdown/interface.ts @@ -1,5 +1,7 @@ import { PopoverProps } from '../popover'; -type DropdownProps = PopoverProps; +interface DropdownProps extends Omit { + children: React.ReactElement; +} export default DropdownProps; diff --git a/src/list/inner/baseItem.tsx b/src/list/inner/baseItem.tsx index b693e5b961..7f5c0c5001 100644 --- a/src/list/inner/baseItem.tsx +++ b/src/list/inner/baseItem.tsx @@ -64,13 +64,15 @@ const InnerBaseItem = WithRef) => { - if (!mergedDisabled) { - /** cascader click 从上级来 */ - if (model !== 'cascader') { - contextOnClick?.(value, event); - } - onClick?.(value, event); + if (mergedDisabled) { + event.stopPropagation(); + return; } + /** cascader click 从上级来 */ + if (model !== 'cascader') { + contextOnClick?.(value, event); + } + onClick?.(value, event); }; const content = children ?? label;