React 不能为空日期时间本地输入字段

React can't null datetime-local input field

我正在使用 react 和 react-semantic-ui 并且我有以下输入类型:

<Input 
onChange={e => this.onTextInputChange(e, 'date')}
value={this.state.searchQuery.date}
type='datetime-local'/>

onTextInputChange 函数将输入值设置为状态字段,并将此输入的值绑定到此字段。此外,我的应用程序中还有一个额外的按钮,负责清除表单字段(通过在每个状态字段上设置 null)。

state = {
  searchQuery: {
     date: null
 }
}

Clear 对于其他字段效果很好,但是当我触摸 datetime-local 输入时出现问题。当我填写日期的某些部分时,当我点击清除按钮时收到此消息。

我只有在提供完整日期后才能清除此字段。我知道我可以通过在清除期间将此字段的值设置为空白字符串 ' ' 来解决此问题,但这不是最佳解决方案,因为稍后我必须过滤掉这些字段。我什至在玩 react ref,但不幸的是我没有取得任何积极的结果,而且,悬停时出现的蓝色十字会清除表格。任何提示我如何以漂亮的方式处理它?

编辑 #1: event.preventDefault 帮助我摆脱了这个验证消息,但无论如何输入仍然没有清除值。

您需要将 this.state.searchQuery.date 的值设置为空字符串而不是 null。在日期类型的输入中,value={null} 不是有效的 here。这是解决这个问题的唯一方法。如果您特别需要 null 值,则需要将空字符串解析为 null 以避免必须进行过滤。

Value: A DOMString representing a date in YYYY-MM-DD format, or empty

关于蓝色清除按钮,webkit 有一个伪元素 input[type="date"]::-webkit-clear-button 允许您根据需要设置样式。然而,自己实现一个清除按钮非常简单,因为并非所有浏览器都支持通过 CSS 设置按钮样式。

不知何故我找到了处理它的方法。

我在构造函数中做了Ref

...
 dateRef: any;

  constructor(props: Readonly<Properties>) {
    super(props);

    this.dateRef = React.createRef();
  }
...

为我的输入分配了参考:

<Input
...
type='datetime-local'/
ref={this.dateRef}
...
/>

在 clearForm 方法中,我在 UI 上设置了 '',在状态中设置了空值。

  private clearForm = (event: React.FormEvent): void => {
    event.preventDefault();
    this.date.current.inputRef.current.value = '';
    this.setState({searchQuery: EMPTY_SEARCH_QUERY});
  }

此外,我通过访问 this.dateRef.current.inputRef.current.validity.valid

来防止输入无效时进行搜索

也许这个解决方案不是最好的,但它确实有效。