动态面包屑导航实现说明
功能介绍
本项目实现了动态修改页面面包屑名称的功能,特别适用于新增和修改页面共用一个组件的场景。通过 dva 状态管理,可以在具体页面中动态设置面包屑导航的最后一级显示文本。
实现原理
- 通过
breadcrumb
模型管理面包屑状态 - 使用
connect
将breadcrumb
状态连接到布局组件 - 在页面组件中根据不同条件(如是否有 id 参数)来动态设置面包屑名称
代码结构
src/models/breadcrumb.ts
- 面包屑状态模型src/layouts/BasicLayout.tsx
- 支持动态面包屑的布局组件
使用示例
实际项目中的使用方式 (supplierAnnualTemplateManageAdd.tsx)
import React, { useEffect } from 'react';
import { useIntl, connect } from 'umi';
import type { Dispatch } from 'umi';
import type { BreadcrumbState } from '@/models/breadcrumb';
// 组件 props 接口定义
interface PageProps extends ConnectProps {
breadcrumb: BreadcrumbState; // dva model状态
dispatch: Dispatch; // dva dispatch方法
}
const YourPage: React.FC<PageProps> = ({ dispatch }) => {
const intl = useIntl();
const location = useLocation();
// 设置面包屑名称
useEffect(() => {
if (location.state?.editData?.id && dispatch) {
// 编辑模式,设置编辑相关的面包屑
dispatch({
type: 'breadcrumb/updateBreadcrumbName',
payload: intl.formatMessage({ id: "yourNamespace.add.edit" }),
});
} else {
// 新增模式,设置新增相关的面包屑
dispatch({
type: 'breadcrumb/updateBreadcrumbName',
payload: intl.formatMessage({ id: "yourNamespace.add.title" }),
});
}
// 组件卸载时重置面包屑
return () => {
dispatch({
type: 'breadcrumb/resetBreadcrumb',
});
};
}, [dispatch, intl, location]);
// 页面其他内容...
return (
<div>
{/* 页面内容... */}
</div>
);
};
// 将dva model中的状态映射到组件props
export default connect(({ breadcrumb }: { breadcrumb: BreadcrumbState }) => ({
breadcrumb,
}))(YourPage);
关键实现点
- 在页面组件中通过 connect 连接到 dva 状态:
// 将dva model中的状态映射到组件props
export default connect(({ breadcrumb }: { breadcrumb: BreadcrumbState }) => ({
breadcrumb,
}))(YourPage);
- 在 useEffect 中动态设置面包屑名称:
useEffect(() => {
// 根据条件设置不同的面包屑名称
if (location.state?.editData?.id) {
dispatch({
type: 'breadcrumb/updateBreadcrumbName',
payload: intl.formatMessage({ id: "yourNamespace.add.edit" }),
});
} else {
dispatch({
type: 'breadcrumb/updateBreadcrumbName',
payload: intl.formatMessage({ id: "yourNamespace.add.title" }),
});
}
// 组件卸载时重置面包屑
return () => {
dispatch({
type: 'breadcrumb/resetBreadcrumb',
});
};
}, [dispatch, intl, location]);
注意事项
-
payload 必须是字符串:传递给
updateBreadcrumbName
action 的 payload 必须是字符串类型,不能是对象或 React 组件- 正确:
payload: intl.formatMessage({ id: "menu.edit" })
- 错误:
payload: { breadcrumbName: <FormattedMessage id="menu.edit" /> }
- 正确:
-
重置面包屑:确保在组件卸载时调用
resetBreadcrumb
以重置面包屑状态 -
国际化处理:使用
intl.formatMessage()
方法处理国际化文本,不要在 payload 中直接使用 FormattedMessage 组件 -
依赖项管理:确保 useEffect 的依赖项包含
dispatch
,intl
和用于条件判断的变量(如location
)
Languages
TypeScript
93.2%
HTML
2.9%
Less
2.3%
EJS
0.6%
CSS
0.6%
Other
0.4%