在this example中,对于受控textarea,它显示了如何设置初始值,然后更新值onChange。当字段首次聚焦时,如何在不清除用户的任何进一步输入的情况下清除此初始值。
设置初始值:
this.state = {
value: 'Please write an essay'
};
我假设你会做类似的事情:
<textarea value={this.state.value} onChange={this.handleChange} onFocus={this.handleFocus} />
然后有:
handleFocus(event) {
this.setState({value: ''});
}
虽然这不起作用。有什么建议?
如果将函数传递给组件(如事件处理程序),则“此”捕获将丢失。当textarea调用您的事件处理程序时,“this”将不会引用定义该函数的组件。我认为它实际上会引用它自己的事件处理函数。
解决这个问题的常用方法是将“this”绑定到事件处理程序:
onFocus={this.onFocus.bind(this)}
如果您使用的是ES7,还可以将方法定义为lambda成员变量:
class MyComponnet {
onFocus = (e) => { ... }
render() {
return <textarea onFocus={this.onFocus} />
}
}
这是有效的,因为js中的lambda会自动捕获它们周围的一切。它看起来有点清洁。
此外,您应该考虑使用占位符属性:https://www.w3schools.com/tags/att_textarea_placeholder.asp
你在bind
函数中错过了handleFocus
你的constructor
方法
this.handleFocus = this.handleFocus.bind(this)