スキルアップのために毎日勉強中です。
そんな中、「カレンダーを作成することは初心者向けの学習テーマとして効果的である」という話を見つけたので自分でも実際に作成してみました。
目次
出来上がったもの
import React, { useState } from 'react'
export const Calendar = () => {
const [date, setDate] = useState(new Date())
const daysOfWeek = ['日', '月', '火', '水', '木', '金', '土']
const monthsOfYear = [
'1月',
'2月',
'3月',
'4月',
'5月',
'6月',
'7月',
'8月',
'9月',
'10月',
'11月',
'12月',
]
const prevMonth = () => {
setDate(new Date(date.getFullYear(), date.getMonth() - 1, 1))
}
const nextMonth = () => {
setDate(new Date(date.getFullYear(), date.getMonth() + 1, 1))
}
const renderDaysOfWeek = () => {
return daysOfWeek.map((day) => (
<div className="w-6" key={day}>
{day}
</div>
))
}
const renderCalendarDays = () => {
const firstDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1)
const lastDayOfMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0)
const numDaysInMonth = lastDayOfMonth.getDate()
const daysOfWeek = []
const days = []
for (let i = 1; i <= firstDayOfMonth.getDay(); i++) {
daysOfWeek.push(<div className="w-6" key={`empty-${i}`}></div>)
}
for (let i = 1; i <= numDaysInMonth; i++) {
const currentDate = new Date(date.getFullYear(), date.getMonth(), i)
daysOfWeek.push(
<div
className="w-6 h-6 cursor-pointer hover:bg-gray-300 hover:rounded-[50%] text-center"
onClick={() => console.log(currentDate)}
key={currentDate.toString()}
>
{i}
</div>
)
if (daysOfWeek.length === 7 || i === numDaysInMonth) {
days.push(
<div key={`week-${i}`} className="flex">
{daysOfWeek.map((day) => day)}
</div>
)
daysOfWeek.splice(0)
}
}
return days
}
return (
<div className="">
<div className="flex space-x-2">
<button onClick={prevMonth}>Prev</button>
<h2>
{monthsOfYear[date.getMonth()]} {date.getFullYear()}
</h2>
<button onClick={nextMonth}>Next</button>
</div>
<div className="flex-row">
<div className="flex">{renderDaysOfWeek()}</div>
<div className="flex-row flex-wrap">{renderCalendarDays()}</div>
</div>
</div>
)
}
こんな感じになりました。ちょっとした遊びとして日付をクリックしたら、日付のログが出るようにしてみました。
今回学んだこと
ある月の最終日の取得方法
const lastDayOfMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0)
コメント