📅

react-day-picker v9 → v10 移行ガイド【パッケージ名が変わりました】

に公開

自分が運営している UI Memo(UIコンポーネントのデモ・ライブラリ比較サイト)で、react-day-picker を v9 から v10 にアップデートした。

v10 は「クリーンアップリリース」という位置づけだが、パッケージ名が変わったのが最大のポイント。v9 で deprecated になっていた API が一斉に削除されたので、放置していた人はここで対応が必要になる。


react-day-picker とは

react-day-picker は React 向けの日付ピッカーライブラリだ。シングル選択・複数選択・範囲選択をサポートしていて、WAI-ARIA 準拠のアクセシビリティが特徴。

同じ日付ピッカー系のライブラリとして比較されることが多いのはこのあたり。

  • react-datepicker:最も人気がある。ポップアップ・インライン・時刻選択まで全部入り。
  • Mantine DatePicker:Mantine の統一デザインシステムに組み込まれた日付ピッカー。Mantine 採用プロジェクトなら追加依存なし。
  • react-day-picker:軽量(~10KB)でアクセシブル。CSS カスタムプロパティでスタイル変更が容易。shadcn/ui の Calendar コンポーネントの内部でも使われている。

実際のデモと比較は UI Memo の日付範囲ピッカーページ で確認できる。


v10 で変わったこと

v10 は 2026年2月26日にリリースされた。大きな新機能はなく、v9 で deprecated になった API を削除した「整理」のリリースだ。

ただし、以下の3点は把握しておかないとハマる。

  1. パッケージ名が @daypicker/react に変わった
  2. v9 の deprecated props が一斉削除された
  3. classNames / styles のキー名が変わった

v9 で推奨 API をすでに使っていた場合、移行はほぼ import の書き換えだけで済む。


変更点① パッケージ名が @daypicker/react になった

これが最大の変更点。react-day-picker から @daypicker/react にリネームされた。

# 旧パッケージを削除して新パッケージをインストール
npm uninstall react-day-picker
npm install @daypicker/react

互換性のため react-day-picker パッケージ名でも v10 はインストールできるが、新規プロジェクトや移行時は @daypicker/react を使うのが推奨。

// ❌ v9 まで
import { DayPicker } from 'react-day-picker';
import 'react-day-picker/style.css';

// ✅ v10 以降
import { DayPicker } from '@daypicker/react';
import '@daypicker/react/style.css';

スコープ付きパッケージ名になったことで、今後非グレゴリオ暦(ペルシャ暦、ヒジュラ暦など)が @daypicker/* 名前空間の別パッケージとして提供されるようになった。


変更点② locale の import 先が変わった

v9 までは date-fns/locale から locale をインポートしていたが、v10 では @daypicker/react/locale から直接インポートできるようになった。

// ❌ v9 まで
import { ja } from 'date-fns/locale';

// ✅ v10 以降
import { ja } from '@daypicker/react/locale';

date-fns/locale からのインポートも引き続き動作するが、@daypicker/react/locale を使えば date-fns を直接触る必要がなくなる。

ただし、プロジェクト内で date-fns を他の用途(フォーマット、日付計算など)でも使っている場合は、そちらの依存は残しておくこと。


変更点③ deprecated な props が削除された

v9 で「使えるけど非推奨」だった props が v10 で完全に削除された。以下が主な置換対象。

ナビゲーション系

// ❌ v10 で削除
<DayPicker fromDate={new Date(2020, 0)} toDate={new Date(2030, 11)} />
<DayPicker fromMonth={new Date(2020, 0)} toMonth={new Date(2030, 11)} />
<DayPicker fromYear={2020} toYear={2030} />

// ✅ v10 以降
<DayPicker startMonth={new Date(2020, 0)} endMonth={new Date(2030, 11)} />

fromDate / toDate / fromMonth / toMonth / fromYear / toYear はすべて startMonth / endMonth に統一された。

フォーカス

// ❌ v10 で削除
<DayPicker initialFocus />

// ✅ v10 以降
<DayPicker autoFocus />

イベントハンドラ

以下のイベント props はすべて削除された。カスタムコンポーネントで代替する。

  • onDayKeyUp / onDayKeyPress
  • onDayPointerEnter / onDayPointerLeave
  • onDayTouchCancel / onDayTouchEnd / onDayTouchMove / onDayTouchStart
  • onWeekNumberClick

ユーティリティ関数

// ❌ v10 で削除
import { formatMonthCaption, labelDay, isMatch } from 'react-day-picker';

// ✅ v10 以降
import { formatCaption, labelDayButton } from '@daypicker/react';
// isMatch は削除(代替なし)

変更点④ classNames / styles のキー名が変わった

カスタムスタイリングで classNames prop を使っている場合、キー名の更新が必要。これは shadcn/ui の Calendar コンポーネントをコピーして使っている人にも影響する

// ❌ v9 までの deprecated キー
classNames={{
  day_selected: "bg-blue-600 text-white",
  day_range_start: "rounded-l",
  day_range_end: "rounded-r",
  day_range_middle: "bg-blue-100",
  table: "w-full",
  nav_button: "p-1",
}}

// ✅ v10 のキー
classNames={{
  selected: "bg-blue-600 text-white",
  range_start: "rounded-l",
  range_end: "rounded-r",
  range_middle: "bg-blue-100",
  month_grid: "w-full",
  button_previous: "p-1",
  button_next: "p-1",
}}

主な変更をまとめると:

v9(deprecated) v10
day_selected selected
day_disabled disabled
day_today today
day_range_start range_start
day_range_end range_end
day_range_middle range_middle
table month_grid
tbody weeks
head_cell weekday
cell day
day day_button
nav_button button_previous / button_next

shadcn/ui ユーザーは shadcn-ui/ui#10441 も確認しておくとよい。


変更点⑤ 非グレゴリオ暦が別パッケージに分離された

ペルシャ暦・ヒジュラ暦・仏暦・エチオピア暦・ヘブライ暦を使っている場合、別途インストールが必要になった。

# ❌ v9 まで
import { DayPicker } from 'react-day-picker/persian';

# ✅ v10 以降
npm install @daypicker/persian
import { DayPicker } from '@daypicker/persian';

日本語ロケールのみであれば影響なし。


実際の移行コード(範囲選択の例)

UI Memo で使っていた日付範囲ピッカーの移行を例として示す。

Before(v9)

'use client';
import { DayPicker, type DateRange } from 'react-day-picker';
import 'react-day-picker/style.css';
import { useState } from 'react';
import { ja } from 'date-fns/locale';

export function DateRangePickerDemo() {
  const [range, setRange] = useState<DateRange | undefined>({
    from: new Date(),
    to: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),
  });

  return (
    <DayPicker
      mode="range"
      selected={range}
      onSelect={setRange}
      locale={ja}
      numberOfMonths={2}
    />
  );
}

After(v10)

'use client';
import { DayPicker, type DateRange } from '@daypicker/react';
import '@daypicker/react/style.css';
import { useState } from 'react';
import { ja } from '@daypicker/react/locale';

export function DateRangePickerDemo() {
  const [range, setRange] = useState<DateRange | undefined>({
    from: new Date(),
    to: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),
  });

  return (
    <DayPicker
      mode="range"
      selected={range}
      onSelect={setRange}
      locale={ja}
      numberOfMonths={2}
    />
  );
}

この例では import の3行だけ が変更箇所。mode="range"selected / onSelect といったコア API は v10 でも変わっていないので、v9 の推奨 API を使っていればコンポーネント本体はそのまま動く。


移行チェックリスト

移行時にやることをリストにしておく。

# 1. deprecated API の使用箇所を洗い出す
grep -rn "react-day-picker" --include="*.tsx" --include="*.ts"
grep -rn "fromDate\|toDate\|fromMonth\|toMonth\|fromYear\|toYear\|initialFocus" --include="*.tsx"
grep -rn "day_selected\|day_range_start\|day_range_end\|nav_button" --include="*.tsx"

# 2. パッケージを入れ替える
npm uninstall react-day-picker
npm install @daypicker/react

# 3. import を一括置換する
# "react-day-picker" → "@daypicker/react"
# "react-day-picker/style.css" → "@daypicker/react/style.css"

# 4. ビルドして確認
npm run build

まとめ

v10 は「壊す」アップデートではなく「片付ける」アップデートだ。v9 で deprecated 警告を無視していた箇所が一気にコンパイルエラーになるが、やることは明確。

  • パッケージ名react-day-picker@daypicker/react
  • localedate-fns/locale@daypicker/react/locale(推奨)
  • propsfromDate / toDatestartMonth / endMonth など
  • classNamesday_selectedselected など

v9 の推奨 API をすでに使っていれば、移行作業はほぼ import の書き換えで終わる。

各ライブラリの実際のデモは UI Memo で確認できる。react-datepicker・Mantine DatePicker との比較形式で掲載しているので、日付ピッカーの選定にも活用してほしい。

日付範囲ピッカー ライブラリ比較 | UI Memo


この記事を書いたKは、UI Memo というUIコンポーネント実装リファレンスサイトを運営しています。ライブラリの比較・デモ・コードスニペットを中心にまとめているので、ぜひ覗いてみてください。

Discussion