用空白值初始化反应号输入控件?

GN.*_*GN. 7 javascript reactjs

我希望我的受控输入在框中没有任何值的情况下进行初始化。输入是一个数字,因此我不会传递空值''。使用defaultProps,我将输入初始化为null。

在输入中输入时,控制台将报告以下消息:

<MyInput>正在更改要控制的类型编号的不受控制的输入。输入元素不应从不受控制切换为受控制(反之亦然)。

为了防止这种情况,我通常使用一个空字符串进行初始化,以防止发生这种“切换”。但是有一个数字(我不想显示0,我不想显示任何东西)我不确定该怎么做。

static defaultProps = {
    estimatedHours: null,
    estimatedMinutes: null,
  }
Run Code Online (Sandbox Code Playgroud)

默认值^^

<input
   type="number"
   onChange={(e) => this.handleChange('Hours', e.target.value)}
   onKeyDown={this.handleKeyDown}
   onPaste={this.handlePaste}
   value={estimatedHours}
   placeholder={hoursText}
   className="slds-input th-trailmix-textbox th-time-component__input"
/>
Run Code Online (Sandbox Code Playgroud)

Get*_*fty 16

更简单的方法是将后备值设置为空字符串。type=number也适用于。

<input type="number" value={estimatedHours || ''} />
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果“estimatedHours”为“0”,它将回退为空字符串。为了避免这种情况,请使用三元运算符或使用 nullish 合并运算符 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#nullish-coalescing。 (11认同)
  • +1 关于使用 nullish 合并运算符的评论,因为如果一个值以 `null` _or_ `undefined` 开头,您会收到有关不受控制的输入切换为受控制的警告。因此,以下内容效果很好:`value={estimatedHours ?? ''}` (2认同)

Ste*_*fan -1

不受控制的输入只是不value与 JavaScript 绑定的输入。所以如果你正在渲染:

<input value={any} />
Run Code Online (Sandbox Code Playgroud)

这是一个受控输入。

如果你想用空值渲染不受控制的输入,你可以简单地写

<input type="number" /> or <input type="number" placeholder="" />
or <input type="number" placeholder="please enter a number..." />
Run Code Online (Sandbox Code Playgroud)

接下来,如果您想提取该值,请使用引用。

state = {
  query: ''
}

handleSubmit = (e) => {
  e.preventDefault()
  this.setState({ query: this.search.value })
}

render() {
  return (
    <form>
      <input 
        type="number" 
        ref={input => this.search = input} 
        placeholder="" 
      />
      <button type="submit" onClick={this.handleSubmit}>Submit</button>
    </form>
  )
}
Run Code Online (Sandbox Code Playgroud)

此外,如果需要,您仍然可以对返回值执行逻辑。IE:

handleSubmit = (e) => {
  e.preventDefault()
  this.setState({ query: this.search.value.toExponential(2) })
   // square whatever the user inputs and store in this.state.query
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但我的问题是我想要一个带有空/未定义初始值的受控数字输入。 (2认同)