考えられる原因:
- 日付の不一致:
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>
コンポーネントを選択し、calendarWorkLogs
ref
の値がどのように変化するかを確認します。handleWorkFinished
が正しく実行され、ログデータがcalendarWorkLogs
に追加されているかを確認します。<PomodoroCalendar>
コンポーネントの確認:<PomodoroCalendar>
コンポーネントを選択し、workLogs
props
の値が親コンポーネント (<App>
) から正しく渡されているか、また、calendarWorkLogs
data
の値がどのように変化するかを確認します。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>
コンポーネントのworkLogs
props
が更新されているかを確認します。 watch
の確認:workLogs
props
のwatch
関数がトリガーされ、calendarWorkLogs
が更新されているかを確認します。addWorkLog
の確認:addWorkLog
関数が呼び出された場合、calendarWorkLogs
に新しいログが追加されているかを確認します。getWorkLogsForDateAndTime
の確認: カレンダーの表示が更新された際に、getWorkLogsForDateAndTime
関数がcalendarWorkLogs
を正しくフィルタリングし、表示すべきタスクを返しているかを確認します。その際、比較しているdate
の形式や時間の範囲が適切かどうかも確認します。
- Props の確認: