1. 表单联动监听:Form.useWatch
场景:动态表单字段联动时,避免手动监听onValuesChange事件。
代码:
const [form] = Form.useForm();
const username = Form.useWatch('username', form);
<Form form={form}>
<Form.Item name="username">
<Input />
</Form.Item>
{/* 根据username动态显示内容 */}
{username && <div>Hello {username}!</div>}
</Form>
效果:直接通过Form.useWatch获取字段值,无需手动订阅表单变化。
2. 表格性能优化:虚拟滚动
场景:渲染超长列表(如1000+行数据)时避免页面卡顿。
代码:使用react-virtualized或rc-table内置方案(antd 5.x+):
<Table
dataSource={data}
columns={columns}
scroll={{ y: 400 }} // 固定高度触发虚拟滚动
virtual
rowKey="id"
/>
效果:仅渲染可视区域内的行,大幅提升性能。
3. 动态主题切换
场景:实现用户自定义主题色(antd 5.x+)。
代码:通过ConfigProvider动态修改CSS变量:
import { ConfigProvider } from 'antd';
// 动态修改主题色
const changeTheme = (color) => {
ConfigProvider.config({
theme: { primaryColor: color },
});
};
// 使用
<ConfigProvider>
<App />
</ConfigProvider>
效果:无需重新编译,实时切换主题色。
4. Modal方法式调用
场景:避免手动维护visible状态。
代码:直接通过静态方法调用Modal:
const showModal = () => {
Modal.confirm({
title: '确认操作',
content: '确定要删除此项吗?',
onOk: () => handleDelete(),
});
};
优点:精简状态管理代码,逻辑更集中。
5. 上传组件自定义验证
场景:限制文件类型/大小。
代码:通过beforeUpload拦截非合规文件:
<Upload
beforeUpload={(file) => {
const isImage = file.type.startsWith('image/');
if (!isImage) {
message.error('仅支持图片文件!');
return Upload.LIST_IGNORE;
}
return true;
}}
>
<Button>上传图片</Button>
</Upload>
效果:前端拦截无效文件提交。
6. 全局配置国际化
场景:多语言项目快速切换。
代码:通过ConfigProvider统一配置:
import { ConfigProvider } from 'antd';
import zhCN from 'antd/locale/zh_CN';
import enUS from 'antd/locale/en_US';
<ConfigProvider locale={currentLang === 'zh' ? zhCN : enUS}>
<App />
</ConfigProvider>
扩展:配合moment.js或dayjs实现日期国际化。
7. 封装自定义Hooks
场景:复用Table分页逻辑。
代码:
const usePagination = (initialPage = 1, pageSize = 10) => {
const [pagination, setPagination] = useState({ current: initialPage, pageSize });
const handleTableChange = (pag) => {
setPagination(pag);
fetchData(pag.current, pag.pageSize);
};
return { pagination, handleTableChange };
};
// 使用
const { pagination, handleTableChange } = usePagination();
<Table onChange={handleTableChange} pagination={pagination} />;
8. Tooltip防抖处理
场景:高频触发的提示组件优化性能。
代码:结合lodash/debounce:
import { debounce } from 'lodash';
const DebouncedTooltip = ({ title, children }) => {
const [visible, setVisible] = useState(false);
const handleMouseEnter = debounce(() => setVisible(true), 300);
const handleMouseLeave = debounce(() => setVisible(false), 300);
return (
<Tooltip title={title} open={visible}>
<div onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>
{children}
</div>
</Tooltip>
);
};
总结建议
- 升级antd 5.x:充分利用CSS变量、组件性能优化等新特性。
- 善用ProComponents:复杂场景(如ProTable、ProForm)可节省80%代码量。
- 按需加载:通过babel-plugin-import减少打包体积。
掌握这些小技巧,可显著提升antd开发效率与代码可维护性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。