網(wǎng)站首頁 編程語言 正文
一、受控組件
在HTML中,表單元素的標(biāo)簽、、等的值改變通常是根據(jù)用戶輸入進(jìn)行更新。
在React中,可變狀態(tài)通常保存在組件的狀態(tài)屬性中,并且只能使用 setState() 進(jìn)行更新,而呈現(xiàn)表單的React組件也控制著在后續(xù)用戶輸入時(shí)該表單中發(fā)生的情況,以這種由React控制的輸入表單元素而改變其值的方式,稱為受控組件。
比如,給表單元素input綁定一個(gè)onChange事件,當(dāng)input狀態(tài)發(fā)生變化時(shí)就會(huì)觸發(fā)onChange事件,從而更新組件的state。
import React, { Component } from 'react'
export default class MyInput extends Component{
constructor(props) {
super(props);
this.state = {
value: 0
}
}
handleChange = (event)=>{
this.setState({
value: event.target.value
})
}
render(){
return(
<div>
<input
type="text"
value={this.state.value}
onChange={this.handleChange}
/>
</div>
)
}
}
受控組件更新state的流程
- 可以通過初始state中設(shè)置表單的默認(rèn)值
- 每當(dāng)表單的值發(fā)生變化時(shí),調(diào)用onChange事件處理器
- 事件處理器通過事件對象event拿到改變后的狀態(tài),并更新組件的state
- 一旦通過setState方法更新state,就會(huì)觸發(fā)視圖的重新渲染,完成表單組件的更新
React中數(shù)據(jù)是單項(xiàng)流動(dòng)的,從示例中,可以看出表單的數(shù)據(jù)來源于組件的state,并通過props傳入,這也稱為單向數(shù)據(jù)綁定。然后又通過onChange事件處理器將新的數(shù)據(jù)寫回到state,完成了雙向數(shù)據(jù)綁定。
二、非受控組件
非受控組件指的是,表單數(shù)據(jù)由DOM本身處理。即不受setState()的控制,與傳統(tǒng)的HTML表單輸入相似,input輸入值即顯示最新值。
在非受控組件中,可以使用一個(gè)ref來從DOM獲得表單值。
class NameForm extends React.Component {
constructor(props) {
super(props);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleSubmit(event) {
console.log('A name was submitted: ' + this.input.value);
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" ref={(input) => this.input = input} />
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
非受控組件在底層實(shí)現(xiàn)時(shí)是在其內(nèi)部維護(hù)了自己的狀態(tài)state,這樣表現(xiàn)出用戶輸入任何值都能反應(yīng)到元素上。
三、總結(jié)
兩者區(qū)別
1.受控組件
受控組件依賴于狀態(tài)
受控組件的修改會(huì)實(shí)時(shí)映射到狀態(tài)值上,此時(shí)可以對輸入的內(nèi)容進(jìn)行校驗(yàn)
受控組件只有繼承React.Component才會(huì)有狀態(tài)
受控組件必須要在表單上使用onChange事件來綁定對應(yīng)的事件
2.非受控組件
非受控組件不受狀態(tài)的控制
非受控組件獲取數(shù)據(jù)就是相當(dāng)于操作DOM
非受控組件可以很容易和第三方組件結(jié)合,更容易同時(shí)集成 React 和非 React 代碼
選擇受控組件還是非受控組件
3.受控組件使用場景:一般用在需要?jiǎng)討B(tài)設(shè)置其初始值的情況。例如:某些form表單信息編輯時(shí),input表單元素需要初始顯示服務(wù)器返回的某個(gè)值然后進(jìn)行編輯。
4.非受控組件使用場景:一般用于無任何動(dòng)態(tài)初始值信息的情況。例如:form表單創(chuàng)建信息時(shí),input表單元素都沒有初始值,需要用戶輸入的情況。
原文鏈接:https://blog.csdn.net/Lynn_yu/article/details/128701167
相關(guān)推薦
- 2022-06-13 Python判斷dict中key是否存在的3種方法實(shí)例_python
- 2022-07-29 C++超詳細(xì)講解操作符的重載_C 語言
- 2021-12-14 linux下多線程中的fork介紹_Linux
- 2022-10-21 tomcat8中startup可以啟動(dòng)tomcat8w無法啟動(dòng)的問題分析_Tomcat
- 2022-10-22 Python?修改CSV文件實(shí)例詳解_python
- 2022-05-03 python單例模式之selenium?driver實(shí)現(xiàn)單例_python
- 2022-08-29 Python可視化神器pyecharts之繪制箱形圖_python
- 2022-09-17 python?df遍歷的N種方式(小結(jié))_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支