本文檔為視頻學(xué)習(xí)筆記、需結(jié)合嗶哩嗶哩尚硅谷react教程視頻閱讀使用
react簡介
react是干什么的
react是用于構(gòu)建界面的js庫——只關(guān)注視圖
以往展示信息的步驟
發(fā)送請求獲取數(shù)據(jù)
處理數(shù)據(jù)
操作dom進行渲染
react只關(guān)注第三步。前兩部還需要之前的知識去做,react只幫忙操作dom。
——react是一個將數(shù)據(jù)渲染為html視圖開源js庫
react的好處
原生js的痛點
原生js操作domfan所、效率低(通過dom-api操作ui)
使用js直接操作dom,瀏覽器會進行大量的重繪重排
原生js沒有組件化的編碼方案,代碼復(fù)用率低
react的特點
-
采用組件化模式、聲明式編碼,提高開發(fā)效率以及組件復(fù)用率。
以前用的是命令式編程,也就是每一步都要自己做(獲取dom——改變顏色),但是聲明式編碼只需要說明這個dom應(yīng)該是什么顏色。
在react native中可以使用react語法進行移動端開發(fā)。
-
使用虛擬DOM+優(yōu)秀的Diffing算法,盡量減少與真實DOM的交互。
虛擬dom存放在內(nèi)存中。
react使得數(shù)據(jù)變化時,瀏覽器只需要更新變化的部分,不需要整個重繪
diffing算法是用來進行虛擬DOM比較的
學(xué)習(xí)react之前要掌握的js基礎(chǔ)知識
1.判斷this指向
2.Class類
3.Es6語法規(guī)范
4.Npm包管理器
5.原型、原型鏈
6.數(shù)組常用方法
7.模塊化
hello_react案例
react中js文件作用
babel.js用于es6轉(zhuǎn)es5,在react時用于jsx轉(zhuǎn)js
react.development.js是react核心庫
react-dom.development.js是react的擴展庫。用于操作dom
通過腳手架搭建一個react項目
通過引入js文件搭建一個新的react項目
新建一個文件夾hello_react。用vscode打開
在hello_react新建一個js文件夾,將babel.js、react.development.js、react-dom.development.js拖拽到這個js文件夾下面。
注意點
1. <script type="text/babel">
Type是text/babel
2. <script type="text/javascript" src="../js/react.js"></script>
<script type="text/javascript" src="../js/react-dom.js"></script>
先引入react,再引入react-dom
3. //1.創(chuàng)建虛擬dom
const VDOM=<h1>Hello,React</h1>//不寫引號,因為不是字符串
虛擬dom不寫引號,相當于直接放進去
4. ReactDOM.render(VDOM,document.getElementById('test'))
Reder語法
虛擬DOM的兩種創(chuàng)建方式
-
用jsx創(chuàng)建虛擬dom
const VDOM=<h1 id="title">Hello,React</h1>//不寫引號,因為不是字符串
原生js創(chuàng)建虛擬dom
-
原生的js不需要引入babel
<script type="text/javascript" src="../js/react.js"></script>
<script type="text/javascript" src="../js/react-dom.js"></script>
所以script type也回歸text/javascript
<script type="text/javascript">
-
用React.creatElement()函數(shù)來創(chuàng)建虛擬DOM
const VDOM=React.createElement(標簽名,標簽屬性,標簽內(nèi)容)
示例如下:
const
VDOM=React.createElement('h1',{id:'title',className:'tclass'},'hello,React')//不寫引號,因為不是字符串
示例2:
const
VDOM=React.createElement('h1',{id:'title',className:'tclass'},React.createElement('span',{},'he11llo,React'))//不寫引號,因為不是字符串
4.虛擬DOM與真實DOM
1.虛擬DOM就是一個普通的JS對象
2.虛擬DOM比較輕,真實DOM上面的屬性比較多。因為虛擬DOM是react內(nèi)部使用,無需那么多屬性。
3.虛擬DOM會被react轉(zhuǎn)化為真實DOM,渲染到瀏覽器中。
5.JSX的語法規(guī)則
Js+xml js的一種擴展語法 標簽名任意:html標簽或其他標簽
作用
用來簡化虛擬DOM的創(chuàng)建
Jsx語法
定義虛擬DOM的時候不能寫引號
標簽中混入js表達式時要用花括號,例如:
const myId='TiTLEd'
const myContent='hEllO,ReaCT11111'
//1.創(chuàng)建虛擬dom
const VDOM=(
<h1 id={myId.toLowerCase()}>
<span>{myContent.toLowerCase()}</span>
</h1>
)
-
js里面的樣式類名不要用class(因為es6里面class是類,重復(fù)了)
要用className
-
內(nèi)嵌的css樣式,要用雙括號括起來{{}}
外層{}表示接下來要加入的是js語句
內(nèi)層括號是因為style的值一般是鍵值對,是一個對象
background-color 要用backgroundColor
font-size要用fontSize ——小駝峰
const VDOM=(
<h1 id={myId} style={{backgroundColor:'black'}}>
<span
style={{color:'yellow',fontSize:'15px'}}>{myContent.toLowerCase()}</span>
</h1>
)
虛擬dom只能有一個根標簽
標簽必須閉合
-
標簽首字母
小寫字母開頭,會將標簽轉(zhuǎn)換成html中的同名標簽。如果html里面沒有同名標簽,則報錯
如果是大寫字母開頭,React就會渲染對應(yīng)的組件,如果沒有定義,就會報錯
6.JSX小練習(xí)
1.VDOM中放入數(shù)組會直接遍歷
2.可以通過{{}}放入表達式,但是不能放入語句或者代碼。
什么是表達式:
表達式是會產(chǎn)生值??梢苑旁谌魏我粋€需要的地方
a a+b a==b demo()return undefined arr.map() function tese(){}
但是語句往往是一個操作?;蛘哒f控制代碼走向。
If(){} for(){} switch(){case: xxx}
3.每個child要有一個唯一的key
7.組件和模塊
模塊:即為js模塊,拆分js
組件:全都拆—— 一拆到底
模塊化、組件化工程化
安裝插件
下載安裝包——解壓——加載已解壓程序
當打開用react寫的網(wǎng)頁的時候,reactDeveloperTools的圖標才會亮起,紅色表示該網(wǎng)站尚未打包,藍色表示已經(jīng)打包了。
F12開發(fā)者模式中,會多出兩個選項components和profiler。前者用于查看組件、數(shù)據(jù)等。后者用于查看網(wǎng)站性能,入組件加載速度等。
本文檔為視頻學(xué)習(xí)筆記、需結(jié)合嗶哩嗶哩尚硅谷react教程視頻閱讀使用
9.組件之函數(shù)式組件
一個組件中應(yīng)當包括,結(jié)構(gòu)、樣式、行為、資源(html,css,js,資源)
函數(shù)式組件
首字母必須大寫
渲染時要寫成標簽渲染進去的形式
<div id="content">79789 </div>
<script type="text/javascript" src="../js/react.js"></script>
<script type="text/javascript" src="../js/react-dom.js"></script>
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">
function Demo(){
return <h2>我是用函數(shù)定義的組件</h2>
}
//渲染組件到頁面
ReactDOM.render(<Demo />,document.getElementById("content"))
</script>
babel經(jīng)過翻譯之后,默認開啟嚴格模式,嚴格模式下,Demo里面的this不指向window。是個undifined
執(zhí)行ReactDOM.render(<demo /> , …….)之后發(fā)生了什么
- React解析組件標簽,找到Demo組件
② 發(fā)現(xiàn)組件是使用函數(shù)定義的,隨后調(diào)用該函數(shù),把返回的虛擬dom轉(zhuǎn)換成真實DOM渲染到頁面上
復(fù)習(xí)類的相關(guān)知識
1.基本創(chuàng)建
1.用class創(chuàng)建關(guān)鍵字
<script type="text/babel">
//用關(guān)鍵字class創(chuàng)建一個類
class Person{
}
//創(chuàng)建一個類的實例對象
const p1=new Person();
console.log(p1);
</script>
用構(gòu)造函數(shù)實例化類
輸出結(jié)果為:

前面的Person表示的是這個類由誰實例化出來的。
后面的{ }就是我們的p1,打印出的對象p1
2.構(gòu)造器方法constructor()。該函數(shù)中的this指向?qū)嵗龑ο?/h4>
<script type="text/babel">
//用關(guān)鍵字class創(chuàng)建一個類
class Person{
//構(gòu)造器方法
constructor(name,age){
this.name=name;
this.age=age;
}
}
//創(chuàng)建一個類的實例對象
const p1=new Person("make",18);
const p2=new Person("jane",19);
console.log(p1);
console.log(p2);
</script>
輸出結(jié)果:

3.類的一般方法(除了構(gòu)造器方法以外的方法)
-
類里面的一般方法的前面不寫function關(guān)鍵字
-
方法中的this指向的是對象
類的一般方法,放在原型對象上。供實例使用
通過person實例調(diào)用speak時,speak中的this指向就是person的實例對象
-
<script type="text/babel">
let name = "pppp";
//用關(guān)鍵字class創(chuàng)建一個類
class Person{
//構(gòu)造器方法
constructor(name,age){
this.name=name;
this.age=age;
}
//一般方法
speak(){
console.log(我的名字是${name},我的年齡是${this.age})
}
};
//創(chuàng)建一個類的實例對象
const p1=new Person("make",18);
const p2=new Person("jane",19);
console.log(p1);
console.log(p2);
p1.speak();
p2.speak();
</script>
注意這里的名字輸出出來是ppp不是make
4.原型鏈
當調(diào)用了屬性不存在的屬性或者方法,會沿著原型鏈去找,看他的原型鏈上有沒有誰有這個屬性或者方法。
<script type="text/babel">
let name = "pppp";
//用關(guān)鍵字class創(chuàng)建一個類
class Person{
//構(gòu)造器方法
constructor(name,age){
this.name=name;
this.age=age;
}
//一般方法
speak(){
console.log(我的名字是${name},我的年齡是${this.age})
}
};
//創(chuàng)建一個類的實例對象
const p1=new Person("make",18);
const p2=new Person("jane",19);
console.log(p1);
console.log(p2);
p1.speak();
p2.speak();
</script>
比如這里,p1和p2的speak都是原型上的方法。
所以在proto里面去找

類的繼承
-
什么時候不用寫構(gòu)造器?
當構(gòu)造方法與父類一致的時候
-
什么時候要寫構(gòu)造器
與父類不一致,或者有新的東西要添加的時候
-
必須調(diào)用super
定義一個類child繼承parent的時候,并且要在child里面寫構(gòu)造函數(shù)的時候,必須調(diào)用super
例如:
class Person{
//構(gòu)造器方法
constructor(name,age){
this.name=name;
this.age=age;
}
//一般方法
speak(){
console.log(我的名字是${name},我的年齡是${this.age})
}
};
//創(chuàng)建一個Student類集成Person
class Student extends Person{
constructor(name,age,grade){
this.name=name
this.age=age
this.grade=grade
}
}
會報錯說你沒使用super。、

正確寫法:
class Student extends Person{
constructor(name,age,grade){
super(name,age)
this.grade=grade
}
}
也就是說supre相當于調(diào)用父類的構(gòu)造函數(shù)。
注意:super要放在最前面
-
原型鏈的查找
在上面的例子中,實例化一個sd并調(diào)用sd.speak()方法,會發(fā)現(xiàn)調(diào)用成功。
const sd=new Student("張三","15","高一");
sd.speak();


其查找邏輯為:
首先sd這個對象它自己沒有speak方法,所以要找它的原型也就是Student類。Student類也沒有speak方法,所以只能繼續(xù)沿著原型鏈向上找,直到找到Person
- 子類重寫從父類繼承的方法
//創(chuàng)建一個Student類集成Person
class Student extends Person{
constructor(name,age,grade){
super(name,age)
this.grade=grade
}
speak(){
console.log(我的名字是${this.name},我的年齡是${this.age},我正在讀${this.grade})
}
}
const sd=new Student("張三","15","高一");
sd.speak();
這里會直接調(diào)用Student里面的speak()函數(shù)
總結(jié)
類中的構(gòu)造器不是必須寫的。要對實例進行一些初始化的操作,如添加指定屬性時才寫。
如果Child類繼承了Parent類。而且Child類中寫了構(gòu)造器,那么Child類構(gòu)造器中必須要調(diào)用super
類中所定義的方法,都是放在類的原型對象上。供實例使用。
11類式組件(適用于復(fù)雜組件的定義)
創(chuàng)建類式組件
函數(shù)式組件中函數(shù)名就是組件名
類式組件中類名就是組件
1.必須繼承React.Component
2.內(nèi)部必須有render()
//創(chuàng)建類式組件
class MyComponent extends React.Component{
render(){
return <h2>我是類定義的組件</h2>
}
}
//渲染類式組件
ReactDOM.render(<MyComponent />,document.getElementById("content"))
3. 執(zhí)行ReactDOM.render(<demo /> , …….)之后發(fā)生了什么
①React解析組件標簽,找到MyComponent組件
②發(fā)現(xiàn)組件是類定義的,隨后new出該類的實例對象,并通過該實例調(diào)用原型上的render()方法。
③將render()返回的虛擬DOM轉(zhuǎn)化成真實DOM渲染到頁面上。
④render中的this指向的是React幫忙創(chuàng)建的這個實例對象——MyComponent組件實例對象
12.對state的理解——組件實例的三大核心屬性之一
什么是簡單組件。什么是復(fù)雜組件:
有state(狀態(tài))的是復(fù)雜組件,沒有state的是簡單組件。
組件的狀態(tài)state驅(qū)動什么:
組件的狀態(tài)里面存著數(shù)據(jù),數(shù)據(jù)的變化驅(qū)動著頁面展示的改變。
State在組件的實例上
所以只有class可以有。函數(shù)式組件都沒有實例。另外兩大核心屬性也是一樣
13.初始化state
想對類的實例對象進行衣蛾寫初始化的操作,比如增加一個屬性或者修改一個屬性的值,就需要借助類里面的構(gòu)造器了。
14.react中的事件綁定
1.原生事件綁定
1.addEventListener
onclick
內(nèi)嵌事件函數(shù)
<button id=”btn1” click=”onclick()”></button>
2.react中的事件綁定
建議使用內(nèi)嵌事件函數(shù)
①首先onclick要寫成onClick
②首先不能用引號
render(){
const {isHot}=this.state;
return <h2 onClick="btn()">今天天氣很{isHot?"炎熱":"涼爽"}</h2>
}
這是錯的
然后不能加小括號,因為時把btn()返回值給onclick了,為undefined
render(){
const {isHot}=this.state;
return <h2 onClick={btn()}>今天天氣很{isHot?"炎熱":"涼爽"}</h2>
}
這也是錯的
以下這樣才正確:
render(){
const {isHot}=this.state;
return <h2 onClick={btn}>今天天氣很{isHot?"炎熱":"涼爽"}</h2>
}
15.類中的方法中的this
class MyComponent extends React.Component{
constructor(props){
super(props)
this.state={
isHot:false
}
}
render(){
const {isHot}=this.state;
return <h2 onClick={this.btn}>今天天氣很{isHot?"炎熱":"涼爽"}</h2>
}
btn(){
console.log(this)
}
}
打?。簎ndefined
①btn()定義在類中,也即是放在MyComponent的原型對象上。供實例使用
②由于btn時作為onClick的回調(diào),也就是說只是見到那的賦值給了onClick。所以這時再使用onclick已經(jīng)不是通過實例對象調(diào)用,而是直接對存放在堆里面的方法btn進行調(diào)用。所以this應(yīng)該指向window
③但是,但是,由于類里面的方法默認開啟嚴格模式,嚴格模式的代碼塊中,this禁止指向window。所以this為undefined
16.解決類中的this的指向問題、
Render()中的this指向是組件的實例對象。
在構(gòu)造函數(shù)中:
constructor(props){
super(props)
this.state={isHot:false}
this.btn=this.btn.bind(this)
}
①先看右邊。構(gòu)造器中的this指向的是實例對象,找實例對象的btn()方法;
②但是函數(shù)掛載在原型對象上,所以實例對象中此時此刻還沒btn()函數(shù),順著原型鏈找到原型對象的btn()函數(shù)。通過bind函數(shù)傳遞進去this。
③這個this指向誰呢?還是那句話,構(gòu)造器中的this指向的是實例對象。所以這個bind會返回一個和btn()函數(shù)一樣的函數(shù),區(qū)別只在于函數(shù)內(nèi)部的this指向了實例對象
④看左邊,賦值給了掛載在實例對象上的btn()函數(shù)。如此一來,每次通過實例對象調(diào)用的函數(shù)btn()是直接調(diào)用的函數(shù)左邊的這個。找到了,自然也不會去原型鏈里面找了。
本文檔為視頻學(xué)習(xí)筆記、需結(jié)合嗶哩嗶哩尚硅谷react教程視頻閱讀使用
17.setState的使用
狀態(tài)state不能直接更改,而是要使用一個api明教setState進行更改,React才會認可,才會幫我們刷新頁面
18.簡寫方法
1.構(gòu)造方法的簡寫
類里面可以直接寫賦值語句,例如:
class MyComponent extends React.Component{
a=1
}
前面不用寫let之類的,直接寫賦值語句
含義為:在該類的實例對象上追加一個屬性,屬性名為a,值為1
注意:是實例對象,而不是原型對象,這個變量實際掛載在實例對象身上,原型對象身上沒有
但是傳遞進來的數(shù)據(jù)需要構(gòu)造器來接
類里面可以寫的東西有:構(gòu)造器、render()、一般方法、賦值語句
2.bind函數(shù)的省略
//創(chuàng)建類式組件
class MyComponent extends React.Component{
constructor(props){
super(props)
this.state={isHot:false}
}
render(){
const {isHot}=this.state;
return <h2 onClick={this.btn}>今天天氣很{isHot?"炎熱":"涼爽"}</h2>
}
btn=()=>{
const isHot=this.state.isHot;
this.setState({isHot:!isHot});
}
}
//渲染類式組件
ReactDOM.render(<MyComponent />,document.getElementById("content"))
注意這一部分:
btn=()=>{
const isHot=this.state.isHot;
this.setState({isHot:!isHot});
}
①首先這個btn不再是一個聲明函數(shù),而是一個賦值語句。根據(jù)上面一小節(jié)我們知道,類里面的賦值語句的含義是,給實例對象追加一個屬性btn,它的內(nèi)容是一個函數(shù)
②也就是說這個btn是掛載在實例對象身上的
③btn是一個箭頭函數(shù),箭頭函數(shù)內(nèi)部沒喲自己的this,從上下文捕獲this。
④btn追加在實例對象上,所以這個this指向的是實例對象。
⑤所以之前的bind函數(shù)就可以省略掉了,btn()函數(shù)此時不會丟失this了。效果不變
3.總結(jié):
類的經(jīng)典格式:
class MyComponent extends React.Component{
state={isHot:false}
render(){
const {isHot}=this.state;
return <h2 onClick={this.btn}>今天天氣很{isHot?"炎熱":"涼爽"}</h2>
}
btn=()=>{
const isHot=this.state.isHot;
this.setState({isHot:!isHot});
}
}
初始化狀態(tài)state={}
不用放在構(gòu)造器中,直接直接寫state={isHot:false}作為代替
類中的一般屬性都要寫成
賦值語句+箭頭函數(shù)的形式
19.state總結(jié):
①state的值是對象,包含多個key:value
②組件被稱為狀態(tài)機,通過更新組件的state來更新與渲染對應(yīng)組件
③組件中的render的方法中的this指向?qū)嵗龑ο?/p>
④組件中自定義的一般方法中的this為undefined
解決方法:
1.強制綁定bind
2.賦值語句+箭頭函數(shù)
⑤狀態(tài)數(shù)據(jù)必須用setState
20.props的基本使用
如何傳遞
ReactDOM.render(<Child name="123" />,document.getElementById("content"))
以這種形式書寫,react會直接把name和123作為key:value對 傳給組件的實例對象,(注意類比原生html的屬性書寫方法),存放在它的props里面。
在render中打印出this,如圖可以看到props里面已經(jīng)有了

如何拿到并使用
class Child extends React.Component{
render(){
console.log(this);
return(
<ul>
<li>姓名{this.props.name}</li>
<li>性別{this.props.sex}</li>
<li>年齡{this.props.age}</li>
</ul>
)
}
}
ReactDOM.render(<Child name="123" age="456" sex="789"/>,document.getElementById("content"))
直接用this.props.name
簡化一下:
render(){
console.log(this);
const {name,sex,age}=this.props
return(
<ul>
<li>姓名{name}</li>
<li>性別{sex}</li>
<li>年齡{age}</li>
</ul>
)
}
21.批量傳遞props(批量傳遞標簽屬性)
不定參數(shù)的方法:
const p={name:'1773',sex:'***',age:'+++'}
ReactDOM.render(<Child {...p}/>,document.getElementById("content"))
要求同名
展開運算符…的知識復(fù)習(xí):
1.對數(shù)組使用——展開數(shù)組
將數(shù)組按展開
let arr1=[1,3,5,7,9]
console.log(...arr1)
console.log(arr1)

2.最數(shù)組使用——鏈接兩個數(shù)組
let arr1=[1,3,5,7,9]
let arr2=[2,4,6,8,10]
let arr3=[...arr1,...arr2]
console.log(arr3)
相當于把arr1和arr2展開放在一起,然后賦值給arr3

3.函數(shù)傳參——不定參數(shù)
4.不能展開對象——babel+react可以
原生情況下展開運算符不允許展開對象
React+babel中,可以展開對象———但是只能用于標簽屬性的傳參
5.知識復(fù)習(xí)——如何復(fù)制一個對象
let person={name:'123',age:'456'}
let person2=person
這種形式只是一個引用的傳遞,而不是復(fù)制對象的本身。
當person內(nèi)部的值變化的時候,通過person2獲取到的值也變化了。
應(yīng)該這樣:
let person={name:'123',age:'456'}
let person2={...person}
如此一來,person2只是初始值和person一樣。之后就各是各的了
注意一定外面要加{},因為原生狀態(tài)下展開運算符不能展開對象,這里是在構(gòu)建對象字面量
6.構(gòu)建對象字面量的同時修改其屬性值
let person={name:'123',age:'456'}
let person2={...person}
let person3={...person2,name:"老王",address:"隔壁"}
console.log(person2)
console.log(person3)

22.為React添加props的規(guī)則限制
使用propsTypes
class Child extends React.Component{
render(){
console.log(this);
const {name,sex,age}=this.props
return(
<ul>
<li>姓名{name}</li>
<li>性別{sex}</li>
<li>年齡{age}</li>
</ul>
)
}
}
Child.propTypes={
name:PropTypes.string
}
const p={name:789798798,sex:'***',age:'+++'}
ReactDOM.render(<Child {...p}/>,document.getElementById("content"))
①首先,porpTypes要寫在類的外面,否則報錯(這個在下一節(jié)會處理)
②嚴格按照這個格式來寫:
Child.propTypes={
name:PropTypes.string
}
外面Child.propTypes的p小寫,里面PropTypes.string的p大寫,string這里的s也要小寫。
③前面要引入prop-type.js
④react的版不能太舊。
isRequired
限制名字為String且為必填項:
Child.propTypes={
name:PropTypes.string.isRequired
}
defaultProps
限制性別為String型,且默認值為“不男不女”
沒填性別的話,性別就默認為 不男不女
Child.propTypes={
sex:PropTypes.string
}
Child.defaultProps={
sex:"不男不女"
}
傳一個函數(shù):
Child.propTypes={
sex:PropTypes.string,
speak:PropTypes.func
}
注意這里要寫func,不能寫function
23.props簡寫
Props是只讀的
不能修改
把propTypes放到class內(nèi)部里面去
class Child extends React.Component{
static propTypes={
sex:PropTypes.string,
speak:PropTypes.func
}
static defaultProps={
sex:"不男不女"
}
render(){
console.log(this);
const {name,sex,age}=this.props
return(
<ul>
<li>姓名{name}</li>
<li>性別{sex}</li>
<li>年齡{age}</li>
</ul>
)
}
}
注意要在前面加一個static
因為下面這種寫法是給類的實例對象添加屬性
class Child extends React.Component{
propTypes={
sex:PropTypes.string,
speak:PropTypes.func
}
defaultProps={
sex:"不男不女"
}
}
必須要加上static才能把屬性直接加載原型對象上。
24.類組件中的構(gòu)造器與props
①構(gòu)造函數(shù)完全可以不寫
②如果要寫構(gòu)造器函數(shù),要接props,并且調(diào)用super(props)
形如:
constructor(props){
super(props)
}
否則構(gòu)造器內(nèi)部的this.props為undifined。無法通過this.的形式找到props
一般來說用不到。構(gòu)造器能省就省略
25.函數(shù)式組件使用props
function Child(props){
const {name,sex,age}=props
return(
<ul>
<li>姓名{name}</li>
<li>性別{sex}</li>
<li>年齡{age}</li>
</ul>
)
}
const p={name:"8",age:'+++',speak:p}
ReactDOM.render(<Child {...p}/>,document.getElementById("content"))
<Child {...p}/>傳進來的值會默認被收集成一個對象,并將這個對象作為函數(shù)組件的參數(shù)傳進去 func Child(props){
給函數(shù)式組件設(shè)置propType
Child.propTypes={
sex:PropTypes.string
}
Child.defaultProps={
sex:"不男不女"
}
直接寫在函數(shù)的外面。