如何在next.js集成 ant-design库?
ant-design介绍
Ant Design 是一个基于 React 的 UI 组件库,由蚂蚁金服前端团队开发和维护。它提供了丰富的组件和样式,使得开发者可以快速构建出美观、易用的用户界面。
Ant Design的设计理念是基于阿里巴巴的设计规范——Ant Design 设计语言,该设计语言以"一切皆对象"的概念为基础,强调组件的可组合性和可复用性。Ant Design 提供了一系列的组件,如按钮、输入框、表格、菜单等,这些组件都经过精心设计和开发,可以轻松地在项目中使用,并且具有良好的用户体验。
除了提供基础的组件,Ant Design 还提供了一些特定场景下的组件,如日期选择器、模态框、通知提示等,这些组件可以帮助开发者快速搭建出符合业务需求的界面。
Ant Design 也提供了完整的主题定制功能,开发者可以根据自己的需求定制主题样式,使得界面更加符合项目的风格。
Next.js中集成Ant Design库
需要按照以下步骤进行操作:
安装依赖:在项目的根目录中运行以下命令来安装Ant Design库和相关依赖:
npm install antd
创建一个_app.js
文件:在项目的pages
目录中创建一个_app.js
文件,并添加以下代码:
import 'antd/dist/antd.css';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
export default MyApp
导入需要的Ant Design组件:在任何页面中,可以直接导入需要的Ant Design组件来使用,例如:
import { Button } from 'antd';
function HomePage() {
return (
<Button type="primary">Primary Button</Button>
);
}
export default HomePage;
配置babel:默认情况下,Next.js只支持CSS的模块化导入,而Ant Design库的样式是全局导入的。为了支持全局样式导入,我们需要配置babel。在项目的根目录中创建一个.babelrc
文件,并添加以下代码:
{
"presets": ["next/babel"],
"plugins": [
[
"import",
{
"libraryName": "antd",
"style": "css"
}
]
]
}
重启应用:重新启动你的Next.js应用,可以看到Ant Design库已经成功集成到项目中。
通过以上步骤,你就可以在Next.js项目中成功集成Ant Design库并使用它的组件了。
官方建议操作方式:
目录结构:
主要文件内容设置:?
package.json
{
"private": true,
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start"
},
"dependencies": {
"@ant-design/cssinjs": "^1.16.1",
"@ant-design/icons": "^5.1.4",
"antd": "^5.0.0",
"next": "latest",
"react": "18.2.0",
"react-dom": "18.2.0"
},
"devDependencies": {
"@types/node": "^20.4.5",
"@types/react": "^18.2.17",
"@types/react-dom": "^18.2.7",
"typescript": "^5.1.6"
},
"browser": {
"fs": false,
"path": false
}
}
AntRegistry.tsx
'use client'
import React from 'react'
import { useServerInsertedHTML } from 'next/navigation'
import { StyleProvider, createCache, extractStyle } from '@ant-design/cssinjs'
import type Entity from '@ant-design/cssinjs/es/Cache'
interface StyledRegistryProps {
children: React.ReactNode
}
const StyledComponentsRegistry = ({ children }: StyledRegistryProps) => {
const cache = React.useMemo<Entity>(() => createCache(), [])
useServerInsertedHTML(() => (
<style
id="antd"
dangerouslySetInnerHTML={{ __html: extractStyle(cache, true) }}
/>
))
return <StyleProvider cache={cache}>{children}</StyleProvider>
}
export default StyledComponentsRegistry
?layout.tsx
import React from 'react'
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
import StyledComponentsRegistry from './AntdRegistry'
import './globals.css'
const inter = Inter({ subsets: ['latin'] })
export const metadata: Metadata = {
title: 'Create Next App',
description: 'Generated by create next app',
}
interface RootLayoutProps {
children: React.ReactNode
}
function RootLayout({ children }: RootLayoutProps) {
return (
<html lang="en">
<body className={inter.className}>
<StyledComponentsRegistry>{children}</StyledComponentsRegistry>
</body>
</html>
)
}
export default RootLayout
page.tsx
'use client'
import React from 'react'
import Link from 'next/link'
import { SmileFilled } from '@ant-design/icons'
import {
Button,
DatePicker,
Form,
InputNumber,
Select,
Slider,
Switch,
ConfigProvider,
} from 'antd'
import theme from './themeConfig'
const HomePage = () => (
<ConfigProvider theme={theme}>
<div style={{ padding: 100, height: '100vh' }}>
<div className="text-center mb-5">
<Link href="#" className="logo mr-0">
<SmileFilled style={{ fontSize: 48 }} />
</Link>
<p className="mb-0 mt-3 text-disabled">Welcome to the world !</p>
</div>
<div>
<Form
layout="horizontal"
size={'large'}
labelCol={{ span: 8 }}
wrapperCol={{ span: 8 }}
>
<Form.Item label="Input Number">
<InputNumber
min={1}
max={10}
style={{ width: 100 }}
defaultValue={3}
name="inputNumber"
/>
</Form.Item>
<Form.Item label="Switch">
<Switch defaultChecked />
</Form.Item>
<Form.Item label="Slider">
<Slider defaultValue={70} />
</Form.Item>
<Form.Item label="Select">
<Select
defaultValue="lucy"
style={{ width: 192 }}
options={[
{ value: 'jack', label: 'Jack' },
{ value: 'lucy', label: 'Lucy' },
{ value: 'Yiminghe', label: 'yiminghe' },
{ value: 'lijianan', label: 'lijianan' },
{ value: 'disabled', label: 'Disabled', disabled: true },
]}
/>
</Form.Item>
<Form.Item label="DatePicker">
<DatePicker showTime />
</Form.Item>
<Form.Item style={{ marginTop: 48 }} wrapperCol={{ offset: 8 }}>
<Button type="primary" htmlType="submit">
OK
</Button>
<Button style={{ marginLeft: 8 }}>Cancel</Button>
</Form.Item>
</Form>
</div>
</div>
</ConfigProvider>
)
export default HomePage
themeConfig.ts
import type { ThemeConfig } from 'antd'
const theme: ThemeConfig = {
token: {
fontSize: 16,
colorPrimary: '#52c41a',
},
}
export default theme
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!