【问题标题】:How to clear the value entered in react-datetime?如何清除在 react-datetime 中输入的值?
【发布时间】:2018-02-13 15:28:58
【问题描述】:

我正在为我们的日历控件使用 react-datetime。现在问题是 如果用户输入了一个无效的日期,比如“djfdjfhjkhdf”,那么在 这个控件没有什么可以验证的。所以我决定自己写 验证函数,如果日期无效,则在模糊事件上调用它 然后清除用户输入的文本。我的代码是这样的:-

import DatePicker from 'react-datetime';

focousOut(value) {
if (!validateDate(value)) {
  this.setState({ startDate:  ''});
  this.setState({ selectedValue: '' });
 }
}
handleChange(date) {
 this.setState({ selectedValue: date });
 this.setState({ startDate: date });
}

<Datetime
  timeFormat={false}
  value={this.state.selectedValue}
  defaultValue={this.state.startDate}
  onChange={this.handleChange}
  onBlur={this.focousOut}
  locale='en-US'
  dateFormat
  closeOnSelect
/>

【问题讨论】:

  • 您是否尝试过将this.state.selectedValue 设置为空字符串?
  • @bennygenel 我试过了,但没有用,我在上面的问题中修改了我的焦点功能。仍然没有用。
  • 当日期无效但不知道如何清除所有输入时,您可以将日期设置为今天或其他默认日期。
  • 顺便说一句,你不需要使用多个setState。例如,只需:this.setState({startDate: '', selectedValue: ''});
  • @Chris 是的,不需要设置多个 setState,我同意了,但它不会解决上述情况。

标签: reactjs react-datetime


【解决方案1】:

是的,如果您尝试在受控组件模式下传递 nullempty 值,则组件中显然存在渲染错误:内部输入仍然输入以前的值使用日历(不受控制?)尽管 that.state.value 是 null :我已经能够使用 renderInput 道具“修补”它:

<Datetime
   value={(this.state.date) ? this.state.date : ''} 
   onChange={(value) => { this.setState{(date : ((value) && (isNaN(new Date(value)) === false)) ? new Date(value)).format('yyyy-mm-dd')  null, attribute) }} 
   renderInput={(props) => {
       return <input {...props} value={(this.state.date) ? props.value : ''} />
   }}
/>
                                                

【讨论】:

  • 非常感谢!!!!我遇到了同样的错误,你的回答拯救了我的夜晚......
  • 这似乎仍然是这种情况,如果您将值绑定到状态,然后将其作为 null 或空字符串,它不会将字段呈现为空,除非您将 renderInput 定义为好吧,这有点不幸。
【解决方案2】:

其中一个问题似乎是,基于给定的道具,您正在创建 受控不受控 Datetime 组件的混合。基本上,如果你想要一个状态控制的组件,请使用 value,或者使用 defaultValue 让 DOM 管理输入值。

参见文档的this part

- 表示组件选择的日期,以便将其用作controlled component。这个 prop 由 Moment.js 解析,因此可以使用日期 stringmoment 对象。

defaultValue - 表示组件选择的日期以将其用作uncontrolled component。这个 prop 由 Moment.js 解析,因此可以使用日期 stringmoment 对象。


看看我做的这个forked codepen

var date = new Date();

class App extends React.Component {
  constructor() {
    super();
    this.state = {selectedValue: ''};
    this.focousOut = this.focousOut.bind(this);
    this.handleChange = this.handleChange.bind(this);
  }
  
  focousOut(value) {
    if(!moment(value).isValid()) {
     this.setState({selectedValue: ''}); 
    }
  }
  
  handleChange(date) {
   this.setState({ selectedValue: date });
  }

  render() {
    return (
       <Datetime
         timeFormat={false}
         value={this.state.selectedValue}
         onChange={this.handleChange}
         onBlur={this.focousOut}
         locale='en-US'
         dateFormat
         closeOnSelect
       />
    );
  }
}

React.render(<App />, document.body);

此外,您可以使用moment.js 库轻松确定字符串是否为有效的日期格式。只需使用moment().isValid()

我应该注意到onBlur 事件似乎在第二次模糊时触发。不知道为什么会这样,但也许你会在文档中找到答案。以上只是对您现有代码的修复,希望是帮助您入门的有用指南。

【讨论】:

  • 顺便说一下,是"focus",而不是"focus"。 ;)
  • 是的,它应该是焦点,但仍然没有清除无效日期。我认为在此控件中无法清除选定或输入的值。
  • 我尝试使用您在上面添加的分叉代码笔,但它没有清除该值。您可以通过编写 djfhdjhf 来检查它并从控制中集中注意力。现在它应该清除该值,但该值保持不变
  • @jack123,是的,就像我说的。出于某种原因,它会在您第二次模糊时清除。再试一次,但这次集中并模糊几次。
  • 我认为这个控件的选项有限,我们不能这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2018-03-14
  • 1970-01-01
相关资源
最近更新 更多