javascript - 在 React setState 函数中使用 e.target.value 的问题
问题描述
我在 React 中遇到了一个奇怪的问题。我想我可能还没有完全掌握 React 是如何工作的,我非常感谢你的帮助。
请在下面找到我的 React 组件:
class myComponent extends Component {
state = {
value: ''
}
updateValue = e => {
this.setState({
value: e.target.value
})
}
render() {
return (
<form>
<input type="text" onChange={this.updateValue} defaultValue={this.state.value} />
</form>
)
}
}
然后,现在如果我在文本字段中输入内容,我将收到以下警告和错误:
警告:出于性能原因,此合成事件被重用。如果您看到这一点,则表示您正在访问已target
发布/无效合成事件的属性。这设置为空。如果您必须保留原始合成事件,请使用 event.persist()。
未捕获的类型错误:无法读取 null 的属性“值”
但是,如果我将“updateValue”方法更改为:
updateValue = e => {
const newValue = e.target.value
this.setState({
value: newValue
})
}
它将毫无问题地工作。
解决方案
更新的答案
正如@FelixKling 指出的那样,我的回答并不完全正确。我的回答仅在您将函数作为参数传递给 时才有效,而不是像在问题中那样setState
传递对象时才有效。
如果将对象传递给setState
,则将立即评估参数,即在事件被取消之前。因此,不会发生上述错误。
如果您将函数传递给setState
,则将在该函数内评估参数,这发生在updateValue
完成/返回并且事件已被取消之后。如果将函数传递给setState
,则必须在 之前将 存储e.target.value
在变量(或调用e.persist()
)中setState
。
旧(略有错误)答案
发生此问题的原因是(如错误消息所述)回调(您的updateValue
函数)完成时事件设置为 null。
因为this.setState()
是异步函数,所以不会立即执行。结果,this.setState()
实际上是在你updateValue
完成之后执行,因此在事件被取消之后。
您的解决方案实际上是 React 文档中提出的方法!
推荐阅读
- python - 在 discord.py 中将引号作为参数传递时出现错误
- mongodb - 我在运行命令 mongo 时遇到了这个问题,因为我已经为 windows X64 下载了 mongodb 的 zip 文件
- c# - 如何将列表视图中的绑定值传递给函数?C# UWP
- python - Python - 如何按第一个和第二个键值对字典进行排序?
- android - AndroidX 迁移后应用程序崩溃(数据绑定错误)
- python-3.x - 如何交换两行 Pandas DataFrame?
- java - 在 Android Studio 中使用 Java 调用 setPlaybackParams() 时如何防止 MediaPlayer 启动?
- python - 图表 x 轴上的单位没有相同的比例
- javascript - 在javascript中将数组A的键和值添加到数组B
- php - 为什么我不能将新的文本框值保存到 txt?