10 个 Antdv 奇葩历史遗留设计🤣

57 阅读3分钟

🚨 Antdv 奇葩历史遗留设计大全🤣(带示例)

image.png


1. tree-node-filter-prop 必须手动传 label(你已经发现)

奇葩点

本来 TreeSelect 搜索应该默认用 label 或 title。

但 ant-design-vue 不敢改默认值,所以每次都要你写:

tree-node-filter-prop="label"

示例(否则搜索失效)

<a-tree-select :treeData="treeData" show-search></a-tree-select>

treeData 是:

[{ label: '部门A', value: 1 }]

👉 搜索完全没反应

👉 你必须手动指定:

tree-node-filter-prop="label"

2. 设置 tree-checkable 会自动 multiple = true(你也发现了)

奇葩点

只想“打勾确定选择”,却强制变成多选。

示例:

<a-tree-select tree-checkable ></a-tree-select>

实际内部被当成:

multiple = true

想做“单选勾选”?

官方不支持,只能你自己封装


3. a-select 在 labelInValue 模式下,value 结构变得巨奇怪

奇葩点

开启这个属性后,value 变成一个对象:

{ value: '1', label: '北京' }

但你不给 label,又会报错 UI 不显示,还会触发各种不兼容逻辑。

更离谱:

multiple 模式下是数组,单选是对象,还会和你的表单绑定类型打架。****

示例:

<a-select label-in-value v-model:value="value" />

value 变成:

{ value: 'beijing', label: '北京' }

但如果你后来关掉 labelInValue,就变成:

'value'

真是“变身困难症”。


4. a-select 的 dropdown 宽度默认等于触发器,这个行为无法关闭

也就是说:

<a-select dropdownMatchSelectWidth="false" />

在早期版本里无效,根本不生效。

后期虽然修了,但仍然有奇怪表现:

  • 宽度太窄会被折断

  • 有时 dropdown 宽度跟随内容,有时不跟随

这部分是著名的 “Select 下拉宽度怪象” 问题。


5. Table 组件 column.key 和 dataIndex 至今仍让人分不清作用

奇葩点

早期 antd 把 key 和 dataIndex 都支持,导致两个字段现在同时存在并且意义不一致。

官方解释:

  • dataIndex → 从数据中取值

  • key → 虚拟 DOM key

开发者实际使用:

  • 想隐藏某列,用 key 不行,还要 dataIndex

  • 想自定义渲染,又要用 key

  • 有时候 key 不写会报 warning

  • 有时候两个字段必须一样,否则排序、过滤失效

典型混乱历史遗留。


6. Form.Item 内部有自动挤压(colon、label 宽度)机制,修改不了

示例:

<a-form-item label="姓名">

colon 冒号跟随 antd 的奇怪规范:

  • 冒号自动加

  • 布局会 top-align

  • 修改 form 的 labelCol、wrapperCol 又影响整个页面

改动这个 layout 是非常痛苦的。


7. Modal 默认 destroyOnClose = false(导致表单内容残留)

奇葩点:

关闭弹框后再打开,上一轮输入内容还在。

示例:

<a-modal v-model:visible="show">
  <input />
</a-modal>

你输入:

123

关闭 → 再打开 → 内容还在。

要手动:

destroyOnClose

但 destroyOnClose 会让整个 Modal 每次销毁重建,性能又下降。


8. Tooltip 默认 getPopupContainer 设置极其不统一

有些组件 tooltip 会 append 到 body

有些又放在当前容器

有些受 overflow 影响、有些不受

导致 CSS 层级混乱:

  • tooltip 被 overflow hidden 裁掉

  • 手动传 getPopupContainer 后样式又崩

这是 Tooltip 和 Popover 的大坑之一。


9. Upload 组件文件列表强制受控(fileList 必须完全受控)

示例:

<a-upload :file-list="list" />

你不手动更新 fileList,就不会显示。

也就是说:

  • 它不会自动更新列表

  • 你必须自己维护完整 fileList 数组

  • 自己维护上传进度

  • 自己维护 remove 逻辑

这在所有组件库里都是很反人类的历史遗留。


10. a-table 的 scroll.y 设置后出现“空白高度 bug”

示例:

<a-table :scroll="{ y: 500 }" />

只要表头行数不固定、有筛选、有分组表头,很容易出现:

  • 内容被截断

  • 滚动条不出现

  • 表头和表体对不齐(经典问题)

  • 固定列错位

这是 antd/antdv 的“祖传 Table 问题”。


11. TreeSelect 在 showSearch 下,搜索结果列表不保持层级结构

示例:

<a-tree-select show-search />

搜索后结果变成:

北京
上海
深圳

但树形结构丢失了!****

这也是早期 React antd 的设计,Vue 版只能继承这个“不合逻辑”的行为。


ant-design-vue 的历史遗留设计远不止这些 😂