Unverified Commit ca5efe69 authored by Sendya's avatar Sendya

fix: support breadcrumb props

parent ba92fdff
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { PageContainer } from '../../src'; import { PageContainer, Route } from '../../src';
export default defineComponent({ export default defineComponent({
setup() { setup() {
const route = useRoute(); const route = useRoute();
return () => ( return () => (
<PageContainer> <PageContainer
breadcrumb={{
routes: [{ path: '/', breadcrumbName: 'home' }] as Route[],
}}
>
<h1>Form: {route.meta.title}</h1> <h1>Form: {route.meta.title}</h1>
<pre>{JSON.stringify(route.meta, null, 4)}</pre> <pre>{JSON.stringify(route.meta, null, 4)}</pre>
</PageContainer> </PageContainer>
......
import 'ant-design-vue/dist/antd.less'; import 'ant-design-vue/dist/antd.less';
import { createApp, defineComponent, watch, ref, watchEffect, onMounted } from 'vue'; import { createApp, defineComponent, watch, ref, watchEffect, onMounted, computed } from 'vue';
import { createRouter, createWebHashHistory, useRoute, useRouter, RouterLink } from 'vue-router'; import { createRouter, createWebHashHistory, useRoute, useRouter, RouterLink } from 'vue-router';
import { Avatar, Button, Space, Select, Switch } from 'ant-design-vue'; import { Avatar, Button, Space, Select, Switch } from 'ant-design-vue';
import { UserOutlined } from '@ant-design/icons-vue'; import { UserOutlined } from '@ant-design/icons-vue';
import { default as ProLayout, FooterToolbar, WaterMark, getMenuData } from '../src/'; import { default as ProLayout, FooterToolbar, WaterMark, getMenuData, Route } from '../src/';
import { globalState as state } from './state'; import { globalState as state } from './state';
import './demo.less'; import './demo.less';
...@@ -34,7 +34,12 @@ const BasicLayout = defineComponent({ ...@@ -34,7 +34,12 @@ const BasicLayout = defineComponent({
const { getRoutes } = useRouter(); const { getRoutes } = useRouter();
const route = useRoute(); const route = useRoute();
const { menuData, breadcrumb } = getMenuData(getRoutes()); const { menuData } = getMenuData(getRoutes());
const breadcrumb = computed(() =>
route.matched.concat().map(item => {
return { path: item.path, breadcrumbName: item.meta.title } as Route;
}),
);
const updateSelectedMenu = () => { const updateSelectedMenu = () => {
const matched = route.matched.concat().map(item => item.path); const matched = route.matched.concat().map(item => item.path);
...@@ -77,7 +82,6 @@ const BasicLayout = defineComponent({ ...@@ -77,7 +82,6 @@ const BasicLayout = defineComponent({
siderWidth={state.sideWidth} siderWidth={state.sideWidth}
splitMenus={state.splitMenus} splitMenus={state.splitMenus}
menuData={menuData} menuData={menuData}
breadcrumbData={breadcrumb}
collapsed={state.collapsed} collapsed={state.collapsed}
openKeys={state.openKeys} openKeys={state.openKeys}
selectedKeys={state.selectedKeys} selectedKeys={state.selectedKeys}
...@@ -106,16 +110,14 @@ const BasicLayout = defineComponent({ ...@@ -106,16 +110,14 @@ const BasicLayout = defineComponent({
)} )}
breadcrumbRender={({ route: r, routes, paths }) => breadcrumbRender={({ route: r, routes, paths }) =>
routes.indexOf(r) === routes.length - 1 ? ( routes.indexOf(r) === routes.length - 1 ? (
<span>{r.breadcrumbName}</span> <span>{i18n(r.breadcrumbName)}</span>
) : ( ) : (
<RouterLink to={{ path: `/${paths.join('/')}` }}>{r.breadcrumbName}</RouterLink> <RouterLink to={{ path: `/${paths.join('/')}` }}>{i18n(r.breadcrumbName)}</RouterLink>
) )
} }
// {...{ breadcrumb={{
// 'onUpdate:collapsed': noop, routes: breadcrumb.value,
// 'onUpdate:openKeys': noop, }}
// 'onUpdate:selectedKeys': noop,
// }}
> >
<WaterMark content="Ant Design Pro of Vue"> <WaterMark content="Ant Design Pro of Vue">
<router-view /> <router-view />
...@@ -277,7 +279,7 @@ const router = createRouter({ ...@@ -277,7 +279,7 @@ const router = createRouter({
{ {
path: '/', path: '/',
name: 'index', name: 'index',
meta: { title: '' }, meta: { title: 'home' },
redirect: '/welcome', redirect: '/welcome',
component: BasicLayout, component: BasicLayout,
children: routes, children: routes,
......
{ {
"name": "@ant-design-vue/pro-layout", "name": "@ant-design-vue/pro-layout",
"version": "3.0.0-beta.4", "version": "3.0.0-beta.5",
"main": "./lib/index.js", "main": "./lib/index.js",
"module": "./es/index.js", "module": "./es/index.js",
"repository": { "repository": {
......
...@@ -34,7 +34,7 @@ export type BasicLayoutProps = SiderMenuWrapperProps & ...@@ -34,7 +34,7 @@ export type BasicLayoutProps = SiderMenuWrapperProps &
breadcrumbRender?: WithFalse<BreadcrumbProps['itemRender']>; breadcrumbRender?: WithFalse<BreadcrumbProps['itemRender']>;
breadcrumbData?: BreadcrumbProps['routes']; breadcrumb?: BreadcrumbProps;
colSize?: string; colSize?: string;
/** /**
...@@ -119,9 +119,7 @@ const ProLayout = defineComponent({ ...@@ -119,9 +119,7 @@ const ProLayout = defineComponent({
const menuHeaderRender = getCustomRender(props, slots, 'menuHeaderRender'); const menuHeaderRender = getCustomRender(props, slots, 'menuHeaderRender');
const footerRender = getCustomRender(props, slots, 'footerRender'); const footerRender = getCustomRender(props, slots, 'footerRender');
// const menuRender = getCustomRender(props, slots, 'menuRender'); // const menuRender = getCustomRender(props, slots, 'menuRender');
const breadcrumbRender = getCustomRender(props, slots, 'breadcrumbRender'); const breadcrumbRender = getCustomRender(props, slots, 'breadcrumbRender');
console.log('breadcrumbRender', breadcrumbRender);
const headerDom = computed(() => const headerDom = computed(() =>
headerRender( headerRender(
...@@ -148,10 +146,12 @@ const ProLayout = defineComponent({ ...@@ -148,10 +146,12 @@ const ProLayout = defineComponent({
const routeContext: RouteContextProps = reactive({ const routeContext: RouteContextProps = reactive({
getPrefixCls, getPrefixCls,
i18n: props.locale || ((t: string) => t), i18n: props.locale || ((t: string) => t),
breadcrumb: { breadcrumb: computed(() => {
routes: propRefs.breadcrumbData, return {
itemRender: breadcrumbRender, ...props.breadcrumb,
}, itemRender: breadcrumbRender,
};
}),
contentWidth: 'Fluid', contentWidth: 'Fluid',
layout: propRefs.layout, layout: propRefs.layout,
navTheme: propRefs.navTheme, navTheme: propRefs.navTheme,
...@@ -241,8 +241,10 @@ ProLayout.props = { ...@@ -241,8 +241,10 @@ ProLayout.props = {
menuItemRender: PropRenderType, menuItemRender: PropRenderType,
/* 自定义拥有子菜单菜单项的 render 方法 */ /* 自定义拥有子菜单菜单项的 render 方法 */
subMenuItemRender: PropRenderType, subMenuItemRender: PropRenderType,
/* 自定义面包屑的数据 */ /* 自定义面包屑的渲染 注意:优先级比 PageContainer props 低 */
breadcrumbRender: PropRenderType, breadcrumbRender: PropRenderType,
/* 自定义面包屑的完整数据 注意:优先级比 PageContainer props 低 */
breadcrumb: PropTypes.object,
// Event // Event
onMenuHeaderClick: PropTypes.func, onMenuHeaderClick: PropTypes.func,
......
import { FunctionalComponent, VNodeChild, ref } from 'vue'; import { FunctionalComponent, VNodeChild, ref, unref } from 'vue';
/* replace antd ts define */ /* replace antd ts define */
import { TabPaneProps } from './interfaces/TabPane'; import { TabPaneProps } from './interfaces/TabPane';
import { TabBarExtraContent, TabsProps } from './interfaces/Tabs'; import { TabBarExtraContent, TabsProps } from './interfaces/Tabs';
...@@ -148,13 +148,16 @@ const defaultPageHeaderRender = ( ...@@ -148,13 +148,16 @@ const defaultPageHeaderRender = (
if (!title && title !== false) { if (!title && title !== false) {
pageHeaderTitle = value.title; pageHeaderTitle = value.title;
} }
console.log('value.breadcrumb', value.breadcrumb);
// inject value // inject value
return ( return (
<PageHeader <PageHeader
title={pageHeaderTitle} title={pageHeaderTitle}
// 拉高了 直接传递 props 的优先级
breadcrumb={{
routes: unref(value.breadcrumb?.routes),
itemRender: value.breadcrumb?.itemRender,
}}
{...restProps} {...restProps}
breadcrumb={{ routes: value.breadcrumb?.routes, itemRender: value.breadcrumb?.itemRender }}
footer={renderFooter({ footer={renderFooter({
...restProps, ...restProps,
tabList, tabList,
......
import { InjectionKey, reactive, VNodeChild } from 'vue'; import { InjectionKey, reactive } from 'vue';
import { createContext, useContext } from './hooks/context'; import { createContext, useContext } from './hooks/context';
import { MenuDataItem, CustomRender } from './typings'; import { MenuDataItem, CustomRender } from './typings';
import { PureSettings } from './defaultSettings'; import { PureSettings } from './defaultSettings';
...@@ -12,7 +12,7 @@ export interface BreadcrumbProps { ...@@ -12,7 +12,7 @@ export interface BreadcrumbProps {
prefixCls?: string; prefixCls?: string;
routes?: Route[]; routes?: Route[];
params?: any; params?: any;
separator?: VNodeChild; separator?: CustomRender;
itemRender?: (opts: { itemRender?: (opts: {
route: Route; route: Route;
params: any; params: any;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment