[React] moment 활용해서 보여지게 설정하기
1. moment 사용하기
사용하기 위해선 moment를 먼저 install을 해준뒤 import시켜주면 된다.
한국어 or 한국시간으로 표현하기 위해 언어도 같이 import 시켜준다.
npm install moment
===================
import moment from 'moment';
import 'moment/locale/ko';
2. react-use를 사용하기
setInterval()를 사용하지 않는 이유
React에서는 state가 변하면 re-rendering 되기 때문에 setInterval()함수는 무한히 실행이 된다. useEffect를 사용해도 제대로 작동하기 않고, 무한루프에 빠지기 때문에 react-use를 사용하여 useInterval를 사용한다.
npm i react-use
================
import { useInterval } from 'react-use';
3. useState를 활용하기
state는 boolean값을 활용하여 보여짐을 설정하기 위한 것이다.
const [visible, setVisible] = useState<boolean>(false);
4. useInterval() 사용하기
첫번째, state는 초를 체크하기 위한 state를 설정해줬다.
useInterval() 함수가 1초마다 변하는 초를 setSeconds에 담아둔다.
// state
const [seconds, setSeconds] = useState<number>(Date.now());
// useInterval()
useInterval(() => {
setSeconds(Date.now());
}, 1000);
5. 함수 작성하기
checkTime이라는 함수를 하나 만들어준다.
- startTime 에는 시작할 날짜
- endTime 에는 끝나는 날짜
- nowTime 에는 현재 날짜가 들어가게 된다.
if문을 활용하여 조건마다 visible이 달라질 수 있게 설정한다.
- 이때, moment에서 제공하는 isAfter를 사용할 수 있다. (moment에는 다양한 기능을 제공하니까 나중에 더 알아보면 좋겠다.)
- 현재 날짜보다 시작날짜가 작거나 같으면 false
- 현재날짜가 끝나는날짜보다 전이거나, 현재날짜가 끝나는 날짜보다 크거나 같을때 true
- 나머지 경우에는 false로 셋팅한다.
const checkTime = () => {
const startTime = moment(new Date('2022-05-25T00:00'));
const endTime = moment(new Date('2022-05-30T00:00'));
const nowTime = moment(new Date(seconds));
if (startTime <= nowTime) {
setVisible(false);
if (nowTime.isAfter(endTime) || endTime <= nowTime) {
setVisible(true);
} else {
setVisible(false);
}
} else {
setVisible(true);
}
};
6. 함수 실행하기
useEffect()를 사용하여 함수를 실행시켜준다.
배열에는 useInterval에서 담긴 secends를 활용하여 초가변할때 마다 checkTime함수를 실행시켜준다.
useEffect(() => {
checkTime();
}, [seconds]);
7. visible 활용하기
visible state를 활용하여 보여지게 설정하면 된다.
// 삼항연산자 사용
// 삼항연자자를 활용하여 true값, false값일때 보여지는걸 설정할 수 있다.
{visible ? <div>보여진다.</div> : <div>안보인다.</div>}
// && 연산자 사용
// false일 경우 아무것보 보여지지 않을때 &&연산자를 활용하여
// true값일때만 보여지게 설정할 수 있다.
{visible && <div>보여준다!</div>}
8. 전체 코드
이렇게 하면 의도한대로 움직이긴 하지만, 맞는 코드인지는 잘 모르겠다.
import React, { useEffect, useState } from 'react';
import { useInterval } from 'react-use';
import moment from 'moment';
import 'moment/locale/ko';
const test = () => {
const [visible, setVisible] = useState<boolean>(false);
const [seconds, setSeconds] = useState<number>(Date.now());
const checkTime = () => {
const beforeTime = moment(new Date('2022-05-30T00:00'));
const startTime = moment(new Date('2022-06-07T00:00'));
const nowTime = moment(new Date(seconds));
if (beforeTime <= nowTime) {
setVisible(false);
if (nowTime.isAfter(startTime) || startTime <= nowTime) {
setVisible(true);
} else {
setVisible(false);
}
} else {
setVisible(true);
}
};
useInterval(() => {
setSeconds(Date.now());
}, 1000);
useEffect(() => {
checkTime();
}, [seconds]);
return (
<>
{visible ? <div>보여진다.</div> : <div>안보인다.</div>}
{visible && <div>보여준다!</div>}
</>
);
};
export default test;
'공부 > React' 카테고리의 다른 글
자주 쓰이는 마스킹(정규식) 방법 (0) | 2022.08.12 |
---|