π edit μν κ΄λ¦¬
const editId = ref(null);
const editTitle = ref("");
π μ μ₯
async function saveEdit(id) {
await editTodoApi({
id,
title: editTitle.value,
authHeader: authHeaderFn(),
});
cancelEdit();
await loadTodoList();
await loadMonthSummary(currentMonth.value);
}
π μ€μΉ
npm i v-calendar@next
π main.js μ μ λ±λ‘
import VCalendar from "v-calendar";
import "v-calendar/style.css";
createApp(App)
.use(router)
.use(VCalendar, {})
.mount("#app");
π VDatePicker μ¬μ©
<VDatePicker
v-model="dateProxy"
mode="date"
is-required
:columns="1"
:attributes="calendarAttrs"
:initial-page="initialPage"
@update:pages="onUpdatePages"
/>
π λ μ§ μ ν
selectedDateObjλ₯Ό λΆλͺ¨μ μλ°©ν₯ λ°μΈλ©ν¨
const dateProxy = computed({
get: () => props.selectedDateObj,
set: (v) => emit("update:selectedDateObj", v),
});
π μ μ΄λ
update:pages μ΄λ²€νΈ μ¬μ©
function onUpdatePages(pages) {
const first = pages[0];
const monthStr = toMonthStr(first.year, first.month);
if (monthStr === lastEmittedMonth.value) return;
lastEmittedMonth.value = monthStr;
emit("monthChange", monthStr);
}
λΆλͺ¨(MainView)μμ loadMonthSummary νΈμΆ
<MainCalendar
@monthChange="loadMonthSummary"
/>
π Dot νμ λ‘μ§
monthRemainingMap κΈ°λ° attribute μμ±
for (const [dateStr, v] of Object.entries(monthRemainingMap.value)) {
if (v.total <= 0) continue;
attrs.push({
key: `rem-${dateStr}`,
dates: new Date(dateStr + "T00:00:00"),
dot: { color: v.remaining === 0 ? "green" : "red" },
});
}
μ΄λ‘: λͺ¨λ μλ£
λΉ¨κ°: λ¨μ ν μΌ μμ
λ¨μ ν μΌ <strong>{{ remaining }}</strong>κ°
π μν νλ¦ κ΅¬μ‘°
selectedDateObj
selectedDate (computed)
monthRemainingMap
currentMonth