React项目中Shadcn Date Picker Range的实现与报错解决
解决“DateRange not found in react-day-picker”错误的完整日期范围选择器实现
错误原因
react-day-picker v8+ 版本中,DateRange 类型已不再直接从主模块导出,类型定义的位置和命名做了调整。
完整解决方案
1. 确认依赖安装
确保已安装所有必要依赖(未安装则执行以下命令):
npm install react-day-picker date-fns npx shadcn-ui@latest add calendar popover button
2. 修正后的完整组件代码
替换你原有的组件代码为以下内容:
import { CalendarIcon } from "@radix-ui/react-icons" import { addDays, format } from "date-fns" import type { Range } from "react-day-picker" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { Calendar } from "@/components/ui/calendar" import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover" export function DatePickerWithRange({ className, }: React.HTMLAttributes<HTMLDivElement>) { const [date, setDate] = React.useState<Range | undefined>({ from: new Date(2022, 0, 20), to: addDays(new Date(2022, 0, 20), 20), }) return ( <div className={cn("grid gap-2", className)}> <Popover> <PopoverTrigger asChild> <Button id="date" variant={"outline"} className={cn( "w-[300px] justify-start text-left font-normal", !date && "text-muted-foreground" )} > <CalendarIcon className="mr-2 h-4 w-4" /> {date?.from ? ( date.to ? ( <> {format(date.from, "LLL dd, y")} -{" "} {format(date.to, "LLL dd, y")} </> ) : ( format(date.from, "LLL dd, y") ) ) : ( <span>Pick a date</span> )} </Button> </PopoverTrigger> <PopoverContent className="w-auto p-0" align="start"> <Calendar initialFocus mode="range" defaultMonth={date?.from} selected={date} onSelect={setDate} numberOfMonths={2} /> </PopoverContent> </Popover> </div> ) }
3. 关键修改说明
- 移除错误的
DateRange导入,替换为react-day-picker v8+内置的Range类型,该类型对应{ from: Date; to: Date } | undefined结构 - 若不想导入
Range类型,也可直接将状态类型定义为{ from: Date; to: Date } | undefined,效果完全一致
4. 组件使用示例
在页面或父组件中引入并使用:
import { DatePickerWithRange } from "@/components/ui/date-picker-range" export default function HomePage() { return ( <div className="p-8"> <h1 className="text-2xl font-bold mb-6">日期范围选择器示例</h1> <DatePickerWithRange /> </div> ) }
内容的提问来源于stack exchange,提问作者Amit kumar Prajapati
相关产品推荐
相关产品推荐

