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

React应用中如何基于表单首字段填写日期显示截止日期标签?

实现方案

没有专门针对这类需求的现成API,你需要基于React的状态管理和日期处理逻辑自行开发,以下是具体实现思路和代码示例:

一、核心逻辑

  • 用React状态存储用户在表单首个字段输入的日期值
  • 基于该日期,按照业务规则计算对应板块的截止日期
  • 将计算后的截止日期传递给首页卡片组件,实时更新标签显示

二、具体实现步骤

1. 日期计算工具函数

先封装通用的日期处理函数,可根据不同板块的规则调整(比如板块A加7天、板块B加14天):

// 工具函数:计算截止日期(基础版,按自然日累加)
const calculateDeadline = (inputDate, daysToAdd) => {
  if (!inputDate) return null;
  const date = new Date(inputDate);
  date.setDate(date.getDate() + daysToAdd);
  // 格式化为YYYY-MM-DD,可根据业务需求调整
  return date.toISOString().split('T')[0];
};

// 扩展版:仅计算工作日(排除周六周日)
const calculateWorkdayDeadline = (inputDate, workdaysToAdd) => {
  if (!inputDate) return null;
  const date = new Date(inputDate);
  let addedDays = 0;
  while (addedDays < workdaysToAdd) {
    date.setDate(date.getDate() + 1);
    const dayOfWeek = date.getDay();
    // 跳过周六(6)和周日(0)
    if (dayOfWeek !== 0 && dayOfWeek !== 6) {
      addedDays++;
    }
  }
  return date.toISOString().split('T')[0];
};

2. 跨组件状态共享

如果表单和首页卡片属于不同组件层级,用Context API实现状态共享(轻量场景优先):

// 创建日期上下文
import { createContext, useContext, useState } from 'react';

const DateContext = createContext();

export const DateProvider = ({ children }) => {
  const [formStartDate, setFormStartDate] = useState(null);

  return (
    <DateContext.Provider value={{ formStartDate, setFormStartDate }}>
      {children}
    </DateContext.Provider>
  );
};

// 自定义Hook简化调用
export const useDateContext = () => useContext(DateContext);

3. 表单组件更新起始日期

在表单的首个日期字段中,监听输入变化并同步到上下文状态:

import { useDateContext } from './DateContext';

const SecurityInfoForm = () => {
  const { setFormStartDate } = useDateContext();

  const handleStartDateChange = (e) => {
    const inputDate = e.target.value;
    setFormStartDate(inputDate);
    // 其他表单逻辑...
  };

  return (
    <form>
      <label>
        情报提交起始日期:
        <input type="date" onChange={handleStartDateChange} required />
      </label>
      {/* 其他表单字段... */}
    </form>
  );
};

4. 首页卡片组件渲染截止日期

在首页卡片中获取上下文的起始日期,计算并展示对应板块的截止日期:

import { useDateContext } from './DateContext';
import { calculateDeadline } from './dateUtils';

const DashboardCard = ({ title, daysToAdd, linkToForm }) => {
  const { formStartDate } = useDateContext();
  const deadline = calculateDeadline(formStartDate, daysToAdd);

  return (
    <div className="security-card">
      <div className="card-tag">
        截止日期:{deadline || '请先填写起始日期'}
      </div>
      <h3>{title}</h3>
      <a href={linkToForm}>进入表单</a>
      {/* 卡片其他内容... */}
    </div>
  );
};

// 首页组件
const HomePage = () => {
  return (
    <div className="home-container">
      <DashboardCard title="基础情报注册" daysToAdd={7} linkToForm="/form1" />
      <DashboardCard title="高级情报审计" daysToAdd={14} linkToForm="/form2" />
      <DashboardCard title="威胁情报上报" daysToAdd={30} linkToForm="/form3" />
    </div>
  );
};

5. 全局注入上下文

在应用入口文件中包裹DateProvider,确保所有组件能访问状态:

import { DateProvider } from './DateContext';
import HomePage from './HomePage';
import SecurityInfoForm from './SecurityInfoForm';

function App() {
  return (
    <DateProvider>
      <HomePage />
      {/* 路由或其他组件... */}
      <SecurityInfoForm />
    </DateProvider>
  );
}

三、注意事项

  • 可根据业务需求调整日期计算规则(比如按月累加、排除法定节假日等,后者需要维护节假日列表)
  • 确保日期格式在不同浏览器中兼容,input[type="date"]返回的是标准ISO格式字符串
  • 如果项目已使用Redux等状态管理库,可直接复用现有状态逻辑替代Context API

内容的提问来源于stack exchange,提问作者Miracle Okoi-Obuli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:12:34