日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

React受控組件與非受控組件深入講解_React

作者:落雪小軒韓 ? 更新時間: 2023-01-31 編程語言

一、非受控組件

表單中輸入類DOM的值現用現取

<script type="text/babel">
	//創建組件
	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的值,隨著輸入,能把輸入的值維護到狀態state中,需要用的時候再從狀態中取出來。建議寫受控組件,可以減少ref的使用

<script type="text/babel">
	//創建組件
	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'))
</script>

三、高階函數(函數柯里化)實現

1、定義

(1)高階函數

如果一個函數符合下面2個規范中的任何一個,那該函數就是高階函數。

1.若A函數,接收的參數是一個函數,那么A就可以稱之為高階函數。

2.若A函數,調用的返回值依然是一個函數,那么A就可以稱之為高階函數。

常見的高階函數有:Promise、setTimeout、arr.map()等等

(2)函數的柯里化

通過函數調用繼續返回函數的方式,實現多次接收參數最后統一處理的函數編碼形式。

function sum(a){
	return(b)=>{
		return (c)=>{
			return a+b+c
		}
	}
}

2、實現

<script type="text/babel">
	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'))
</script>

onChange綁定的必須是一個函數,this.saveFormData()調用saveFormData 函數的返回值是一個函數

四、不用函數柯里化的實現

<script type="text/babel">
	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'))
</script>

this.saveFormData()調用saveFormData 函數返回一個值然后放在一個函數里面

原文鏈接:https://blog.csdn.net/m0_46613429/article/details/128332218

欄目分類
最近更新