先看一段代碼react
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傳入了一個方法,而不是註釋裏面直接傳值,因而你放心的操做,結果報錯了bash
發生了什麼,爲何
e.target.value
沒有值了??異步
首先我們要清楚兩個概念函數
setState
是異步的react
的事件是合成事件
,是存放在事件池(一個放對象的地方,爲了節省內存,使用完會銷燬)緣由 setState
直接傳值,react
更新機制會保存這個臨時值,等到更新是將全部值合併,而函數則會在更新時去執行獲取返回值,這個過程是異步的,也就是你去執行函數時,實際上是已通過了一段時間,react的合成事件
在使用完就會馬上銷燬掉,你這時候去拿到的固然沒有值。ui
解決方法this
setState
不傳入函數,直接傳值onChange = (e) => {
this.setState({value: e.target.value})
}
複製代碼
event.persist()
,這樣react
處理時會一直保存這個事件,而不會銷燬onChange = (e) => {
e.persist()
this.setState(prev => ({...prev, value: e.target.value}))
}
複製代碼