React學(xué)習(xí)筆記—React組件

1胶征、Component

React的首要思想是通過(guò)組件(Component)來(lái)開(kāi)發(fā)應(yīng)用。所謂組件,簡(jiǎn)單說(shuō),指的是能完成某個(gè)特功能的獨(dú)立的柠新、可重用的代碼。

基于組件的應(yīng)用開(kāi)發(fā)是廣泛使用的軟件開(kāi)發(fā)模式镰烧,用分而治之的方法把一個(gè)大的應(yīng)用分解成若干小的組件乔询,每個(gè)組件只關(guān)注于某個(gè)小范圍的特定功能,但是把組件組合起來(lái)逢倍,就能夠構(gòu)成一個(gè)功能龐大的應(yīng)用捧颅。如果分解功能的過(guò)程足夠巧妙,那么每個(gè)組件可以在不同場(chǎng)景下重用较雕,那樣不光可以構(gòu)建龐大的應(yīng)用隘道,還可以構(gòu)建出靈活的應(yīng)用。打個(gè)比方郎笆,每個(gè)組件是一塊磚谭梗,而一個(gè)應(yīng)用是一座樓,想要一次鍛造就創(chuàng)建一座樓是不現(xiàn)實(shí)的宛蚓。實(shí)際上激捏,總是先鍛造很多磚,通過(guò)排列組合這些磚凄吏,才能構(gòu)建偉大的建筑远舅。

任何一個(gè)復(fù)雜的應(yīng)用,都是由一個(gè)簡(jiǎn)單的應(yīng)用發(fā)展而來(lái)痕钢,當(dāng)應(yīng)用還很簡(jiǎn)單的時(shí)候图柏,因?yàn)楣δ芎苌伲赡苤挥幸粋€(gè)組件就足夠了任连,但是蚤吹,隨著功能的增加,把越來(lái)越多的功能放在一個(gè)組件中就會(huì)顯得臃腫和難以管理。

就和一個(gè)人最好一次只專(zhuān)注做一件事情一樣裁着,也應(yīng)該盡量保持一個(gè)組件只做一件事繁涂。當(dāng)開(kāi)發(fā)者發(fā)現(xiàn)一個(gè)組件功能太多代碼量太大的時(shí)候,就要考慮拆分這個(gè)組件二驰,用多個(gè)小的組件來(lái)代替扔罪。每個(gè)小的組件只關(guān)注實(shí)現(xiàn)單個(gè)功能,但是這些功能組合起來(lái)桶雀,也能滿足復(fù)雜的實(shí)際需求矿酵。

這就是“分而治之”的策略,把問(wèn)題分解為多個(gè)小問(wèn)題矗积,這樣即容易解決也方便維護(hù)坏瘩,雖然“分而治之”是一個(gè)好策略,但是不要濫用漠魏,只有必要的時(shí)候才去拆分組件倔矾,不然可能得不償失。

拆分組件最關(guān)鍵的就是確定組件的邊界柱锹,每個(gè)組件都應(yīng)該是可以獨(dú)立存在的哪自,如果兩個(gè)組件邏輯太緊密,無(wú)法清晰定義各自的責(zé)任禁熏,那也許這兩個(gè)組件本身就不應(yīng)該被拆開(kāi)壤巷,作為同一個(gè)組件也許更合理。

雖然組件是應(yīng)該獨(dú)立存在的瞧毙,但是并不是說(shuō)組件就是孤島一樣的存在胧华,不同組件之間總是會(huì)有通信交流,這樣才可能合起來(lái)完成更大的功能宙彪。

作為軟件設(shè)計(jì)的通則矩动,組件的劃分要滿足高內(nèi)聚和低耦合的原則。

高內(nèi)聚指的是把邏輯緊密相關(guān)的內(nèi)容放在一個(gè)組件中释漆。用戶界面無(wú)外乎內(nèi)容悲没、交互和樣式。傳統(tǒng)上男图,內(nèi)容由HTML表示示姿,交互行放在JavaScript代碼文件中,樣式放在CSS文件中定義逊笆。這雖然滿足一個(gè)功能模塊的需要栈戳,卻要放在三個(gè)不同的文件中,這樣其實(shí)不滿足高內(nèi)聚的原則难裆。React卻不是這樣子檀,展示內(nèi)容的JSX、定義行為的JavaScript代碼,甚至定義樣式的CSS命锄,都可以放在一個(gè)JavaScript文件中,因?yàn)樗鼈儽緛?lái)就是為了一個(gè)目的而存在的偏化,所以說(shuō)React天生具有高內(nèi)聚的特點(diǎn)脐恩。

低耦合指的是不同組件之間的依賴(lài)關(guān)系要盡量弱化,也就是每個(gè)組件要盡量獨(dú)立侦讨。保持整個(gè)系統(tǒng)的低耦合度驶冒,需要對(duì)系統(tǒng)中的功能有充分的認(rèn)識(shí),然后根據(jù)功能點(diǎn)劃分模塊韵卤,讓不同的組件去實(shí)現(xiàn)不同的功能骗污。

2、類(lèi)定義/函數(shù)定義組件

類(lèi)定義組件:

使用ES6 class 來(lái)定義一個(gè)組件:

import React, { Component } from 'react';

class Title extends Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>
  }
}

或者你也可以這樣寫(xiě):

import React from 'react';

class Title extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>
  }
}

在代碼的第一行沈条,我們從react庫(kù)中引入了React和Component需忿,Component作為所有組件的基類(lèi),提供了很多組件共有的功能蜡歹,class Title extends Component {}屋厘,Title組件的父類(lèi)就是Component。

仔細(xì)看上面的代碼會(huì)發(fā)現(xiàn)我們導(dǎo)入的Component類(lèi)在Title組件定義中被使用了月而,可是導(dǎo)入的React卻沒(méi)有被使用汗洒,試著刪除第一行的React網(wǎng)頁(yè)會(huì)立刻報(bào)錯(cuò)。

原因是在使用JSX的范圍內(nèi)必須有React父款。也就是說(shuō)溢谤,在使用JSX的代碼文件中,即使代碼并沒(méi)有直接使用React憨攒,也一定要導(dǎo)入這個(gè)React世杀,這是因?yàn)镴SX最終會(huì)被轉(zhuǎn)譯成依賴(lài)于React的表達(dá)式。

函數(shù)定義組件:

定義一個(gè)組件最簡(jiǎn)單的方式是使用JavaScript函數(shù):

// 函數(shù)定義組件
function Title(props) {
  return <h1>Hello, {props.name}</h1>
}
// 箭頭函數(shù)語(yǔ)法
const Title = props => <h1>Hello, {props.name}</h1>
// 解構(gòu)賦值語(yǔ)法
const Title = ({name}) => <h1>Hello, {name}</h1>

該函數(shù)是一個(gè)有效的React組件肝集,它接收一個(gè)單一的“props”對(duì)象并返回了一個(gè)React元素玫坛。我們之所以稱(chēng)這種類(lèi)型的組件為函數(shù)定義組件,是因?yàn)閺淖置嫔蟻?lái)看包晰,它就是一個(gè)JavaScript函數(shù)湿镀。

補(bǔ)充:在React出現(xiàn)之初,使用的是React.createClass方式來(lái)創(chuàng)造組件類(lèi)伐憾,這種方式已經(jīng)被廢棄了勉痴。

3、React組件的數(shù)據(jù)

React組件的數(shù)據(jù)分為兩種树肃,props和state蒸矛,無(wú)論props或者state的改變,都可能已發(fā)組件的重新渲染。props是組件的對(duì)外接口雏掠,state是組件的內(nèi)部狀態(tài)斩祭,對(duì)外用props,內(nèi)部用state乡话。

React的props:

在React中摧玫,props是從外部傳遞給組件的數(shù)據(jù),一個(gè)React組件通過(guò)定義自己能夠接受的props就定義了自己的對(duì)外公共接口绑青。

每個(gè)React組件都是獨(dú)立存在的模塊诬像,組件之外的一切都是外部世界,外部世界就是通過(guò)props和組件對(duì)話的闸婴。

我們先從外部世界來(lái)看

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坏挠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子邪乍,更是在濱河造成了極大的恐慌降狠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庇楞,死亡現(xiàn)場(chǎng)離奇詭異喊熟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)姐刁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)芥牌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人聂使,你說(shuō)我怎么就攤上這事壁拉。” “怎么了柏靶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵弃理,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我屎蜓,道長(zhǎng)痘昌,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任炬转,我火速辦了婚禮辆苔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扼劈。我一直安慰自己驻啤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布荐吵。 她就那樣靜靜地躺著骑冗,像睡著了一般赊瞬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贼涩,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天巧涧,我揣著相機(jī)與錄音,去河邊找鬼遥倦。 笑死谤绳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谊迄。 我是一名探鬼主播闷供,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼烟央,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼统诺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起疑俭,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粮呢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后钞艇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體啄寡,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年哩照,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挺物。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡飘弧,死狀恐怖识藤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情次伶,我是刑警寧澤痴昧,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站冠王,受9級(jí)特大地震影響赶撰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柱彻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一豪娜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哟楷,春花似錦侵歇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坟冲。三九已至,卻和暖如春溃蔫,著一層夾襖步出監(jiān)牢的瞬間健提,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工伟叛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留私痹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓统刮,卻偏偏與公主長(zhǎng)得像紊遵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侥蒙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 3. JSX JSX是對(duì)JavaScript語(yǔ)言的一個(gè)擴(kuò)展語(yǔ)法暗膜, 用于生產(chǎn)React“元素”,建議在描述UI的時(shí)候...
    pixels閱讀 2,826評(píng)論 0 24
  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,065評(píng)論 2 35
  • 本筆記基于React官方文檔鞭衩,當(dāng)前React版本號(hào)為15.4.0学搜。 1. 安裝 1.1 嘗試 開(kāi)始之前可以先去co...
    Awey閱讀 7,706評(píng)論 14 128
  • 最近看了一本關(guān)于學(xué)習(xí)方法論的書(shū),強(qiáng)調(diào)了記筆記和堅(jiān)持的重要性论衍。這幾天也剛好在學(xué)習(xí)React瑞佩,所以我打算每天堅(jiān)持一篇R...
    gaoer1938閱讀 1,684評(píng)論 0 5
  • 原教程內(nèi)容詳見(jiàn)精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過(guò)程中的一些閱讀筆記坯台,個(gè)人覺(jué)得該教程講解深入淺出炬丸,比目前大...
    leonaxiong閱讀 2,835評(píng)論 1 18