在我的组件中,我渲染此文本区域:
<textarea id="descript" rows="8" value={this.state.description} />
,我惊讶地发现我无法输入。经过一些实验,我发现我正在输入它,但是每当我在状态变量中键入一个字符时,react只是重置该值。因此,通过添加此onChange,我可以输入它了:
<textarea id="descript" rows="8" value={this.state.description}
onChange={() => {this.textChanged();}} />
这是处理程序:
textChanged(event) {
var newDesc = document.getElementById('descript').value;
this.setState({'description':newDesc});
}
这行得通,但这是让React不做任何事情的一种非常昂贵的方法。有没有更好/正确的方法来解决这个问题,而这只会让我编辑文本区域?例如,对于表单中的输入字段,我只使用defaultValue,但是我需要这一行是多行。
答案 0 :(得分:5)
您尝试的方式还可以。只需稍作调整。试试这个:
<textarea
id="descript"
rows="8"
value={this.state.description}
onChange={this.textChanged}
/>
textChanged(event) {
this.setState({
description: event.target.value
});
}
不要忘了像这样将函数绑定到构造函数中:
this.textChanged= this.textChanged.bind(this);
当您将其用作受控组件时,状态始终会反映在textarea的值中。
答案 1 :(得分:3)
在React中,这称为controlled-component。由于您将<textarea>
的值设置为this.state.description
,因此<textarea>
将始终反映这一点,从而使React状态成为真理的源头。因此,您还必须处理更改。您可能会成为过早优化的受害者,这通常很快,并且是最佳实践。在React中,应该根据您的状态和道具来预测组件的渲染。
但是,正如Arslan所述,由于您的处理程序收到的event
与普通onChange
处理程序相同,因此一种更简单的方法是将您的状态设置为event.target.value
而不是获取对您的<textarea>
的引用并获得其价值。
答案 2 :(得分:1)
是否有必要将textarea
的内容包含在state
中?
您可以改用另一个变量(或传递给组件的属性):
<textarea id="descript" rows="8" value={description} />
或
<textarea id="descript" rows="8" value={this.props.description} />
然后准备使用onChange
的更新值,而不是textarea
处理程序。
答案 3 :(得分:1)
您将 用作受控组件,其中所保存的值将始终为 this.state.description 。没错,以这种方式使用时,您需要提供一个 onChange 函数,但无需设置id并使用文档API。
您可以在此处了解更多信息:https://reactjs.org/docs/forms.html#controlled-components
您不需要将其用作受控组件。如果您未设置值prop,则可以原样输入。然后,当您希望捕获该值时,可以通过ref或id从textarea元素中读取该值。