开发者问题收集

未捕获的 RangeError:react-DatePicker 上的时间值无效

2021-08-09
1808

我有一个 React 组件作为 Form ,它有一些 文本输入 和一个 DatePicker 控件。我使用 react-bootstrap-table-next 库在表格上显示输入,该库无法直接从 DatePicker 显示 date ,我需要先转换为 JSON.parse(JSON.stringify(dueDate) ,然后转换为 moment(dueDate).format("yyyy-MM-DD"); 才能显示。但是,当我尝试编辑日期时,此转换会产生问题。我必须将日期发回,因为 DatePicker 无法呈现。这就是发生错误 ( Uncaught RangeError: Invalid time value ) 的地方。

Form 组件:仅提供代码的所需部分

const Form = ({
    ...
    dueDate, 
    setDueDate
}) => {

const updateTodo = (dueDate, id, completed) => {
    const newTodo = todos.map(
        (todo) =>todo.id === id ? 
            {dueDate, id, completed} :
                todo);
    setTodos(newTodo);
    setEditTodo("");
};

useEffect(() => {
    if(editTodo) {
        ...
        setDueDate(editTodo.dueDate);
    } else {
        setDueDate(new Date());
    }

}, [setDueDate, editTodo]);

...
...

const onDueDateChange = (date) => {
    setDueDate(moment(date).toDate());
  }

const onFormSubmit = (event) => {
    event.preventDefault();
    if(!editTodo) {
        setTodos([...todos, {id: uuidv4(), 
                      dueDate: JSON.parse(JSON.stringify(dueDate)),  <<<<<<<<<conversion 
                    completed: false}]);
        ...
        setDueDate(new Date());
    } else {
        updateTodo(dueDate, editTodo.id, editTodo.completed);
    }

}      
    return (
    <form onSubmit={onFormSubmit}>
        ...
        ...
        <DatePicker
            className="datePicker"
            selected={dueDate}
            onChange={onDueDateChange}
            name="dueDate"
            dateFormat="yyyy-MM-dd"
          />              
         ...
         ...
    </form>
    );
};

export default Form;

ToDoList 组件:这会将输入呈现在表格

const TodosList = ({
    todos,
    setTodos, 
    setEditTodo
}) => {
    ...     
    const handleEdit = ({id}) => {
        const findTodo = todos.find((todo) => todo.id === id);
        setEditTodo(findTodo);
    }
    ...
      const editBtn = (cell, row, rowIndex) => {
        return (
            <button className="button-edit task-button" 
            onClick={() => handleEdit(row)}>
            <i className="fa fa-edit"></i>
        </button>
        );
      };

      ...
      const formatDate = (cell, row) => {
        return moment(row.dueDate).format("yyyy-MM-DD");
          
      }

    const columns = [
        { dataField: 'dueDate', text: 'Due Date', formatter:formatDate },
        { dataField: '', text: 'Edit',  formatter: editBtn },
      ];
  
    return (
        <div>
            ...
                <BootstrapTable 
                    bootstrap4
                    keyField='id' 
                    data={todos} 
                    columns={columns}
                />
              ...           
    </div>
    );
};

export default TodosList;

转换之前, DatePicker 捕获的日期为 Mon Aug 09 2021 08:45:30 GMT+0200 (Central European Summer Time) 格式。而我尝试编辑的日期被捕获为 2021-08-19T21:34:24.000Z 。我猜问题就在这里。

已尝试 ,因为 DatePicker 仅接受 Date 作为输入。我尝试使用 moment(dueDate).toDate() 重新转换它,但这似乎不起作用,因为无法确定 Form 组件中需要再次重新转换的具体位置。

1个回答

找到应用解决方案的位置:

当状态更新时,需要进行重新转换。重新转换是将日期再次转换为 Date 格式。

useEffect(() => {
if(editTodo) {
    setDueDate(moment(editTodo.dueDate).toDate()); <<<<<<<< this is the solution
} else {
    setDueDate(new Date());
}

}, [setTitle, setDescription, setDueDate, editTodo]);

PineCone
2021-08-09