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

如何将React Calendar选中的日期值传递给其他组件?

实现方案

方案1:状态提升(推荐)

预约按钮和Booking组件归属同一个父组件,将日期状态放到父组件管理是最直接的方式,父子组件都可以直接访问该状态:

第一步:修改父组件代码

假设你的父组件是ReservationContainer,代码如下:

import { useState } from 'react';
import Booking from './Booking';
import axios from 'axios';

function ReservationContainer() {
  // 将日期状态提到父组件统一管理
  const [selectedDate, setSelectedDate] = useState(new Date());

  // 预约按钮点击触发的请求方法
  const handleSubmitReservation = async () => {
    try {
      // 发起请求时直接使用selectedDate即可
      const res = await axios.post('/你的预订接口地址', {
        date: selectedDate,
        // 补充其他需要的请求参数
      });
      // 请求成功后的业务逻辑
      console.log('预约成功', res);
    } catch (err) {
      console.error('预约失败', err);
    }
  }

  return (
    <div>
      {/* 把状态和修改方法传给Booking组件 */}
      <Booking selectedDate={selectedDate} onDateChange={setSelectedDate} />
      {/* 你的预约按钮 */}
      <button onClick={handleSubmitReservation}>提交预约</button>
    </div>
  )
}

export default ReservationContainer;

第二步:修改Booking组件代码,适配父组件传的props

function Booking({ selectedDate, onDateChange }) {
  const disabledDates = [
    new Date(2021, 8, 13),
    new Date(2021, 8, 16),
  ];
  console.log(selectedDate);
  
  return (
    <div className="App">
      <Calendar
          onChange={onDateChange}
          value={selectedDate}
          maxDetail="month"
          minDetail="month"
          tileDisabled={({date, view}) =>
          (view === 'month') && // 仅禁用月视图下的日期瓦片
          disabledDates.some(disabledDate =>
            (date.getFullYear() === disabledDate.getFullYear() &&
            date.getMonth() === disabledDate.getMonth() &&
            date.getDate() === disabledDate.getDate()) 
          )}
      />
    </div>
  );
}
export default Booking;

方案2:子组件通过回调传值(无需改动原有状态位置)

如果你不想把状态迁移到父组件,也可以给Booking组件新增回调props,每次日期变化时将值同步给父组件存储:

第一步:修改Booking组件,新增回调触发逻辑

function Booking({ onDateUpdate }) {
  const [value, onChange] = useState(new Date());
  const disabledDates = [
    new Date(2021, 8, 13),
    new Date(2021, 8, 16),
  ];

  // 日期变化时同时更新本地状态+通知父组件
  const handleDateChange = (newDate) => {
    onChange(newDate);
    onDateUpdate?.(newDate);
  }

  console.log(value);
  
  return (
    <div className="App">
      <Calendar
          onChange={handleDateChange}
          value={value}
          maxDetail="month"
          minDetail="month"
          tileDisabled={({date, view}) =>
          (view === 'month') && // 仅禁用月视图下的日期瓦片
          disabledDates.some(disabledDate =>
            (date.getFullYear() === disabledDate.getFullYear() &&
            date.getMonth() === disabledDate.getMonth() &&
            date.getDate() === disabledDate.getDate()) 
          )}
      />
    </div>
  );
}
export default Booking;

第二步:父组件接收值并存储

import { useState } from 'react';
import Booking from './Booking';
import axios from 'axios';

function ReservationContainer() {
  const [selectedDate, setSelectedDate] = useState(new Date());

  const handleSubmitReservation = async () => {
    // 直接用存储的selectedDate发起请求
    await axios.post('/你的预订接口地址', { date: selectedDate });
  }

  return (
    <div>
      <Booking onDateUpdate={setSelectedDate} />
      <button onClick={handleSubmitReservation}>提交预约</button>
    </div>
  )
}

内容的提问来源于stack exchange,提问作者John Shelby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:30:03