ย
React์ SCSS๋ฅผ ์ด์ฉํ ์บ๋ฆฐ๋ App
ย
ย
ย
ย
moment
node-sass
ย
ย
โโCALENDAR
โ โ README.md
โ โ package.json
โ โโpublic
โ โ โ index.html
โ โ โ //์ดํ ์ค๋ต
โ โ โ manifest.json
โ โโsrc
โ โโCalendar
โ โ โโBuild.js
โ โ โโCalendar.js
โ โ โโCalendarBody.js
โ โ โ Header.js
โ โโScss
โ โ โโApp.scss
โ โ โcalendar.scss
โ โโApp.js
โ โ index.jsย
moment ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ์์ ํ ๋ฌ์ ํด๋นํ๋ ๋ ์ง๋ค์ ์์ฑํด์ ์ผ์ฃผ์ผ ๋จ์๋ก ๋ฐฐ์ด๋ก ์ ์ฅํ์ฌ ์ด 6์ฃผ์ ํด๋นํ๋ ๋ฐฐ์ด์ ๋ฆฌํดํ๋ ํจ์ (๋ฌ๋ ฅ์ ๋ชธ์ฒด)
export default function Build(value) {
const startDay = value.clone().startOf("month").startOf("week"); //๋งค์ 1์ผ ์ฃผ์ ์์์ผ
const endDay = value.clone().endOf("month").endOf("week"); //ํ ๋ฌ ๋ง์ง๋ง์ฃผ์ ๋ง์ง๋ง ๋
const day = startDay.clone().subtract(1, "day");
const calendar = [];
const nextWeek = [];
//์์์ผ๋ถํฐ ๋์ผ๊น์ง ๋ฐฐ์ด์ ๋ด๊ธฐ
while (day.isBefore(endDay, "day")) {
calendar.push(
Array(7)
.fill(0)
.map(() => day.add(1, "day").clone())
);
}
//6์ฃผ๋ก ๋ง์ถ๊ธฐ
if (calendar.length < 6) {
for (let i = 0; i < 7; i++) {
nextWeek[i] = endDay.clone().add(i + 1, "days");
}
calendar.push(nextWeek);
}
return calendar;
}ํค๋์ ๋ชธ์ฒด๋ฅผ ํฌํจํ ๋ฌ๋ ฅ ์ ์ฒด๋ฅผ ๋ํ๋ด๋ ์ปดํฌ๋ํธ๋ก ์ฌ๊ธฐ์ moment ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ state๋ก ์ ์ฅํ์ฌ ๊ฐ ์ปดํฌ๋ํธ์ props๋ก ๋ฟ๋ ค์ค๋ค.
function Calendar() {
const [state, setstate] = useState(moment());
return (
<div className="Calendar">
<div className="cal_header">
<Header value={state} setvalue={setstate} moment={moment} />
</div>
<div className="cal_body">
<CalendarBody value={state} setvalue={setstate} moment={moment} />
</div>
</div>
);
}๋ฌ๋ ฅ์ ๊ธฐ๋ฅ๋ค์ด ๋๋ถ๋ถ ์คํ๋๋ ์ปดํฌ๋ํธ.
๋ฌ ๊ฐ ์ด๋, ์ค๋๋ก ๋์์ค๋ ๊ธฐ๋ฅ, ๋ ์ง ์ฐพ๊ธฐ ๊ธฐ๋ฅ ๋ฑ์ด ์ฌ๊ธฐ์ ์คํ๋๋ค.
props๋ก ๋๊ฒจ๋ฐ์ ๋ชจ๋จผํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ดํ๋ค
๋ฌ๋ ฅ์ ๋ชธ์ฒด ์ปดํฌ๋ํธ๋ก์ Build.js ์์ ๋ฆฌํด๋ ๋ฐฐ์ด์ ๊ฐ์ง๊ณ ๋ชธ์ฒด๋ฅผ ์์ฑํ๋ค.
mapํจ์๋ฅผ ํตํด ๋ฐฐ์ด์ ํ๋ฃจ ๋จ์๋ก ๋ฐ๊พธ๊ธฐ
์์ฃผ ์ฐ์ผ๋งํ ํจ๊ณผ๋ค์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ณ import ํด์ ์ฌ์ฉ
//์์ ํ์
์ง์
$SkyBlue: #2e8fe4;
$LightSky: #63aff1;
$SkyBlue-: #5fc3e4;
$Sky: #b3edfa;
$Sky-: #9de5f5;
$WhiteGray: #e3e3e3;
$Gray: #c2c2c2;
$DarkGray: #999999;
//๋ฌ๋ ฅ ๋ ์ง๋ชจ์ ๋ชจ์ ์ง์
@mixin border($border-weight, $border-color) {
width: 50px;
height: 50px;
padding: 1px;
border: $border-weight solid $border-color;
border-radius: 5px;
cursor: pointer;
}
//๋ฒํผ ๋ชจ์ ์ง์
@mixin button($color) {
border: 1px solid $color;
background-color: white;
color: $color;
padding: 5px;
}
//hover์ ์์ง์
@mixin hover {
transform: translate(1px, 1px);
}css์ ์ค๋ณต๋๋ ํด๋์ค๋ค์ ํจ์๋ฅผ ํตํด return์์ผ์ ํจ๊ณผ๋ฅผ ์
ํ ๊ฒ.
//ํด๋์ค๋ช
์ง์ ์ ์ํ ํจ์ (ํ ,์ผ ์์น ํ๊ธฐ)
const name = (idx) => {
if (idx === 0) {
return " sun";
} else if (idx === 6) {
return " sat";
} else {
return "";
}
};
//์ค๋ ๋ ์ง๋ฅผ ์ฐพ๋๋ค๋ฉด ๋ ์ง์ ๋ฐฐ๊ฒฝ์์ ์์น ํ๋ ํจ์
const findToday = (day) => {
if (day === moment().format("YYYYMMDD")) {
return " today";
} else {
return "";
}
};<div
key={idx}
className="selected"
onClick={() => {
setvalue(item);
}}
>
<div className={"day" + name(idx) + findToday(item.format("YYYYMMDD"))}>
<span>{item.format("D").toString()}</span>
</div>
</div>

