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項(xiàng)目中報(bào)錯(cuò):Parsing error: The keyword &a
ESLint 默認(rèn)使用的是 ES5 語(yǔ)法,如果你想使用 ES6 或者更新的語(yǔ)法,你需要在 ESLint 的配置文件如:.eslintrc.js等中設(shè)置 parserOptions,這篇文章主要介紹了React項(xiàng)目中報(bào)錯(cuò):Parsing error: The keyword 'import' is reservedeslint的問題及解決方法,需要的朋友可以參考下2023-12-12React使用Context與router實(shí)現(xiàn)權(quán)限路由詳細(xì)介紹
這篇文章主要介紹了React使用Context與router實(shí)現(xiàn)權(quán)限路由的詳細(xì)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01react 組件表格固定底部的實(shí)現(xiàn)代碼
在React中,要實(shí)現(xiàn)一個(gè)組件表格并且固定底部,可以使用CSS的固定定位或絕對(duì)定位來實(shí)現(xiàn),下面通過示例代碼給大家分享react 組件表格固定底部的實(shí)現(xiàn)代碼,感興趣的朋友跟隨小編一起看看吧2024-05-05React中實(shí)現(xiàn)組件通信的幾種方式小結(jié)
在構(gòu)建復(fù)雜的React應(yīng)用時(shí),組件之間的通信是至關(guān)重要的,從簡(jiǎn)單的父子組件通信到跨組件狀態(tài)同步,不同組件之間的通信方式多種多樣,下面我們認(rèn)識(shí)react組件通信的幾種方式,需要的朋友可以參考下2024-04-04React中使用react-player 播放視頻或直播的方法
這篇文章主要介紹了React中使用react-player 播放視頻或直播,本文教大家如何使用react框架及創(chuàng)建實(shí)例的代碼,本文內(nèi)容簡(jiǎn)短給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01React?實(shí)現(xiàn)具備吸頂和吸底功能組件實(shí)例
這篇文章主要為大家介紹了React?實(shí)現(xiàn)具備吸頂和吸底功能組件實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02react基于react-slick實(shí)現(xiàn)多圖輪播效果
React slick是一個(gè)使用React構(gòu)建的輪播組件,下面這篇文章主要給大家介紹了關(guān)于react基于react-slick實(shí)現(xiàn)多圖輪播效果的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07React DOM-diff 節(jié)點(diǎn)源碼解析
這篇文章主要為大家介紹了React DOM-diff節(jié)點(diǎn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02