npm i antd styled-components @ant-design/icons
// AppLayout.js
import React from 'react';
import PropTypes from 'prop-types';
import Link from 'next/link';
import { Menu } from 'antd';
const AppLayout = ({ children }) => {
return (
<div>
<Menu mod="horizontal">
<Menu.Item>
<Link href="/"><a>노드버드</a></Link>
</Menu.Item>
<Menu.Item>
<Link href="/profile"><a>프로필</a></Link>
</Menu.Item>
<Menu.Item>
<Link href="signup"><a>회원가입</a></Link>
</Menu.Item>
</Menu>
{children}
</div>
);
};
AppLayout.propTypes = {
children: PropTypes.node.isRequired,
}
export default AppLayout;
_app.js
파일을 만들어서 넣어주자._app.js
를 만들어주자.
_app.js
는 pages 폴더내에 있는 모든 컴포넌트의 부모에 해당한다.
즉, 모든 컴포넌트에서 사용할 것은 _app.js에서 코딩을 하면 되고, 특정 컴포넌트에서 적용할 것은 AppLayout.js 와 같은 곳에서 사용해주면 된다.
// _app.js
import React from 'react';
import PropTypes from 'prop-types';
import 'antd/dist/antd.css';
const NodeBird = ({ Component }) => {
return (
<Component />
);
};
NodeBird.propTypes = {
Component: PropTypes.elementType.isRequired,
}
export default NodeBird;
_app.js
에서 사용하면 된다.// _app.js
import React from 'react';
import PropTypes from 'prop-types';
import Head from 'next/head';
import 'antd/dist/antd.css';
const NodeBird = ({ Component }) => {
return (
<>
<Head>
<meta charset="UTF-8" />
<title>NodeBird</title>
</Head>
<Component />
</>
);
};
NodeBird.propTypes = {
Component: PropTypes.elementType.isRequired,
}
export default NodeBird;
// profile.js
import React from 'react';
import Head from 'next/head';
import AppLayout from '../components/AppLayout';
const Profile = () => {
return (
<>
<Head>
<title>내 프로필 | NodeBird</title>
</Head>
<AppLayout>내 프로필</AppLayout>
</>
);
}
export default Profile;
// signup.js
import React from 'react';
import Head from 'next/head';
import AppLayout from '../components/AppLayout';
const Signup = () => {
return (
<>
<Head>
<title>회원가입 | NodeBird</title>
</Head>
<AppLayout>회원가입 페이지</AppLayout>
</>
);
}
export default Signup;
// AppLayout.js
import React from 'react';
import PropTypes from 'prop-types';
import Link from 'next/link';
import { Menu, Input } from 'antd';
import 'antd/dist/antd.css';
const AppLayout = ({ children }) => {
return (
<div>
<Menu mod="horizontal">
<Menu.Item>
<Link href="/"><a>노드버드</a></Link>
</Menu.Item>
<Menu.Item>
<Link href="/profile"><a>프로필</a></Link>
</Menu.Item>
<Menu.Item>
<Input.Search enterButton style={{ verticalAlign: 'middle' }} />
</Menu.Item>
<Menu.Item>
<Link href="signup"><a>회원가입</a></Link>
</Menu.Item>
</Menu>
{children}
</div>
);
};
AppLayout.propTypes = {
children: PropTypes.node.isRequired,
}
export default AppLayout;
Row
와 Col
을 사용해보자.즉, 지금 반응형 만들기 기준은 아래와 같다.
// AppLayout.js
import React from 'react';
import PropTypes from 'prop-types';
import Link from 'next/link';
import { Menu, Input, Row, Col } from 'antd';
import 'antd/dist/antd.css';
const AppLayout = ({ children }) => {
return (
<div>
<Menu mod="horizontal">
<Menu.Item>
<Link href="/"><a>노드버드</a></Link>
</Menu.Item>
<Menu.Item>
<Link href="/profile"><a>프로필</a></Link>
</Menu.Item>
<Menu.Item>
<Input.Search enterButton style={{ verticalAlign: 'middle' }} />
</Menu.Item>
<Menu.Item>
<Link href="signup"><a>회원가입</a></Link>
</Menu.Item>
</Menu>
{children}
<Row gutter={8}>
<Col xs={24} md={6} >
</Col>
<Col xs={24} md={12}>
{children}
</Col>
<Col xs={24} md={6}>
<a href="https://www.zerocho.com" target="_blank" rel="noreferrer noopener">Made by Zerocho</a>
</Col>
</Row>
</div>
);
};
AppLayout.propTypes = {
children: PropTypes.node.isRequired,
}
export default AppLayout;
위 코드를 해석해보자.
<Col xs={24} md={6} />
md={6}
은 데스크탑 사이즈정도 되었을 때 6칸을 차지하겠다는 것<Row gutter={8}>
에서 gutter는 컬럼사이의 간격을 말한다.<a href="https://www.zerocho.com" target="_blank" rel="noreferrer noopener">Made by Zerocho</a>
_blank
로 새 창을 열려고 하면, 보안 위험이 있어서 rel="noreferrer noopener"
를 같이 적어줘야한다.