react?component?function組件使用詳解
不可改變性
1.jsx-
2.component(function)-component(class)-components(函數(shù)組件組合)-component tree(redux)-app(項目開發(fā))
在react中,創(chuàng)建了js對象(react元素)就是不可更改的(immutable)。就像是用相機拍照,相當于在此時間點已經(jīng)定位了時間節(jié)點,只能拍下一張照片。
例如,使用底層react寫一個時鐘。
<div id="app"></div>
new Date().toLocalTimeString() //獲取當前時間
var e = <h1>time:{new Date().toLocaleTimeString()}</h1>
ReactDOM.render(e,document.getElementById("app"))
以上,無法實時更新最新的時間。
但是換種方法寫:
function tick() {
//創(chuàng)建新的元素,同步元素到容器。
var e = <div>
<h1>Clock</h1>
<h1>time:{new Date().toLocaleTimeString()}</h1>
</div>
// e1 e2,虛擬dom之間的比較,看看到底哪里發(fā)生了變化。
//同步到容器元素
ReactDOM.render(e, document.getElementById("app"))
}
setTimeout(tick(), 1000);
虛擬dom與真實dom
- 創(chuàng)建元素并打印
已知jsx語法創(chuàng)建的本質(zhì)就是普通js對象,打印的結(jié)果為虛擬dom。
例如
var e = <div className="title" style={{ color: "red" }}>hello</div>
打印e。

但如果打印真實dom
var tDOM = document.querySelector('title');
console.dir(tDOM)
獲得的結(jié)果為

由此可見,虛擬dom比真實dom的開銷要小,這也是瀏覽器中性能優(yōu)化方法之一,減少重繪面積,減少重繪次數(shù)。
函數(shù)組件
function Welcome(props) {
console.log(props)
return <h1>hello world</h1>
}
const e = <Welcome name='jack'></Welcome>
輸出對象:

function Welcome(props) {
const {name} = props
return <h1>hello {name}</h1>
}
const e = <Welcome name='jack'></Welcome>
輸出 hello jack
組件復用
當函數(shù)組件被多次使用在不同場景時,中間的內(nèi)容會被react自動賦予chilren屬性。如下:
function Welcome(props) {
const {chilren,name}=props
return <h1>hello,{children},{name}</h1>
}
const e =
<div>
<Welcome />
<Welcome>aa</Welcome>
<Welcome name="jack">bb</Welcome>
</div>
拿bb舉例子來說,props中children='bb',name="jack"
自動執(zhí)行函數(shù),同時props傳入函數(shù),然后真實DOM渲染在容器中。

純函數(shù)
純函數(shù):普通函數(shù)function fn(props){return value},傳入相同的值,返回值不能改變。
function sum(a, b) {
return a + b
}
console.log(1,2)
console.log(1,2)
console.log(1,2)
不是純函數(shù):傳入相同的值,返回值可能改變
let p = 0;
function sum(a, b) {
a = p++;
return a + b
}
console.log(1,2)
console.log(1,2)
console.log(1,2)
組件組合--組件樹
業(yè)務模塊,學校-班級-教師-學生
依靠props傳遞數(shù)據(jù),基于props引申出單向數(shù)據(jù)流的概念,從上到下數(shù)據(jù)流動,即school-student
let data = {
school: {
name: '一中',
classes: [
{
name: 'YI班',
teacher: 'Mr.Wang',
students: [
{
name: '小紅1',
age: 18
},
{
name: '小紅2',
age: 18
},
{
name: '小紅3',
age: 18
},
]
},
{
name: 'ER班',
teacher: 'Mr.Li',
students: [
{
name: '小紅4',
age: 18
},
{
name: '小紅5',
age: 18
},
{
name: '小紅6',
age: 18
},
]
},
{
name: 'SAN班',
teacher: 'Mr.Zhang',
students: [
{
name: '小紅7',
age: 18
},
{
name: '小紅8',
age: 18
},
{
name: '小紅9',
age: 18
},
]
},
]
}
}
//--定義組件(組件及關(guān)系)
//-定義幾個組件?
function Student(props) {
return <div>學員名</div>
}
function Teacher(props) {
return <div>老師名</div>
}
function Class(props) {
return <div>
<h2>班級名</h2>
<Teacher />
<Student />
<Student />
<Student />
</div>
}
function School(props) {
return <div>
<h2>學校名</h2>
<Class />
<Class />
<Class />
</div>
}
//-組件關(guān)系?
//--根組件定義
const e = <School data="data.school" />
顯示:

需求:將數(shù)據(jù)傳入根組件中,然后依次傳向子組件,形成數(shù)據(jù)流。
代碼實現(xiàn):
function Student(props) {
const {StudentData} = props
return <div>
學員名:{StudentData[0].name},age:{StudentData[0].age};
學員名:{StudentData[1].name},age:{StudentData[1].age};
學員名:{StudentData[2].name},age:{StudentData[2].age}
</div>
}
function Teacher(props) {
const {TeacherName} = props
return <div>{TeacherName}</div>
}
function Class(props) {
const { classes } = props
return <div>
<h2>班級名{classes.name}</h2>
<Teacher TeacherName={classes.teacher}/>
<Student StudentData={classes.students}/>
<Student StudentData={classes.students}/>
<Student StudentData={classes.students}/>
</div>
}
function School(props) {
// console.log(props)
const { schoolData } = props
return <div>
<h2>學校名{schoolData.name}</h2>
<Class classes={schoolData.classes[0]} />
<Class classes={schoolData.classes[1]} />
<Class classes={schoolData.classes[2]} />
</div>
}
//--根組件定義
const e = <School schoolData={data.school} />
界面顯示:

中秋節(jié)快樂,闔家團圓,團團圓圓,捉住中秋的尾巴,23:55.晚安
更新
組件抽離
一個項目被接單后由項目組長進行項目分析然后將任務分解給成員,通常react中有多個組件被分別書寫。這就涉及到了必不可少的項目拆分。
從后臺接口返回的json數(shù)據(jù)要渲染在前臺的頁面上,通常是利用到props進行傳值。
例如
function Compo(){
}
var data = {
user:{
name:"小紅",
age:"18"
},
hobby:"吃飯"
}
ReactDOM.render(<Compo />, document.getElementById("app"))
想要將data中的數(shù)據(jù)在函數(shù)組件中使用,于是在封裝組件處傳入
同時在function Compo(props)處書寫props來傳遞json數(shù)據(jù)。并利用解構(gòu)賦值來獲取data中的每一項數(shù)據(jù)key值
function Compo(props){
const {user,hobby} = props.data
}
var data = {
user:{
name:"小紅",
age:"18"
},
hobby:"吃飯"
}
ReactDOM.render(<Compo data={data} />, document.getElementById("app"))
此時已經(jīng)獲取到了data中大致數(shù)據(jù),進一步想要將用戶名稱,年齡,愛好,封裝成三個不同的函數(shù)組件。于是書寫:
function User(props) {
return <div>用戶名</div>
}
function Content(props) {
return <div>愛好</div>
}
進一步如何將根組件Compo中數(shù)據(jù)流向子組件User與Content中。
function User(props) {return <div>用戶名</div>}
function Content(props) {return <div>愛好</div>}
function Compo(props){
const {user,hobby} = props.data
return <div><User></User><Content></Content></div>
}
通過同樣的方式 在User組件與Content組件中通過props傳入數(shù)據(jù)。
function User(props) {
const {userData} = props.userData
return <div>{userData.name} {userData.age}</div> //即可獲得到name 與 age.
}
const {user,hobby} = props.data
return <div><User userData={user}></User></div>以上就是react component function組件使用詳解的詳細內(nèi)容,更多關(guān)于react component function的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
react項目升級報錯,babel報錯,.babelrc配置兼容等問題及解決
這篇文章主要介紹了react項目升級報錯,babel報錯,.babelrc配置兼容等問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
解決React?hook?'useState'?cannot?be?called?in?
這篇文章主要為大家介紹了React?hook?'useState'?cannot?be?called?in?a?class?component報錯解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
react+react-beautiful-dnd實現(xiàn)代辦事項思路詳解
這篇文章主要介紹了react+react-beautiful-dnd實現(xiàn)代辦事項,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
關(guān)于React動態(tài)加載路由處理的相關(guān)問題
這篇文章主要介紹了關(guān)于React動態(tài)加載路由處理的相關(guān)問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01
React 使用browserHistory項目訪問404問題解決
這篇文章主要介紹了React 使用browserHistory項目訪問404問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06

