mirror of
https://github.com/ant-design/ant-design.git
synced 2025-01-06 10:48:01 +08:00
ca35f2f891
* docs: update docs * docs: update docs * feat: optimize code * docs: update docs * docs: update docs
163 lines
4.4 KiB
Markdown
163 lines
4.4 KiB
Markdown
---
|
|
order: 4
|
|
title: 在 Next.js 中使用
|
|
---
|
|
|
|
[Next.js](https://nextjs.org/) 是目前世界上最流行的 React 服务端同构框架,本文会尝试在 Next.js 创建的工程中使用 `antd` 组件。
|
|
|
|
## 安装和初始化
|
|
|
|
在开始之前,你可能需要安装 [yarn](https://github.com/yarnpkg/yarn/) 或者 [pnpm](https://pnpm.io/zh/)。
|
|
|
|
<InstallDependencies npm='$ npx create-next-app antd-demo' yarn='$ yarn create next-app antd-demo' pnpm='$ pnpm create next-app antd-demo'></InstallDependencies>
|
|
|
|
工具会自动初始化一个脚手架并安装项目的各种必要依赖,在安装过程中,有一些配置项需要自行选择,如果在过程中出现网络问题,请尝试配置代理,或使用其他 npm registry。
|
|
|
|
初始化完成后,我们进入项目并启动。
|
|
|
|
```bash
|
|
$ cd antd-demo
|
|
$ npm run dev
|
|
```
|
|
|
|
此时使用浏览器访问 http://localhost:3000/ ,看到 NEXT 的 logo 就算成功了。
|
|
|
|
## 引入 antd
|
|
|
|
现在从 yarn 或 npm 或 pnpm 安装并引入 antd。
|
|
|
|
<InstallDependencies npm='$ npm install antd --save' yarn='$ yarn add antd' pnpm='$ pnpm install antd --save'></InstallDependencies>
|
|
|
|
修改 `src/app/page.tsx`,引入 antd 的按钮组件。
|
|
|
|
```jsx
|
|
'use client';
|
|
|
|
import React from 'react';
|
|
import { Button } from 'antd';
|
|
|
|
const Home = () => (
|
|
<div className="App">
|
|
<Button type="primary">Button</Button>
|
|
</div>
|
|
);
|
|
|
|
export default Home;
|
|
```
|
|
|
|
好了,现在你应该能看到页面上已经有了 `antd` 的蓝色按钮组件,接下来就可以继续选用其他组件开发应用了。其他开发流程你可以参考 Next.js 的[官方文档](https://nextjs.org/)。
|
|
|
|
我们现在已经把 antd 组件成功运行起来了,开始开发你的应用吧!
|
|
|
|
## 使用 Next.js 的 App Router
|
|
|
|
如果你在 Next.js 当中使用了 App Router, 并使用 antd 作为页面组件库,为了让 antd 组件库在你的 Next.js 应用中能够更好的工作,提供更好的用户体验,你可以尝试使用下面的方式将 antd 首屏样式按需抽离并植入到 HTML 中,以避免页面闪动的情况。
|
|
|
|
1. 安装 `@ant-design/cssinjs`
|
|
|
|
<InstallDependencies npm='$ npm install @ant-design/cssinjs --save' yarn='$ yarn add @ant-design/cssinjs' pnpm='$ pnpm install @ant-design/cssinjs --save'></InstallDependencies>
|
|
|
|
2. 创建 `lib/AntdRegistry.tsx`
|
|
|
|
```tsx
|
|
'use client';
|
|
|
|
import React from 'react';
|
|
import { useServerInsertedHTML } from 'next/navigation';
|
|
import { StyleProvider, createCache, extractStyle } from '@ant-design/cssinjs';
|
|
|
|
export default function StyledComponentsRegistry({ children }: { children: React.ReactNode }) {
|
|
const cache = createCache();
|
|
|
|
useServerInsertedHTML(() => (
|
|
<style id="antd" dangerouslySetInnerHTML={{ __html: extractStyle(cache, true) }}></style>
|
|
));
|
|
|
|
return <StyleProvider cache={cache}>{children}</StyleProvider>;
|
|
}
|
|
```
|
|
|
|
3. 在 `app/layout.tsx` 中使用
|
|
|
|
```tsx
|
|
import StyledComponentsRegistry from '../lib/AntdRegistry';
|
|
import './globals.css';
|
|
import { Inter } from 'next/font/google';
|
|
|
|
const inter = Inter({ subsets: ['latin'] });
|
|
|
|
export const metadata = {
|
|
title: 'Create Next App',
|
|
description: 'Generated by create next app',
|
|
};
|
|
|
|
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
return (
|
|
<html lang="en">
|
|
<body className={inter.className}>
|
|
<StyledComponentsRegistry>{children}</StyledComponentsRegistry>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|
|
```
|
|
|
|
4. 在 `theme/*.tsx` 中自定义主题
|
|
|
|
```tsx
|
|
'use client';
|
|
|
|
// theme/index.tsx
|
|
import React from 'react';
|
|
import { ConfigProvider } from 'antd';
|
|
|
|
const withTheme = (node: JSX.Element) => (
|
|
<ConfigProvider
|
|
theme={{
|
|
token: {
|
|
colorPrimary: '#52c41a',
|
|
},
|
|
}}
|
|
>
|
|
{/* nesting */}
|
|
<ConfigProvider
|
|
theme={{
|
|
token: {
|
|
borderRadius: 16,
|
|
},
|
|
}}
|
|
>
|
|
{node}
|
|
</ConfigProvider>
|
|
</ConfigProvider>
|
|
);
|
|
|
|
export default withTheme;
|
|
```
|
|
|
|
5. 在页面中使用
|
|
|
|
```tsx
|
|
'use client';
|
|
|
|
import React from 'react';
|
|
import { Button } from 'antd';
|
|
import withTheme from '../../theme';
|
|
|
|
const Home = function Home() {
|
|
return (
|
|
<div className="App">
|
|
<Button type="primary">Button</Button>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
const HomePage = () => {
|
|
return withTheme(<Home />);
|
|
};
|
|
|
|
export default HomePage;
|
|
```
|
|
|
|
更多详细的细节可以参考 [with-nextjs-app-router-inline-style](https://github.com/ant-design/ant-design-examples/tree/main/examples/with-nextjs-app-router-inline-style)。
|