(六)React的事件處理,受控非受控元件,高階函式和函式柯里化
(六)React的事件處理,受控非受控元件,高階函式和函式柯里化
事件簡介:
(1).通過onXxx屬性指定事件處理函式(注意大小寫)
a.React使用的是自定義(合成)事件, 而不是使用的原生DOM事件 —————— 為了更好的相容性
b.React中的事件是通過事件委託方式處理的(委託給元件最外層的元素) ————————為了的高效
(2).,通過event.target得到發生事件的DOM元素物件 ——————————不要過度使用ref
其實就是告訴你react是怎麼使用相應的事件
受控元件和非受控元件
案例就是寫一個表單 獲取你所輸入的元件值
非受控元件:
就是獲取資料就是你需要input的資料時候然後就獲取 即用即獲取
//建立元件 class Login extends React.Component{ handleSubmit = (event)=>{ event.preventDefault() //阻止表單提交 const {username,password} = this alert(`你輸入的使用者名稱是:${username.value},你輸入的密碼是:${password.value}`) } render(){ return( <form onSubmit={this.handleSubmit}> 使用者名稱:<input ref={c => this.username = c} type="text" name="username"/> 密碼:<input ref={c => this.password = c} type="password" name="password"/> <button>登入</button> </form> ) } } //渲染元件 ReactDOM.render(<Login/>,document.getElementById('test'))
受控元件:
指的就是沒有雙向資料繫結 需要使用相關事件進行獲取相關的資料 從而進行資料上傳
//建立元件 class Login extends React.Component{ //初始化狀態 state = { username:'', //使用者名稱 password:'' //密碼 } //儲存使用者名稱到狀態中 saveUsername = (event)=>{ this.setState({username:event.target.value}) } //儲存密碼到狀態中 savePassword = (event)=>{ this.setState({password:event.target.value}) } //表單提交的回撥 handleSubmit = (event)=>{ event.preventDefault() //阻止表單提交 const {username,password} = this.state alert(`你輸入的使用者名稱是:${username},你輸入的密碼是:${password}`) } render(){ return( <form onSubmit={this.handleSubmit}> 使用者名稱:<input onChange={this.saveUsername} type="text" name="username"/> 密碼:<input onChange={this.savePassword} type="password" name="password"/> <button>登入</button> </form> ) } } //渲染元件 ReactDOM.render(<Login/>,document.getElementById('test'))
高階函式和函式柯里化
高階函式:如果一個函式符合下面2個規範中的任何一個,那該函式就是高階函式。
1.若A函式,接收的引數是一個函式,那麼A就可以稱之為高階函式。
2.若A函式,呼叫的返回值依然是一個函式,那麼A就可以稱之為高階函式。
常見的高階函式有:Promise、setTimeout、arr.map()等等
函式的柯里化:通過函式呼叫繼續返回函式的方式,實現多次接收引數最後統一處理的函式編碼形式。
function sum(a){
return(b)=>{
return (c)=>{
return a+b+c
}
}
}
重點記憶:(怎麼解決event和傳入的引數 回撥引數後邊寫括號(保證返回值是函式))
在頁面結構中呼叫函式不能直接在後邊寫上小括號 比如 onchange={ this.saveData(‘keyName’) } ,這樣的後果就會直接執行完成了。
為什麼呢? 這樣寫就是把saveData的返回值當做了回撥,而不是把saveData這個方法作為回撥,所以onchange這個方法就沒有去執行你這個saveData了
舉例子:使用表單輸入資料 最後展示出來輸入的資料
下面的onChange寫的回撥函式把自己的的標識(username)傳了進去,但是上面也說了,你這樣寫括號就是直接把函式的返回值給了Onchange作為回撥,而不是每次呼叫你這個函式作為回撥。而且你這個的返回值是undefined所以就不會一直去執行了,怎麼解決,就是直接返回一個函式作為onChange的回撥 ()=>{}
這樣子就來可以解決undefined不執行的問題了。而且你的這個event就是在這個匿名函式裡面的。為什麼 因為onChange的回撥函式就是你的這個返回值,事件源本事的event當然就是在這裡。所以這就是高階函式。。
class Login extends React.Component{
//初始化狀態
state = {
username:'', //使用者名稱
password:'' //密碼
}
//儲存表單資料到狀態中
saveFormData = (dataType)=>{
return (event)=>{
this.setState({[dataType]:event.target.value})
}
}
//表單提交的回撥
handleSubmit = (event)=>{
event.preventDefault() //阻止表單提交
const {username,password} = this.state
alert(`你輸入的使用者名稱是:${username},你輸入的密碼是:${password}`)
}
render(){
return(
<form onSubmit={this.handleSubmit}>
使用者名稱:<input onChange={this.saveFormData('username')} type="text" name="username"/>
密碼:<input onChange={this.saveFormData('password')} type="password" name="password"/>
<button>登入</button>
</form>
)
}
}
//渲染元件
ReactDOM.render(<Login/>,document.getElementById('test'))
另一種方法解決 不用函式的柯立化解決
//建立元件
class Login extends React.Component{
//初始化狀態
state = {
username:'', //使用者名稱
password:'' //密碼
}
//儲存表單資料到狀態中
saveFormData = (dataType,event)=>{
this.setState({[dataType]:event.target.value})
}
//表單提交的回撥
handleSubmit = (event)=>{
event.preventDefault() //阻止表單提交
const {username,password} = this.state
alert(`你輸入的使用者名稱是:${username},你輸入的密碼是:${password}`)
}
render(){
return(
<form onSubmit={this.handleSubmit}>
使用者名稱:<input onChange={event => this.saveFormData('username',event) } type="text" name="username"/>
密碼:<input onChange={event => this.saveFormData('password',event) } type="password" name="password"/>
<button>登入</button>
</form>
)
}
}
//渲染元件
ReactDOM.render(<Login/>,document.getElementById('test'))
咫尺遠近卻無法靠近的那個你,才敢讓你發覺你並不孤寂