이런 캘린더를 한번 만들어보자!
1. 프로젝트 생성
yarn create react-app calendar
프로젝트를 생성한다.
2. styled-components , moment 설치
yarn add styled-components
yarn add moment
3. 폴더구조
일단 이렇게 만들어줬다.
- pages -> 한 페이지
- components -> 중간 단위의 컴포넌트
- elements -> 최소 단위 컴포넌트
4. 최소단위 컴포넌트
일단 text 컴포넌트와 버튼 컴포넌트를 만들어보겠다.
Text 컴포넌트
elements/Text.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import React from "react";
import styled from "styled-components";
const Text = (props) => {
const { bold, color, size, children, margin } = props;
const styles = {bold: bold, color: color, size: size, margin};
return (
<P {...styles}>
{children}
</P>
)
};
Text.defaultProps = {
children: null,
bold: false,
color: "#222831",
size: "14px",
margin: false,
};
const P = styled.p`
color: ${(props) => props.color};
font-size: ${(props) => props.size};
font-weight: ${(props) => (props.bold? "600" : "400")};
${(props) => (props.margin? `margin: ${props.margin};` : '')}
`;
export default Text;
|
cs |
Button컴포넌트
elements/Button.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
import React from "react";
import styled from "styled-components";
const Button = (props) => {
const { text, _onClick, is_float, children, margin, width,padding } = props;
if (is_float) {
return (
<React.Fragment>
<FloatButton onClick={_onClick}>{text? text : children}</FloatButton>
</React.Fragment>
);
}
const styles = {
margin: margin,
width: width,
padding: padding,
};
return (
<React.Fragment>
<ElButton {...styles} onClick={_onClick}>{text? text: children}</ElButton>
</React.Fragment>
);
};
Button.defaultProps = {
text: false,
children: null,
_onClick: () => {},
is_float: false,
margin: false,
width: '100%',
padding: "12px 0px",
};
const ElButton = styled.button`
width: ${(props) => props.width};
background-color: #212121;
color: #ffffff;
padding: ${(props) => props.padding};
box-sizing: border-box;
border: none;
${(props) => (props.margin? `margin: ${props.margin};` : '')}
`;
const FloatButton = styled.button`
width: 50px;
height: 50px;
background-color: #212121;
color: #ffffff;
box-sizing: border-box;
font-size: 36px;
font-weight: 800;
position: fixed;
bottom: 50px;
right: 16px;
text-align: center;
vertical-align: middle;
border: none;
border-radius: 50px;
`;
export default Button;
|
cs |
elements/index.js
1
2
3
4
|
import Text from "./Text";
import Button from "./Button";
export {Text, Button};
|
cs |
index.js를 만들어서 export를 한번에 해줄 수 있도록 만든다
5. Header와 Calendar만들기
components/Header.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import React from "react";
import {Text} from "../elements"
import styled from "styled-components";
const Header = (props) =>{
const { calendarYM, today} = props;
return(
<React.Fragment>
<Container>
<Text>{calendarYM}</Text>
<Text>{today}</Text>
</Container>
</React.Fragment>
);
}
const Container = styled.div`
flex-basis: 50px;
background-color: tomato;
`;
export default Header;
|
cs |
이부분이 Header이다.
여기서 props에서 받아오는 값은 밑에서 설명!
components/Calender.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import React from "react";
import styled from "styled-components";
const Calendar = (props) =>{
return(
<React.Fragment>
<Container>
</Container>
</React.Fragment>
);
}
const Container = styled.div`
flex-grow: 1;
background-color: lightgray;
`;
export default Calendar;
|
cs |
이 부분에 들어갈 것이 Calendar이다.
일단은 색상으로 구분을 해두었다.
이것도 index.js로 엮어서 export해주도록 했다.
6. page만들기
pages/FullCalendar.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
import React from "react";
import { Header, Calendar } from '../components';
import moment from "moment";
import styled from "styled-components";
function FullCalendar() {
const [calendarYM , setCalendarYM] = React.useState("");
const [today , setToday] = React.useState("");
React.useEffect(()=>{
setCalendarYM(moment().format("YYYY년 MM월"));
setToday(moment().format("현재 YYYY - MM - DD"));
},[]);
return (
<Layout >
<Container>
<Header
calendarYM = {calendarYM}
today= {today}
/>
<Calendar/>
</Container>
</Layout>
);
}
const Layout = styled.div`
width: 100vw;
height: 80vh;
border: 1px solid black;
`;
const Container = styled.div`
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
`;
export default FullCalendar;
|
cs |
요것이 전체 화면이다.
여기서 moment로 현재 날짜를 가져와서 Header에 넘겨주고 있다.
App.js
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import React from "react";
import FullCalendar from "./pages/FullCalendar";
function App() {
return (
<FullCalendar/>
);
}
export default App;
|
cs |
App.js에서 부른다.
<결과>
이렇게 현재 날짜를 잘 불러왔다.
728x90
'WEB > REACT' 카테고리의 다른 글
[REACT] 리액트 심화반 강의 프로젝트 만들기 순서를 알려주겠다. (0) | 2021.07.06 |
---|---|
[REACT] React로 캘린더 만들기 (2) - month이동하기, 요일써주기 (0) | 2021.07.05 |
[REACT] 컴포넌트 쪼개기/ 포스트 보이는 메인페이지 만들기 / 최소단위 컴포넌트 만들기 / Grid와 이미지 컴포넌트 (2) (0) | 2021.07.02 |
[REACT] 컴포넌트 쪼개기/ 포스트 보이는 메인페이지 만들기 / 가장 큰 단위, 중간단위 (1) (0) | 2021.07.02 |
[REACT] 리액트 프로젝트 세팅/ 크롬 react 확장 프로그램 (0) | 2021.07.02 |