当前位置: 首页 > 知识库问答 >
问题:

React-DatePicker使用先前选择的日期更新状态

马国源
2023-03-14

我想在从React DatePicker中选择日期时更新组件的状态。我下面有一些奇怪的行为。

当前行为的例子:

>

  • 带有空日期字段的组件加载
  • 我选择2017年3月28日并获得以下控制台日志

    主要的ffde8a1f。js:8它改变了日期

    main.ffde8a1f.js: 8日期=1490673600000

    主要的ffde8a1f。js:8 dueDate值=

    假设我选择2017年3月22日并获得以下控制台日志:

    主要的ffde8a1f。js:8它改变了日期

    主要的ffde8a1f。js:8日期=1490155200000

    main.ffde8a1f.js:8 dueDate值=1490673600000

    第二个和第三个日志应具有相同的值。有人能解释一下为什么会发生这种奇怪的行为吗?

    我的尝试

    进口

    import React from 'react';
    import DatePicker from 'react-datepicker';
    import moment from 'moment';
    import 'react-datepicker/dist/react-datepicker.css';
    

    组件

    我设置dueDate的状态为"开始。

    export default class Request extends React.Component {
    
      constructor(props) {
        super(props);
        this.state = {
          dueDate: '',
        }
    
        this.handleChangeDate = this.handleChangeDate.bind(this);
    
      }
    

    处理日期选择

    ISSUE我的handleChangeDate函数将在提供日期时触发,并且以毫秒为单位的日期将登录到控制台,但是dueDate被记录为它应该是的前一个值。

     handleChangeDate(date) {
        console.log("it changed dates");
        console.log('date = ' + date);  //date in milliseconds logs properly
        this.setState({
          dueDate: date
        });
        console.log('dueDate value = ' + this.state.dueDate);  //date from state logs the previous value rather than its new value
      }
    

    Render
    目前,我正在简化日期选择器,以最大限度地减少潜在的错误。只有所选日期从状态和所选日期的handleChangeDate方法传入。

      render() {
        return (
          <div className="requestDetails">
            <h2>Due Date</h2>
            <DatePicker
               selected={this.state.dueDate}
               onChange={this.handleChangeDate}
            />
          </div>
        );
      }
    }
    
  • 共有2个答案

    凌轶
    2023-03-14
    shouldDidUpdate(nextProps, nextState) {
            if (this.state.startDate !== nextState.startDate) {
                return true;
            }
            return true;
        }
    

    用你的日期代替开始日期

    司空炯
    2023-03-14

    this.setState不能保证是同步的,因为它们可以批量处理。这意味着,尽管您在代码中的setState之后调用console.log,但状态实际上可能尚未更改。

    从React文档:

    setState()不会立即对此进行变异。状态,但创建挂起的状态转换。访问这个。调用此方法后的状态可能返回现有值。无法保证对setState调用的同步操作,并且可能会对调用进行批处理以提高性能。

    如果要检查您的状态是否已更新,可以使用回调作为setState的第二个参数,或者在shouldComponentUpdate(nextrops,nextState)生命周期方法中添加一些逻辑。

    示例

    handleChangeDate(date) {
      this.setState({
        dueDate: date
      }, () => console.log(this.state.dueDate)); // This will show the updated state when state is set.
    }
    

    或者

    shouldComponentUpdate(nextProps, nextState) {
      if (this.state.dueDate !== nextState.dueDate) {
        console.log('dueDate:  ', nextState.dueDate);
      }
    }
    

    setState文档:(注意函数签名,setState(nextState,回调)

    https://facebook.github.io/react/docs/react-component.html#setstate

    应更新组件文档:

    https://facebook.github.io/react/docs/react-component.html#shouldcomponentupdate

     类似资料:
    • 日期选择组件。滚动选择交互,基于 Scrollpicker 实现。 Usage 全部引入 import { Datepicker } from 'beeshell'; 按需引入 import Datepicker from 'beeshell/dist/components/Datepicker'; Examples Datepicker 与 BottomModal 组合应用 Code 详细

    • DatePicker 日期选择器 用于选择或输入日期 选择日 以「日」为基本单位,基础的日期选择控件 基本单位由type属性指定。快捷选项需配置picker-options对象中的shortcuts,禁用日期通过 disabledDate 设置,传入函数 <template> <div class="block"> <span class="demonstration">默认</spa

    • 用于选择或输入日期 选择日 以「日」为基本单位,基础的日期选择控件 基本单位由type属性指定。通过shortcuts配置快捷选项,禁用日期通过 disabledDate 设置,传入函数 <template> <div class="block"> <span class="demonstration">默认</span> <el-date-picker v-mod

    • 用于选择或输入日期 选择日 以「日」为基本单位,基础的日期选择控件 你可以在 [model] 中定义一个初始值,如果留空,则优先显示当前时间。 <el-date-picker (modelChange)="handle($event)" (clear-click)="clearClickHandle($event)"> </el-date-picker> <script type="text"

    • datePicker 日期选择或者时间选择 使用方法 AlipayJSBridge.call('datePicker', { beginDate: '2016-10-10', minDate: '2016-10-9', maxDate: '2017-10-9', mode: 1, }, function(e) { alert(JSON.stringify(e)); });

    • 我有一个编辑屏幕,其中在我的开始日期和结束日期是从数据库中预先填充的。该控件是一个UIdatePicker插件。我想根据来自服务器的开始日期限制/禁用以前的日期。此外,当我更改日期时,我希望结束日期从开始日期后的一天开始。由于首先填充值,然后将控件添加到输入字段,因此我无法控制它。 任何帮助都将不胜感激。代码如下: