網(wǎng)站首頁 編程語言 正文
1、介紹
React組件中默認封裝了很多屬性,有的是提供給開發(fā)者操作的,其中有三個屬性非常重要:state、props、refs。
2、state
概念
state是類組件的一個默認屬性,用于標識類組件的狀態(tài),負責更新UI,讓頁面動態(tài)變化,當state變化時,組件將被重新渲染。
函數(shù)組件沒有對象屬性(babel默認開啟了局部嚴格模式,函數(shù)內(nèi)部this指向undefined),所以函數(shù)組件沒有state屬性,因此函數(shù)組件只負責展示靜態(tài)頁面。
state的值是json對象類型,可以維護多個key-value的組合。
演示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>state屬性</title>
</head>
<body>
<div id="container"></div>
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.js"></script>
<script type="text/babel" >
class ClassComponet extends React.Component{
count = 0;
//初始化state狀態(tài)屬性,值必須為對象
state = {now: new Date()};
//state對象里面的任何值變化,render都會被重新調(diào)用
render(){
console.log(this.count++);
return (
<div>
<h1>當前時間:{this.state.now.toString()}</h1>
<button onClick={this.changeTime}>時間開始動起來</button>
</div>
);
}
changeTime = ()=>{
clearInterval(this.timer);
this.timer = setInterval(()=>{
//注意:狀態(tài)必須通過setState進行更新,否則無效
this.setState({now: new Date()});
},1000);
}
}
ReactDOM.render(<ClassComponet/>,document.getElementById('container'))
</script>
</body>
</html>
3、props
概念
props是組件的一個默認屬性,用于組件外部向組件內(nèi)部傳值,或者組件之間相互進行傳值。
每個組件都有props屬性(原理:函數(shù)組件通過參數(shù)往內(nèi)部傳值,類組件通過構(gòu)造器往內(nèi)部傳值)。
props屬性值是只讀的,組件自身不能修改props屬性值。
組件的props屬性值可以進行類型、必要性限制,也可以設置屬性默認值。
props與state區(qū)別
- props是組件對外的,state是組件對內(nèi)的。
- state屬性值是可變的,props屬性值是只讀的。
演示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>props屬性</title>
</head>
<body>
<div id="container"></div>
<div id="container2"></div>
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.js"></script>
<!-- 使用PropTypes需要引入prop-types -->
<script src="https://unpkg.com/prop-types@15.6/prop-types.js"></script>
<script type="text/babel" >
class Person extends React.Component{
render(){
//解構(gòu)賦值取出props內(nèi)部屬性
const {name,age,gender} = this.props;
return (
<div>
<ul>
<li>姓名:{name}</li>
<li>性別:{age}</li>
<li>年齡:{gender}</li>
</ul>
</div>
);
}
//對props屬性值進行類型、必要性的限制(此屬性針對類層面,所以定義為static)
//使用PropTypes需要引入prop-types
static propTypes = {
name:PropTypes.string.isRequired, //限制name必傳,且為字符串
sex:PropTypes.string,//限制sex為字符串
age:PropTypes.number,//限制age為數(shù)值
speak:PropTypes.func,//限制speak為函數(shù)
}
//對props屬性值設置默認值,當外部未傳遞時就會采用默認值
static defaultProps = {
sex:'男',//sex默認值為男
age:100 //age默認值為18
}
}
//通過組件標簽屬性向組件對象內(nèi)部傳遞props屬性值
ReactDOM.render(<Person name="張三" age={18} gender="男"/>,document.getElementById('container'))
//通過展開運算向組件對象內(nèi)部傳遞props屬性值
const person = {'name':'李四','age':20,'gender':'女'};
ReactDOM.render(<Person {...person}/>,document.getElementById('container2'))
</script>
</body>
</html>
4、refs
概念
組件內(nèi)的標簽,可以在標簽上定義ref屬性,用于標識標簽自身,組件內(nèi)便可以通過ref屬性值獲取到操作頁面的真實DOM。
refs種類
- 字符串形式的ref
- 回調(diào)函數(shù)形式的ref
- React.createRef形式的ref
演示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>refs屬性</title>
</head>
<body>
<div id="container"></div>
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.js"></script>
<script type="text/babel" >
class ClassComponet extends React.Component{
//React.createRef調(diào)用后可以返回一個容器,該容器僅能存儲一個被ref所標識的節(jié)點
msg3 = React.createRef()
render(){
return (
<div>
輸入框1:<input ref="msg1" type="text"/> <br/> {/*字符串形式的ref*/}
輸入框2:<input ref={this.setInput2Ref} type="text"/> <br/> {/*回調(diào)函數(shù)形式的ref*/}
輸入框3:<input ref={this.msg3} type="text"/> <br/> {/*React.createRef形式的ref*/}
<button onClick={this.showData1}>點擊彈出輸入框1內(nèi)容</button> <br/>
<button onClick={this.showData2}>點擊彈出輸入框2內(nèi)容</button> <br/>
<button onClick={this.showData3}>點擊彈出輸入框3內(nèi)容</button> <br/>
</div>
);
}
showData1 = ()=>{
alert(this.refs.msg1.value);
}
//傳遞的參數(shù)就是標簽位于頁面的真實DOM,保存到組件中后續(xù)使用
setInput2Ref = (realDOM)=>{
this.msg2 = realDOM;
}
showData2 = ()=>{
alert(this.msg2.value);
}
showData3 = ()=>{
//React.createRef創(chuàng)建的容器存儲被ref所標識的節(jié)點,需要通過current屬性獲取
alert(this.msg3.current.value);
}
}
ReactDOM.render(<ClassComponet/>,document.getElementById('container'))
</script>
</body>
</html>
5、父子組件
什么是父子組件
當組件之間嵌套使用時,外層組件就被稱為父組件,內(nèi)層組件就被稱為子組件。
父子組件之間傳值
這里借助state、props兩大組件屬性進行父子組件之間傳值。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父子組件間傳值</title>
</head>
<body>
<div id="container"></div>
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.js"></script>
<script type="text/babel" >
//父組件
class FatherComponet extends React.Component{
name = "小頭爸爸";
state = {sonName:""}
getSonName = (sonName)=>{
this.setState({sonName})
return sonName;
}
render(){
return (
<div>
<h2>我是父組件:{this.name},我的兒子是:{this.state.sonName}</h2>
<SonComponet name={this.name} getSonName={this.getSonName}/> {/*引入子組件,且通過props屬性給子組件傳值*/}
</div>
);
}
}
//子組件
class SonComponet extends React.Component{
name = "大頭兒子";
render(){
const {name:fatherName} = this.props;
return (
<div>
<h3>我是子組件:{this.name},我爸爸是:{fatherName}</h3>
<button onClick={this.myNameSendFather}>子組件傳值給父組件</button>
</div>
);
}
myNameSendFather = ()=>{
const {getSonName} = this.props;
//子組件調(diào)用父組件的函數(shù),通過參數(shù)將值傳遞給父組件
getSonName(this.name);
}
}
ReactDOM.render(<FatherComponet/>,document.getElementById('container'))
</script>
</body>
</html>
原文鏈接:https://blog.csdn.net/xiao_yu_gan/article/details/126824734
相關(guān)推薦
- 2021-12-27 readAsText 讀取本地文件
- 2023-07-02 C++中默認無參構(gòu)造函數(shù)的工作機制淺析_C 語言
- 2022-01-19 正則表達式匹配日期格式y(tǒng)yyy-mm-dd(支持閏年)
- 2021-12-03 C++類和對象實戰(zhàn)之Date類的實現(xiàn)方法_C 語言
- 2022-05-04 ?分享Python?中的?7?種交叉驗證方法_python
- 2022-08-31 Flask接收上傳圖片方法實現(xiàn)_python
- 2023-01-11 解讀時間序列分析之ADF檢驗_python
- 2022-12-15 uboot添加自定義命令的實現(xiàn)步驟_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支