You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shadcn UI日期选择器onSelect中调用自定义函数并存入useState

实现Shadcn日历选择时调用自定义函数并更新状态

你可以通过自定义onSelect回调函数,同时完成表单状态更新、自定义函数调用以及额外的useState状态存储,具体实现如下:

  1. (可选)声明自定义useState存储日期
    如果需要把选中日期单独存在自己的状态里,先在组件内添加状态声明:
import { useState } from 'react';

// ... 其他组件代码

const [selectedDate, setSelectedDate] = useState<Date | undefined>();
  1. 修改Calendar的onSelect回调
    替换原来的field.onChange为自定义函数,在里面依次处理表单状态更新、自定义状态存储和自定义逻辑:
<Calendar
  mode="single"
  selected={field.value}
  onSelect={(date) => {
    // 1. 先更新react-hook-form的表单字段状态
    field.onChange(date);
    // 2. (可选)把日期存入自定义useState
    setSelectedDate(date);
    // 3. 调用你的自定义函数
    yourCustomDateHandler(date);
  }}
  disabled={(date) =>
    date > new Date() || date < new Date("1900-01-01")
  }
  initialFocus
/>
  1. 定义你的自定义处理函数
    根据业务需求编写自定义逻辑,示例如下:
const yourCustomDateHandler = (date: Date | undefined) => {
  if (!date) return;
  // 这里写你的业务逻辑,比如打印日期、触发接口请求等
  console.log("选中的日期:", date);
};

完整修改后的代码片段

import { useState } from 'react';
import { format } from 'date-fns';
// ... 其他必要导入

// 自定义日期处理函数
const yourCustomDateHandler = (date: Date | undefined) => {
  if (!date) return;
  console.log("选中日期格式化后:", format(date, "EEEE, d MMM yyyy"));
};

// ... 组件其他逻辑

return (
    <Form {...form}>
      <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
        <div className="grid grid-cols-3 gap-6">
          <div className="w-full">
            <FormField
              control={form.control}
              name="date"
              render={({ field }) => (
                <FormItem >
                  <FormLabel>Appointment Date</FormLabel>
                  <Popover>
                    <PopoverTrigger asChild>
                      <FormControl>
                        <Button
                          variant="outline"
                          className={cn(
                            "w-full justify-start text-left font-normal",
                            !field.value && "text-muted-foreground"
                          )}
                        >
                          {field.value ? (
                            format(field.value, "EEEE, d MMM yyyy")
                          ) : (
                            <span>Pick a date</span>
                          )}
                          <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
                        </Button>
                      </FormControl>
                    </PopoverTrigger>
                    <PopoverContent className="w-auto p-0" align="center">
                      <Calendar
                        mode="single"
                        selected={field.value}
                        onSelect={(date) => {
                          field.onChange(date);
                          setSelectedDate(date);
                          yourCustomDateHandler(date);
                        }}
                        disabled={(date) =>
                          date > new Date() || date < new Date("1900-01-01")
                        }
                        initialFocus
                      />
                    </PopoverContent>
                  </Popover>
                  <FormMessage />
                </FormItem>
              )}
            />
          </div>
        <Button type="submit">Submit</Button>
      </form>
    </Form>
  );

说明:field.onChange是react-hook-form提供的表单字段同步方法,需优先调用它保证表单状态的正确性,之后再执行自定义逻辑。

内容的提问来源于stack exchange,提问作者Tharisha Perera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:27:22