考えられる原因:
- 日付の不一致:
PomodoroTimerから$emitされるwork-finishedイベントのdateの形式と、PomodoroCalendarでログをフィルタリングする際の日付形式が一致していない可能性があります。 - 時刻の範囲:
getWorkLogsForDateAndTimeメソッドで、タスクが該当の時間帯に表示される条件が厳しすぎる可能性があります。 calendarRefのタイミング:App.vueでcalendarRefがnullのタイミングでhandleWorkFinishedが実行されている可能性があります。
ステップ1:PomodoroTimer.vue の修正(work-finished イベントの date の形式を明確化)
PomodoroCalendar での日付フィルタリングと確実に一致するように、work-finished イベントで送信する date の形式を YYYY-MM-DD に統一します。
変更前 (PomodoroTimer.vue の該当箇所):
JavaScript
this.$emit("work-finished", {
date: new Date().toISOString().slice(0, 10),
startTime: this.workStartTime,
endTime: workEndTime,
task: "集中作業", // 必要に応じて変更可能
});
変更後 (PomodoroTimer.vue の該当箇所):
JavaScript
const today = new Date();
const year = today.getFullYear();
const month = (today.getMonth() + 1).toString().padStart(2, '0');
const day = today.getDate().toString().padStart(2, '0');
const formattedDate = `${year}-${month}-${day}`;
this.$emit("work-finished", {
date: formattedDate,
startTime: this.workStartTime,
endTime: workEndTime,
task: "集中作業", // 必要に応じて変更可能
});
変更点の解説:
new Date().toISOString().slice(0, 10)で取得していた日付形式を、年・月・日をそれぞれ取得してpadStart(2, '0')で2桁に揃え、-で結合する形式に変更しました。これにより、YYYY-MM-DD形式の日付が確実に送信されます。
ステップ2:PomodoroCalendar.vue の修正(getWorkLogsForDateAndTime の条件を緩和)
タスクの開始時間と終了時間が完全に一致する時間帯のみを表示するのではなく、開始時間を含む時間帯に表示するように条件を緩和します。
変更前 (PomodoroCalendar.vue の getWorkLogsForDateAndTime メソッド):
JavaScript
getWorkLogsForDateAndTime(date, hour) {
if (!date) {
return [];
}
const formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1)
.toString()
.padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")}`;
return this.calendarWorkLogs.filter((log) => {
if (log.date === formattedDate) {
const startTimeParts = log.startTime.split(":");
const endTimeParts = log.endTime.split(":");
const startHour = parseInt(startTimeParts[0]);
const endHour = parseInt(endTimeParts[0]);
return startHour <= hour && hour < endHour; // 開始時間以降、終了時間までのタスクを表示
}
return false;
});
},
変更後 (PomodoroCalendar.vue の getWorkLogsForDateAndTime メソッド):
JavaScript
getWorkLogsForDateAndTime(date, hour) {
if (!date) {
return [];
}
const formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1)
.toString()
.padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")}`;
return this.calendarWorkLogs.filter((log) => {
if (log.date === formattedDate) {
const startTimeParts = log.startTime.split(":");
const startHour = parseInt(startTimeParts[0]);
return startHour === hour; // 開始時間の時間帯にタスクを表示
}
return false;
});
},
変更点の解説:
- タスクを表示する条件を
startHour <= hour && hour < endHourからstartHour === hourに変更しました。これにより、タスクの開始時間の時間帯にそのタスクが表示されるようになります。必要に応じて、より柔軟な表示条件(例えば、開始時間または終了時間を含む時間帯など)に調整してください。
ステップ3:App.vue の修正(calendarRef の存在確認をより確実にする)
handleWorkFinished で calendarRef が存在することを確認してから addWorkLog を呼び出すようにします。
変更前 (App.vue の handleWorkFinished 関数):
JavaScript
const handleWorkFinished = (logData) => {
console.log("App.vue で作業終了イベントを受け取りました:", logData);
calendarWorkLogs.value.push(logData); // 作業終了時にログを calendarWorkLogs に追加
if (route.path === "/calendar" && calendarRef.value) {
calendarRef.value.addWorkLog(logData); // カレンダーが表示されていれば直接追加
}
};
変更後 (App.vue の handleWorkFinished 関数):
JavaScript
const handleWorkFinished = (logData) => {
console.log("App.vue で作業終了イベントを受け取りました:", logData);
calendarWorkLogs.value.push(logData); // 作業終了時にログを calendarWorkLogs に追加
if (route.path === "/calendar" && calendarRef.value) {
// setTimeout を使用して、わずかな遅延後に addWorkLog を呼び出す
setTimeout(() => {
calendarRef.value.addWorkLog(logData);
}, 0);
}
};
変更点の解説:
setTimeout(() => { ... }, 0)を追加しました。これにより、現在の JavaScript のイベントループの最後にcalendarRef.value.addWorkLog(logData)の呼び出しがスケジュールされます。これにより、PomodoroCalendarコンポーネントが確実にマウントされ、calendarRefが利用可能になった後にaddWorkLogが実行される可能性が高まります。
上記のように変更したが反映されない
検証
承知いたしました。開発者ツールを使って、タイマー終了後のタスクがカレンダーに反映されない原因を特定するための具体的な検証手順をステップごとに解説します。
ステップ1:Console タブの確認(JavaScript エラーの有無)
まず、JavaScript のエラーが発生していないかを確認します。
- 開発者ツールを開く: ブラウザでアプリケーションを開き、F12 キー(または右クリックして「検証」を選択)を押して開発者ツールを開きます。
- Console タブを選択: 開発者ツールのタブの中から「Console」を選択します。
- エラーの確認: 赤い文字で表示されているエラーメッセージがないか確認します。エラーメッセージがあれば、その内容を詳しく読み、どのファイルや行でエラーが発生しているかを確認します。エラーの内容によっては、問題の原因が直接的に示されている場合があります。
ステップ2:Vue Devtools の確認(コンポーネントの状態とデータの流れ)
Vue.js の状態管理やコンポーネントのデータの流れを確認するために、Vue Devtools を使用します。まだインストールしていない場合は、Chrome ウェブストアまたは Firefox Add-ons からインストールしてください。
- Vue Devtools を開く: 開発者ツールが開いている状態で、Vue Devtools のタブを選択します(Vue のアイコンが付いています)。
- Components タブを選択: Vue Devtools のタブの中から「Components」を選択します。
- コンポーネントの選択: 左側のツリーから
<PomodoroTimer>と<PomodoroCalendar>を探して選択し、それぞれのコンポーネントのprops、data、computedの値を確認します。 - タイマー操作時のデータの変化: タイマーを開始し、終了させた際に、
<PomodoroTimer>コンポーネントの関連データ(例えば、workStartTime、タイマーの状態フラグなど)がどのように変化するかを確認します。 work-finishedイベントの確認: タイマーが終了した際に、Vue Devtools のイベントログ(Components タブの下部にあるイベントセクション)にwork-finishedイベントが発行されているか、また、そのペイロード(送信されたデータ)の内容 (date,startTime,endTimeなど)が正しいかを確認します。
Not declaredとなっていたため以下を追加

<PomodoroTimer> コンポーネントで $emit("work-finished", {...}) はしているものの、そのカスタムイベントが <PomodoroTimer> を使っている側(=App.vue)で emits オプションに定義されていない ためです。
✅ 解決方法
PomodoroTimer.vue の <script> 部分に以下を追加してください。
jsコピーする編集するexport default {
emits: ["work-finished"], // ← これを追加!
data() {
return {
// 既存のdata内容
};
},
...
};
<App>コンポーネントの確認:<App>コンポーネントを選択し、calendarWorkLogsrefの値がどのように変化するかを確認します。handleWorkFinishedが正しく実行され、ログデータがcalendarWorkLogsに追加されているかを確認します。<PomodoroCalendar>コンポーネントの確認:<PomodoroCalendar>コンポーネントを選択し、workLogspropsの値が親コンポーネント (<App>) から正しく渡されているか、また、calendarWorkLogsdataの値がどのように変化するかを確認します。mountedフックでworkLogsの内容がcalendarWorkLogsに反映されているか、タイマー終了後にaddWorkLogが呼び出された際にcalendarWorkLogsに新しいログが追加されているかを確認します。
ステップ3:Network タブの確認(API 通信の有無)
もしアプリケーションがバックエンドと通信してデータを保存・取得している場合は、Network タブを確認します。今回のケースでは可能性は低いですが、念のため確認しておくと良いでしょう。
- Network タブを選択: 開発者ツールのタブの中から「Network」を選択します。
- リクエストの確認: タイマー操作時やカレンダー表示時に、新しいリクエストが送信されていないか確認します。もしリクエストがあれば、そのステータスコード、ヘッダー、レスポンスの内容を確認します。
ステップ4:データの流れの追跡
Vue Devtools を使って、work-finished イベントからカレンダーへのデータの流れを追跡します。
- タイマー終了: タイマーを終了させ、
work-finishedイベントが発行されることを Vue Devtools で確認します。 App.vueでの受信:App.vueのhandleWorkFinished関数がイベントを受け取り、calendarWorkLogsを更新しているか、また、条件に応じてcalendarRef.value.addWorkLogを呼び出しているかを確認します。PomodoroCalendar.vueでの受信:- Props の確認:
<PomodoroCalendar>コンポーネントのworkLogspropsが更新されているかを確認します。 watchの確認:workLogspropsのwatch関数がトリガーされ、calendarWorkLogsが更新されているかを確認します。addWorkLogの確認:addWorkLog関数が呼び出された場合、calendarWorkLogsに新しいログが追加されているかを確認します。getWorkLogsForDateAndTimeの確認: カレンダーの表示が更新された際に、getWorkLogsForDateAndTime関数がcalendarWorkLogsを正しくフィルタリングし、表示すべきタスクを返しているかを確認します。その際、比較しているdateの形式や時間の範囲が適切かどうかも確認します。
- Props の確認: