ant-design icon indicating copy to clipboard operation
ant-design copied to clipboard

建议统一组件相关 API 设计,提升 Ant Design 的一致性

Open kwooshung opened this issue 1 year ago • 19 comments

问题描述

在使用 Ant Design 的过程中,发现多个组件的方向控制API及属性命名存在不一致性,这可能导致开发者学习和使用成本增加和代码维护复杂度上升。

就像官方把一些组件的打开和关闭都统一使用 openclose,很好,但对于其他的属性优化不够彻底。

理想状态是,只要学会了一个相对属性较多的组件,其他的组件基本属性也掌握个差不多了。


以下是具体问题分析:

一、方向控制属性命名与类型不统一

1. 基础方向控制属性对比

组件名称 当前属性名 当前取值 问题分析
Divider type horizontal | vertical type 语义和表现不一致,未明确表示方向控制
Flex vertical boolean 与其他组件的方向控制属性名不一致
Space direction vertical | horizontal 与其他组件的方向控制方式不一致
Splitter layout horizontal | vertical layout 语义不聚焦于方向控制,
到这里,四个组件,同样含义,四种属性
Steps direction vertical | horizontal 除了属性问题,API文档的说明:
取值顺序与部分组件(如Divider)不一致
Slider vertical boolean 与其他组件的方向控制方式不一致
Segmented vertical boolean 与其他组件的方向控制方式不一致

个人更喜欢,boolean控制,但不十分喜欢 verticalhorizontal 作为属性名,话虽如此,可我也没有好的建议。

2. 复合属性的职责混淆

组件名称 当前属性名 当前取值 问题分析
Menu mode vertical | horizontal | inline 混合方向(vertical/horizontal
与布局模式(inline 可能独立出来更好)
Form layout vertical | horizontal | inline 同样存在方向与布局模式的职责混淆
Tabs tabPosition top | right | bottom | left 个人认为,首先确认垂直再确认左右,
可能也是拆分比较好,但可能显得有点麻烦,不好确定。

二、属性命名的冗余与不一致

1. Tabs组件的前缀冗余问题

  • tab里面有很多属性都是tabxxxx,我觉得是否有点多余?
  • 我知道加上tab的意义是,知道这是控制tab导航的,如果是这样的话,hideAdd是不是也得是 tabHideAddindicator 也得是 tabIndicator
  • 所以我觉得名称上 tab 显得多余,不知道其他的组件还有没有类似的情况,还没有细看。

2. 通用命名冲突

部分组件使用typemodedirectionlayout 职责不一致,有的时候:type是方向,有的时候type是类型,有的时候type是模式。


三、其他组件可能还有其他潜在的问题

  1. 部分组件对垂直/水平方向的控制逻辑不同(如Flexvertical为布尔值,而Stepsdirection为字符串枚举)。
  2. 布局相关属性在不同组件中的命名和行为存在差异。

四、总结

当前 Ant Design 的组件API在方向控制、属性命名和语义一致性方面存在较多碎片化问题,建议官方对全量组件的相关属性进行系统性梳理,建立统一的设计规范,以提升框架的易用性和可维护性。


其他组件属性

在后续日常开发中,我会留意这些属性,逐渐补充下方列表。

  1. 分割线/Divider

kwooshung avatar Mar 19 '25 00:03 kwooshung

感谢您提出关于 Ant Design 组件方向控制 API 设计不一致的问题。您详细分析了多个组件在方向控制属性命名和类型上的不一致性,以及复合属性的职责混淆问题。这些确实可能导致开发者在使用过程中遇到困难,增加学习成本和代码维护的复杂度。

我们会将您的建议记录下来,并在未来的版本中考虑对这些组件的 API 进行统一和优化,以提升框架的一致性和易用性。这需要对现有组件进行全面的审查和设计调整,以确保在不破坏现有功能的情况下实现更一致的 API 设计。

如果您有更多的建议或需要进一步的帮助,请随时在评论中描述您的问题,并 @petercat-assistant 以便与我进行对话交流。

🪧 Tips For further assistance, please describe your question in the comments and @petercat-assistant to start a conversation with me.

petercat-assistant[bot] avatar Mar 19 '25 00:03 petercat-assistant[bot]

提议很好,下次不准再提了😂😂😂😂

smithyj avatar Mar 19 '25 01:03 smithyj

很好的建议,我们在 V6 统一看看。

afc163 avatar Mar 19 '25 02:03 afc163

@kwooshung 要不要直接参与 V6 的研发?把你的建议拆解成具体的 RFC 和 PR 如何。

afc163 avatar Mar 19 '25 02:03 afc163

@kwooshung 要不要直接参与 V6 的研发?把你的建议拆解成具体的 RFC 和 PR 如何。

@afc163 如果v6今年发布的话,我的时间比较紧迫,可能没有更多的精力分配。

kwooshung avatar Mar 19 '25 02:03 kwooshung

👍 很好的建议,其他想法也可以多提提。我之前用的时候也会有这些别扭的感觉,好的 API 的语义设计是需要长期的打磨和斟酌才能收敛到比较理想的水平。

arvinxx avatar Mar 19 '25 03:03 arvinxx

相当棒的建议,一部分 API 做了收口 (比如:open, popup 等等)。方向上的确有缺失。我加个标。

zombieJ avatar Mar 19 '25 08:03 zombieJ

Divider 表示分割线标题的位置的属性 orientation 可能不当,因为很多组件 (下面列举一些其他的组件的相关属性) 都是 positionxxxPosition 来控制某些元素的位置,到了Divider 却是 orientation,不够统一。

组件名称 属性名称
Button iconPosition
Carousel dotPosition
Collapse expandIconPosition
Timeline.Items position

kwooshung avatar Mar 19 '25 10:03 kwooshung

赞同,每次用 antd 的时候,一些布局相关组件的 prop 没统一,就总是记混,老是得转到类型声明文件里再看一次(另外感觉 antd 的类型注释写的确实不错)

coderzhizi avatar Mar 19 '25 13:03 coderzhizi

<Space direction="vertical" />
<Space vertical />

看起来 direction 会好一些

  1. 扩展性会好一些,如果是一个 bool 不方便扩展,比如 Steps 可能会出现 diagonal
  2. 语义化也更好一些

coding-ice avatar Mar 26 '25 09:03 coding-ice

看起来 `direction` 会好一些
  1. 扩展性会好一些,如果是一个 bool 不方便扩展,比如 Steps 可能会出现 diagonal
  2. 语义化也更好一些

确实,可能还是 direction 属性更好些。

kwooshung avatar Apr 07 '25 15:04 kwooshung

我补充一个:

<Tooltip title="xxx" />
<Alert message="xxx" />
<Alert.ErrorBoundary message="xxx" />

希望可以把 Alert/Alert.ErrorBoundary 的 message 改成 title。毕竟 Tooltip/Popconfirm/Popover 统一都有 title,所以我经常以为 Alert 的主体内容也是 title

liuyib avatar Apr 08 '25 08:04 liuyib

@liuyib 十分认可,message和其他的组件造成了混乱,每次都是看了文档,才知道具体作用,增加了学习和记忆成本。

kwooshung avatar Apr 10 '25 07:04 kwooshung

@liuyib 十分认可,message和其他的组件造成了混乱,每次都是看了文档,才知道具体作用,增加了学习和记忆成本。

很好的建议,v6 已经这么做了~ 做了兼容警告,可以使用 title 来替换。 https://github.com/ant-design/ant-design/pull/52669/files#diff-e7b678382f0c632748d793d3cdbd2207a645522f3a84911e91598381adb6b8d5L115

Image

thinkasany avatar Apr 10 '25 07:04 thinkasany

@liuyib 十分认可,message和其他的组件造成了混乱,每次都是看了文档,才知道具体作用,增加了学习和记忆成本。

很好的建议,v6 已经这么做了~ 做了兼容警告,可以使用 title 来替换。 https://github.com/ant-design/ant-design/pull/52669/files#diff-e7b678382f0c632748d793d3cdbd2207a645522f3a84911e91598381adb6b8d5L115

Image

message => title 后, description 是不是也需要改成 content ? (感觉 next 分支改动太多,也会让已经习惯 api 的开发者困扰

Image

Wxh16144 avatar Apr 27 '25 09:04 Wxh16144

description => content 合理,但是这一块属于是历史债务,涉及到的不仅仅是一个 content api,还有相关的 design token,以及 dom 上的 className,会要兼容很多代码,并且带来一定的破坏性,不确定收益和牺牲是否值得,如果来得及的话,可能会考虑做。 如果改 alert 组件,那么对应的 notification 的 description 也需要做。 Image

thinkasany avatar Apr 27 '25 14:04 thinkasany

content 和 description 语义是不一样的。

afc163 avatar Apr 27 '25 14:04 afc163

content 和 description 语义是不一样的。

Alert 组件的 description 在使用上和 Modal、Tooltip / Popover / Popconfirm 这些的 content 太接近了,就连 message 也是用 content。 Image

Image Image

thinkasany avatar Apr 27 '25 15:04 thinkasany

没坐,还有size也有同样的问题,一会是"small" | "large" | "default",一会是"small" | "middle" | "large",一会是'default' | 'small',二开的时候经常要写这种很多余的判断

Image

pawover avatar May 14 '25 01:05 pawover

提了一个类似的,早知道写在这了:为 Cascader/Select/TreeSelect 提供更多一致的API

Airkro avatar Jun 20 '25 01:06 Airkro

很好的建议,我们在 V6 统一看看。

@afc163 话说想参与v6的开发的话,需要什么要求呢QWQ

Arktomson avatar Aug 24 '25 15:08 Arktomson

@Arktomson 可以先从提 RFC 开始,找到你想做的事情,写一个 RFC 让社区同学讨论,确定可以实施了再提 PR。

afc163 avatar Aug 25 '25 02:08 afc163