mirror of
https://github.com/ant-design/ant-design.git
synced 2024-12-18 19:39:51 +08:00
site: enable prefetch for dumi Link (#51921)
* docs: enable prefetch for dumi Link * simplify link implementation * fix lint * remove nprogress dep --------- Co-authored-by: lijianan <574980606@qq.com>
This commit is contained in:
parent
506c13bc23
commit
cb25346d8c
@ -243,7 +243,7 @@ const Overview: React.FC = () => {
|
|||||||
{cardContent}
|
{cardContent}
|
||||||
</a>
|
</a>
|
||||||
) : (
|
) : (
|
||||||
<Link to={url} prefetch key={component.title}>
|
<Link to={url} key={component.title}>
|
||||||
{cardContent}
|
{cardContent}
|
||||||
</Link>
|
</Link>
|
||||||
);
|
);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import React, { useContext } from 'react';
|
import React, { Suspense, useContext } from 'react';
|
||||||
import { BugOutlined, CodeOutlined, ExperimentOutlined } from '@ant-design/icons';
|
import { BugOutlined, CodeOutlined, ExperimentOutlined } from '@ant-design/icons';
|
||||||
import { ConfigProvider, Tooltip, Button } from 'antd';
|
import { ConfigProvider, Tooltip, Button } from 'antd';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
@ -113,7 +113,9 @@ const DemoWrapper: typeof DumiDemoGrid = ({ items }) => {
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
</span>
|
</span>
|
||||||
<ConfigProvider theme={{ cssVar: enableCssVar, hashed: !enableCssVar }}>
|
<ConfigProvider theme={{ cssVar: enableCssVar, hashed: !enableCssVar }}>
|
||||||
|
<Suspense>
|
||||||
<DumiDemoGrid items={demos} />
|
<DumiDemoGrid items={demos} />
|
||||||
|
</Suspense>
|
||||||
</ConfigProvider>
|
</ConfigProvider>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import type { MouseEvent, MouseEventHandler } from 'react';
|
import type { MouseEventHandler } from 'react';
|
||||||
import React, { forwardRef, useLayoutEffect, useTransition } from 'react';
|
import React from 'react';
|
||||||
import { Link as DumiLink, useLocation, useNavigate } from 'dumi';
|
import { Link as DumiLink } from 'dumi';
|
||||||
import nprogress from 'nprogress';
|
|
||||||
|
|
||||||
export interface LinkProps {
|
export interface LinkProps {
|
||||||
to: string | { pathname?: string; search?: string; hash?: string };
|
to: string | { pathname?: string; search?: string; hash?: string };
|
||||||
@ -9,64 +8,9 @@ export interface LinkProps {
|
|||||||
className?: string;
|
className?: string;
|
||||||
onClick?: MouseEventHandler;
|
onClick?: MouseEventHandler;
|
||||||
component?: React.ComponentType<any>;
|
component?: React.ComponentType<any>;
|
||||||
|
children?: React.ReactNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
nprogress.configure({ showSpinner: false });
|
const Link: React.FC<LinkProps> = (props) => <DumiLink {...props} prefetch />;
|
||||||
|
|
||||||
const Link = forwardRef<HTMLAnchorElement, React.PropsWithChildren<LinkProps>>((props, ref) => {
|
|
||||||
const { to, children, component, ...rest } = props;
|
|
||||||
const [isPending, startTransition] = useTransition();
|
|
||||||
const navigate = useNavigate();
|
|
||||||
const { pathname } = useLocation();
|
|
||||||
|
|
||||||
const href = React.useMemo<string>(() => {
|
|
||||||
if (typeof to === 'object') {
|
|
||||||
return `${to.pathname || pathname}${to.search || ''}${to.hash || ''}`;
|
|
||||||
}
|
|
||||||
return to;
|
|
||||||
}, [to]);
|
|
||||||
|
|
||||||
const handleClick = (e: MouseEvent<HTMLAnchorElement>) => {
|
|
||||||
props.onClick?.(e);
|
|
||||||
if (!href?.startsWith('http')) {
|
|
||||||
// Should support open in new tab
|
|
||||||
if (!e.metaKey && !e.ctrlKey && !e.shiftKey) {
|
|
||||||
e.preventDefault();
|
|
||||||
startTransition(() => {
|
|
||||||
if (href) {
|
|
||||||
navigate(href);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
useLayoutEffect(() => {
|
|
||||||
if (isPending) {
|
|
||||||
nprogress.start();
|
|
||||||
} else {
|
|
||||||
nprogress.done();
|
|
||||||
}
|
|
||||||
}, [isPending]);
|
|
||||||
|
|
||||||
if (component) {
|
|
||||||
return React.createElement(
|
|
||||||
component,
|
|
||||||
{
|
|
||||||
...rest,
|
|
||||||
ref,
|
|
||||||
onClick: handleClick,
|
|
||||||
href,
|
|
||||||
},
|
|
||||||
children,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DumiLink ref={ref} onClick={handleClick} {...rest} to={href} prefetch>
|
|
||||||
{children}
|
|
||||||
</DumiLink>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
export default Link;
|
export default Link;
|
||||||
|
@ -9,7 +9,11 @@ import { version } from './package.json';
|
|||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: ['dumi-plugin-color-chunk'],
|
plugins: ['dumi-plugin-color-chunk'],
|
||||||
|
|
||||||
|
// For <Link prefetch />
|
||||||
|
routePrefetch: {},
|
||||||
manifest: {},
|
manifest: {},
|
||||||
|
|
||||||
conventionRoutes: {
|
conventionRoutes: {
|
||||||
// to avoid generate routes for .dumi/pages/index/components/xx
|
// to avoid generate routes for .dumi/pages/index/components/xx
|
||||||
exclude: [/index\/components\//],
|
exclude: [/index\/components\//],
|
||||||
|
@ -201,7 +201,6 @@
|
|||||||
"@types/lodash": "^4.17.12",
|
"@types/lodash": "^4.17.12",
|
||||||
"@types/minimist": "^1.2.5",
|
"@types/minimist": "^1.2.5",
|
||||||
"@types/node": "^22.7.7",
|
"@types/node": "^22.7.7",
|
||||||
"@types/nprogress": "^0.2.3",
|
|
||||||
"@types/pixelmatch": "^5.2.6",
|
"@types/pixelmatch": "^5.2.6",
|
||||||
"@types/pngjs": "^6.0.5",
|
"@types/pngjs": "^6.0.5",
|
||||||
"@types/prismjs": "^1.26.4",
|
"@types/prismjs": "^1.26.4",
|
||||||
@ -270,7 +269,6 @@
|
|||||||
"mockdate": "^3.0.5",
|
"mockdate": "^3.0.5",
|
||||||
"node-fetch": "^3.3.2",
|
"node-fetch": "^3.3.2",
|
||||||
"node-notifier": "^10.0.1",
|
"node-notifier": "^10.0.1",
|
||||||
"nprogress": "^0.2.0",
|
|
||||||
"open": "^10.1.0",
|
"open": "^10.1.0",
|
||||||
"ora": "^8.1.0",
|
"ora": "^8.1.0",
|
||||||
"p-all": "^5.0.0",
|
"p-all": "^5.0.0",
|
||||||
|
Loading…
Reference in New Issue
Block a user