React受控組件與非受控組件深入講解
一、非受控組件
表單中輸入類DOM的值現(xiàn)用現(xiàn)取
<script type="text/babel">
//創(chuàng)建組件
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'))
</script>
二、受控組件
表單中輸入類DOM的值,隨著輸入,能把輸入的值維護(hù)到狀態(tài)state中,需要用的時(shí)候再?gòu)臓顟B(tài)中取出來。建議寫受控組件,可以減少ref的使用
<script type="text/babel">
//創(chuàng)建組件
class Login extends React.Component{
//初始化狀態(tài)
state = {
username:'', //用戶名
password:'' //密碼
}
//保存用戶名到狀態(tài)中
saveUsername = (event)=>{
this.setState({username:event.target.value})
}
//保存密碼到狀態(tài)中
savePassword = (event)=>{
this.setState({password:event.target.value})
}
//表單提交的回調(diào)
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'))
</script>三、高階函數(shù)(函數(shù)柯里化)實(shí)現(xiàn)
1、定義
(1)高階函數(shù)
如果一個(gè)函數(shù)符合下面2個(gè)規(guī)范中的任何一個(gè),那該函數(shù)就是高階函數(shù)。
1.若A函數(shù),接收的參數(shù)是一個(gè)函數(shù),那么A就可以稱之為高階函數(shù)。
2.若A函數(shù),調(diào)用的返回值依然是一個(gè)函數(shù),那么A就可以稱之為高階函數(shù)。
常見的高階函數(shù)有:Promise、setTimeout、arr.map()等等
(2)函數(shù)的柯里化
通過函數(shù)調(diào)用繼續(xù)返回函數(shù)的方式,實(shí)現(xiàn)多次接收參數(shù)最后統(tǒng)一處理的函數(shù)編碼形式。
function sum(a){
return(b)=>{
return (c)=>{
return a+b+c
}
}
}
2、實(shí)現(xiàn)
<script type="text/babel">
class Login extends React.Component{
state = {
username:'', //用戶名
password:'' //密碼
}
//保存表單數(shù)據(jù)到狀態(tài)中
saveFormData = (dataType)=>{
return (event)=>{
this.setState({[dataType]:event.target.value})
}
}
//表單提交的回調(diào)
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'))
</script>
onChange綁定的必須是一個(gè)函數(shù),this.saveFormData()調(diào)用saveFormData 函數(shù)的返回值是一個(gè)函數(shù)
四、不用函數(shù)柯里化的實(shí)現(xiàn)
<script type="text/babel">
class Login extends React.Component{
state = {
username:'', //用戶名
password:'' //密碼
}
//保存表單數(shù)據(jù)到狀態(tài)中
saveFormData = (dataType,event)=>{
this.setState({[dataType]:event.target.value})
}
//表單提交的回調(diào)
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'))
</script>
this.saveFormData()調(diào)用saveFormData 函數(shù)返回一個(gè)值然后放在一個(gè)函數(shù)里面
到此這篇關(guān)于React受控組件與非受控組件深入講解的文章就介紹到這了,更多相關(guān)React受控組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決React報(bào)錯(cuò)You provided a `checked` prop&n
這篇文章主要為大家介紹了React報(bào)錯(cuò)You provided a `checked` prop to a form field的解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
詳解React中錯(cuò)誤邊界的原理實(shí)現(xiàn)與應(yīng)用
在React中,錯(cuò)誤邊界是一種特殊的組件,用于捕獲其子組件樹中發(fā)生的JavaScript錯(cuò)誤,并防止這些錯(cuò)誤冒泡至更高層,導(dǎo)致整個(gè)應(yīng)用崩潰,下面我們就來看看它的具體應(yīng)用吧2024-03-03
create-react-app修改為多頁(yè)面支持的方法
本篇文章主要介紹了create-react-app修改為多頁(yè)面支持的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
React使用TailwindCSS的實(shí)現(xiàn)示例
TailwindCSS是一個(gè)實(shí)用優(yōu)先的CSS框架,本文主要介紹了React使用TailwindCSS的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
React內(nèi)部實(shí)現(xiàn)cache方法示例詳解
這篇文章主要為大家介紹了React內(nèi)部實(shí)現(xiàn)cache方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
React實(shí)現(xiàn)歌詞滾動(dòng)效果(跟隨音樂播放時(shí)間滾動(dòng))
這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)歌詞滾動(dòng)效果(跟隨音樂播放使勁按滾動(dòng)),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2024-02-02
使用React Native創(chuàng)建以太坊錢包實(shí)現(xiàn)轉(zhuǎn)賬等功能
這篇文章主要介紹了使用React Native創(chuàng)建以太坊錢包,實(shí)現(xiàn)轉(zhuǎn)賬等功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07

