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

React中修改起止时间及新增行自动设置开始时间方案

修改后的React代码实现

以下是修复并匹配样式的代码,解决了时间计算错误,同时实现了表格化的布局:

import React, { useState } from 'react';

// 基础样式,匹配表格边框效果
const styles = {
  table: {
    borderCollapse: 'collapse',
    width: '100%',
    marginTop: '10px'
  },
  th: {
    border: '1px solid #ccc',
    padding: '8px',
    textAlign: 'left',
    backgroundColor: '#f0f0f0'
  },
  td: {
    border: '1px solid #ccc',
    padding: '8px'
  },
  input: {
    padding: '6px',
    width: '100%',
    boxSizing: 'border-box'
  },
  button: {
    padding: '6px 12px',
    cursor: 'pointer'
  }
};

const TimeInputRow = ({ data, onFieldChange, onAddRow, isLastRow }) => {
  const { date, startTime, endTime, name, address } = data;

  return (
    <tr>
      <td style={styles.td}>
        <input 
          type="date" 
          value={date} 
          onChange={(e) => onFieldChange('date', e.target.value)}
          style={styles.input}
        />
      </td>
      <td style={styles.td}>
        <input 
          type="time" 
          value={startTime} 
          onChange={(e) => onFieldChange('startTime', e.target.value)}
          style={styles.input}
        />
      </td>
      <td style={styles.td}>
        <input 
          type="time" 
          value={endTime} 
          onChange={(e) => onFieldChange('endTime', e.target.value)}
          style={styles.input}
        />
      </td>
      <td style={styles.td}>
        <input 
          type="text" 
          placeholder="Name" 
          value={name} 
          onChange={(e) => onFieldChange('name', e.target.value)}
          style={styles.input}
        />
      </td>
      <td style={styles.td}>
        <input 
          type="text" 
          placeholder="Address" 
          value={address} 
          onChange={(e) => onFieldChange('address', e.target.value)}
          style={styles.input}
        />
      </td>
      {isLastRow && (
        <td style={styles.td}>
          <button onClick={onAddRow} style={styles.button}>Add Row</button>
        </td>
      )}
    </tr>
  );
};

const Apdemo = () => {
  const [rows, setRows] = useState([
    { date: '2023-01-01', startTime: '00:00:00', endTime: '00:00:00', name: 'John Doe', address: '123 Main St' }
  ]);

  const handleFieldChange = (index, field, value) => {
    const newRows = [...rows];
    newRows[index][field] = value;
    setRows(newRows);
  };

  // 计算时间加1小时,返回{date: string, time: string}
  const addOneHourToTime = (baseDate, baseTime) => {
    const dateObj = new Date(`${baseDate}T${baseTime}`);
    dateObj.setHours(dateObj.getHours() + 1);
    
    return {
      newDate: dateObj.toISOString().split('T')[0],
      newTime: dateObj.toTimeString().split(' ')[0]
    };
  };

  const handleAddRow = () => {
    const lastRow = rows[rows.length - 1];
    const { newDate, newTime } = addOneHourToTime(lastRow.date, lastRow.startTime);
    
    const newRow = {
      date: newDate,
      startTime: newTime,
      endTime: lastRow.endTime,
      name: lastRow.name,
      address: lastRow.address
    };

    setRows([...rows, newRow]);
  };

  return (
    <div>
      <table style={styles.table}>
        <thead>
          <tr>
            <th style={styles.th}>Date</th>
            <th style={styles.th}>Start Time</th>
            <th style={styles.th}>End Time</th>
            <th style={styles.th}>Name</th>
            <th style={styles.th}>Address</th>
            <th style={styles.th}>Action</th>
          </tr>
        </thead>
        <tbody>
          {rows.map((data, index) => (
            <TimeInputRow
              key={index}
              data={data}
              onFieldChange={(field, value) => handleFieldChange(index, field, value)}
              onAddRow={handleAddRow}
              isLastRow={index === rows.length - 1}
            />
          ))}
        </tbody>
      </table>
    </div>
  );
};

export default Apdemo;

关键修改说明

  • 布局调整:改用HTML表格实现带边框的规整布局,匹配目标样式
  • 时间输入优化:将时间输入框改为type="time",原生支持时间选择,无需手动正则验证
  • 时间计算修复:新增addOneHourToTime函数,正确解析时间字符串并添加1小时,自动处理跨天的日期变更
  • 按钮逻辑优化:仅在最后一行显示Add Row按钮,避免重复按钮干扰操作
  • 样式优化:添加内联样式实现表格边框、内边距等基础样式,还原目标视觉效果

内容的提问来源于stack exchange,提问作者Siva MCA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:00:00