useToday
日付が変わる時刻とタブに戻ったときに切り替わる今日の日付。ハイドレーションの不一致は起こりません。
pnpm dlx shadcn@latest add https://hextaui.com/r/use-today.jsonフックと、その依存関係をプロジェクトに追加します。
次のコードをコピーしてプロジェクトに貼り付けてください。
hooks/use-today.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
今日のハイライト、過去の日の無効化、締め切りまでのカウントダウンなど、コンポーネントが現在の日付に依存するときはいつでも使います。
レンダリング中に日付を読み取ると、2つの点で壊れます。
- ハイドレーションの不一致。サーバーは自分のタイムゾーンで描画するため、数時間前の可能性があります。深夜0時付近では、サーバーとブラウザーで日付が食い違い、React はサーバーの HTML を破棄します。
- 古い日付。一晩開いたままのタブは、何かが再レンダリングするまで、昨日を今日として表示し続けます。
useToday は、サーバー上とハイドレーション中は undefined を返し、その後ローカルの日付を返します。バックグラウンドのタブではタイマーが一時停止して午前0時を逃すことがあるため、午前0時とタブが再び表示されたときにも再レンダリングします。
日付の範囲
過去の日と、30日より先のすべてを無効にします。今日が判明するまでは何も無効にならないため、サーバーの HTML は最初のクライアントのレンダリングと一致します。
このファイルは、フックの構成要素もエクスポートします。日付キーは、ローカルの YYYY-MM-DD 文字列です。日単位で比較でき、正しく並べ替えられ、React の key やキャッシュキーとして安全に使えます。subscribeToday は、React の外で、午前0時とタブに戻ったときにコールバックします。
- 返される
Dateはローカル時間の午前0時なので、<や>と比較すると、時刻ではなく日付が比較されます。 - 日が変わるまで同じ
Dateオブジェクトが返されるため、effect の依存配列に安全に使えます。 undefinedの場合のレンダリングも考慮してください。スケルトンを表示するか、日付に基づく制限なしで描画するかのどちらでも構いません。
| 戻り値 | 説明 |
|---|---|
Date | undefined | 今日のローカルの午前0時。サーバー上とハイドレーション中は undefined です。 |
| エクスポート | 説明 |
|---|---|
toDateKey(date) | Date をローカルの YYYY-MM-DD 文字列にしたもの。 |
fromDateKey(key) | YYYY-MM-DD 文字列をローカルの午前0時の Date にしたもの。 |
getTodayKey() | 今日の日付キー。 |
subscribeToday(callback) | 午前0時とタブが表示状態に戻ったときにコールバックします。購読解除の関数を返します。 |
Calendar と、それを通じた Date picker。