我想在React中使用介于受控和不受控组件之间的东西

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想在React中使用介于受控和不受控组件之间的东西相关的知识,希望对你有一定的参考价值。

我在React中有一个输入字段。

<input 
    type = "number"
    value = {this.props.answer || undefined}
    onKeyUp = {(e) => (e.keyCode === 13) ? onAnswer(e.target.value) : false }
/>

这样它的行为就像我需要它的行为一样。

  • 如果没有 this.props.answer 输入中没有初始值。
  • 用户可以输入任何数字。任何事情都不会发生在 onChange
  • 一旦用户按下Enter键,状态就会发生变化(在 onAnswer 函数)。) 在这之后,输入字段的值将保持在 this.props.answer 而用户不能再更改该值。

但是当用户按下Enter键时,我得到了这个警告。

一个组件正在改变一个不受控制的输入,输入的类型是要控制的数字。

我读了关于不受控组件的文章,我试了一下。

<input 
    type = "number"
    defaultValue = {this.props.answer || undefined}
    ref={this.input}
    onKeyUp = {(e) => (e.keyCode === 13) ? onAnswer(e.target.value) : false }
/>

这样我就不会收到警告,但用户按回车键后,输入字段仍然可以编辑。我还尝试了使用 valuedefaultValue 属性,但我又得到同样的警告。

我希望输入字段是受控制的,但我不想改变输入字段的状态。onChange 但只有当用户按下Enter键时才会出现 (onKeyUp). 在这之后,用户应该无法编辑输入。有没有办法实现这种行为?

UPDATE: 我不知道我可以在输入框中设置 readOnly 根据状态来设置输入的属性。在设置状态后将其设置为false就解决了我的问题。

答案

你可以在keyUp事件处理程序中防止输入被编辑。

onKeyUp = (e) => {
   // Check if we still accept typing
   if (no_more_typing) return e.preventDefault();
   // Handle enter key
   if (e.keyCode === 13) onAnswer(e.target.value);
}

<input
  onKeyUp={onKeyUp} ...

以上是关于我想在React中使用介于受控和不受控组件之间的东西的主要内容,如果未能解决你的问题,请参考以下文章

[React 基础系列] 受控表单 vs 不受控表单

受控组件与不受控制的组件有什么区别?

在 React 中更改受控输入的值

React 组件中的事件处理组件(受控非受控)函数柯里化

react——非受控组件和非受控组件的应用

浅谈react受控组件与非受控组件