🚨 Antdv 奇葩历史遗留设计大全🤣(带示例)
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 的历史遗留设计远不止这些 😂