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

React Typescript中子日期组件向父传值及自定义区间选择问题

解决方案

1. 父子组件通信问题修复

你需要通过props传递回调函数的方式实现子组件向父组件传值:

  • 父组件内部定义存储选中日期的状态,同时把修改状态的方法作为props传给子日期组件
  • 子组件内部在选中值发生变化时,调用该回调函数把选中的日期数据传递回父组件

修改后的父组件代码:

import { useState } from 'react';
import DateComponent from './DateComponent';

export default function App() {
  // 支持存储普通日期选项、自定义起止日期两种格式的选中值
  const [chosenDate, setChosenDate] = useState<string | {startDate: Date | null, endDate: Date | null}>('');
  return (
    <div>
      {/* 传递更新方法给子组件 */}
      <DateComponent onDateChange={setChosenDate} />
      <div>Your chosen date was: {JSON.stringify(chosenDate)}</div>
    </div>
  );
}

2. 自定义起止日期无法独立选择问题修复

你当前两个日期选择器绑定了同一个selectedDate状态,所以修改任意一个都会同步更新另一个,需要拆分两个独立状态分别绑定起止日期:

  • 子组件新增startDate、endDate两个状态,分别对应开始、结束日期选择器
  • 两个日期选择器的value、onChange分别绑定对应状态和状态更新方法
  • 日期变化时调用父组件传过来的回调,把最新的起止日期同步给父组件

修改后的子组件核心代码:

import { useState } from 'react';
// 定义子组件props类型
interface DateComponentProps {
  onDateChange: (val: string | {startDate: Date | null, endDate: Date | null}) => void
}

const DateComponent = ({ onDateChange }: DateComponentProps) => {
  // 原有其他状态省略(selectedOption、options等)
  const [startDate, setStartDate] = useState<Date | null>(null);
  const [endDate, setEndDate] = useState<Date | null>(null);

  const handleChange = (option) => {
    setSelectedOption(option);
    // 非自定义选项直接把选中值传给父组件
    if(option.value !== DateValueEnum.Custom) {
      onDateChange(option.value);
    }
  }

  return (
    <MuiPickersUtilsProvider utils={DateFnsUtils}>
      <div className="App">
        <div>
          <ReactSelect
            value={selectedOption as ValueType<OptionType>}
            onChange={(option) => handleChange(option)}
            isMulti={false}
            options={options}
          />

          {selectedOption === DateValueEnum.Custom ? (
            <div style={{ display: "flex" }}>
              <div style={{ width: "50%", float: "left", paddingRight: "5px" }}>
                <DatePicker
                  fullWidth
                  margin="normal"
                  required={true}
                  error={false}
                  invalidLabel={"Several values..."}
                  value={startDate}
                  onChange={(newDate) => {
                    setStartDate(newDate);
                    // 同步最新的起止日期到父组件
                    onDateChange({ startDate: newDate, endDate });
                  }}
                  format="MM/dd/yyyy"
                />
              </div>
              <DatePicker
                fullWidth
                margin="normal"
                required={true}
                error={false}
                invalidLabel={"Several values..."}
                value={endDate}
                onChange={(newDate) => {
                  setEndDate(newDate);
                  onDateChange({ startDate, endDate: newDate });
                }}
                format="MM/dd/yyyy"
              />
            </div>
          ) : null}
        </div>
      </div>
    </MuiPickersUtilsProvider>
  );
};

内容的提问来源于stack exchange,提问作者Catarina Nogueira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:39:03