先看一段代码
import React from 'react'
class Input extends React.Component {
state = {
value: ''
}
onChange = (e) => {
// this.setState({value: e.target.value})
this.setState(prev => ({...prev, value: e.target.value}))
}
render() {
return <input value={this.state.value} onChange={this.onChange}/>
}
}
export default Input
上面的代码看似没有问题,但是注意到setState传入了一个方法,而不是注释里面直接传值,于是你放心的操作,结果报错了
发生了什么,为什么
e.target.value没有值了??
Why?
首先咱们要清楚两个概念
setState是异步的react的事件是合成事件,是存放在事件池(一个放对象的地方,为了节省内存,使用完会销毁)
原因
setState直接传值,react更新机制会保存这个临时值,等到更新是将所有值合并,而函数则会在更新时去执行获取返回值,这个过程是异步的,也就是你去执行函数时,其实是已经过了一段时间,react的合成事件在使用完就会立刻销毁掉,你这时候去拿到的当然没有值。
解决方法
setState不传入函数,直接传值
onChange = (e) => {
this.setState({value: e.target.value})
}
- 使用
event.persist(),这样react处理时会一直保存这个事件,而不会销毁
onChange = (e) => {
e.persist()
this.setState(prev => ({...prev, value: e.target.value}))
}