react組件

最近正在學(xué)習(xí)react检痰,在看《深入淺出react和redux》這本書,感覺還不錯痢艺,內(nèi)容淺顯易懂。就打算做一下學(xué)習(xí)筆記介陶,免得到時候七忘八忘

一堤舒、組件數(shù)據(jù)


(1)props和state

子組件訪問外部的父組件,需要通過props才能獲取父組件傳遞的內(nèi)容哺呜,他是組件的對外接口舌缤。可以傳函數(shù)某残,也可以是屬性国撵,但是不可以修改props;而state用于內(nèi)部狀態(tài)數(shù)據(jù)的使用玻墅。

(2)接口規(guī)范

組件對外聲明了介牙,我支持哪些prop,又需要什么樣的格式澳厢。雖然這是一種限制环础,但是對于propTypes的檢查囚似,可以很容易發(fā)現(xiàn)錯誤的引用方式,可盡早發(fā)現(xiàn)代碼錯誤喳整,舉個栗子:

ChildrenComponent.propTypes = {
    initValue : propTypes.number.isRequired,
    str: propTypes.string
    modify: propTypes.func
}

以上代碼指定了,initValue是數(shù)值類型裸扶,且當(dāng)使用isRequired時則表示這個屬性是必須的框都,同理str指定字符串類型,modify指定函數(shù)類型呵晨。

需要注意的是魏保,如果不使用聲明,對組件沒有影響摸屠,就算是錯誤引用也不會報錯的谓罗。

這些聲明必定是要占用內(nèi)存資源的,目的只是為了輔助開發(fā)季二。在生產(chǎn)環(huán)境中檩咱,這些并沒有意義,在正式發(fā)布的時候胯舷,可以npm安裝babel-react-optimize抹除propTypes刻蚯。

(3)props默認聲明

在子組件中,對父組件傳遞過來的屬性桑嘶,存放到state中炊汹,但是如果像str,則不一定有傳遞這個屬性逃顶,所以要加上邏輯判斷讨便。

constructor(props) {
    this.state = {
        title: props.str || ""
    }
}

但是如果屬性很多,就會造成邏輯充斥代碼以政,我們可以再子組件中提前聲明默認props值霸褒。

ChildrenComponent.defaultProps = {
    str: ""
}
// 父組件
this.state = {
    title: props.str
}

(4)setState

在開發(fā)中,我們可以發(fā)現(xiàn)盈蛮,對state屬性賦值的時候傲霸,如果使用this.state.屬性 = xxx,則發(fā)現(xiàn)頁面上的數(shù)據(jù)沒有發(fā)生變化眉反,而正確的做法是使用this.setState({屬性: xxx})昙啄。

this.state賦值的方式只是暴力地修改了組件內(nèi)部的狀態(tài),并沒有驅(qū)動組件進行重新渲染寸五,而setState可以做到這一點梳凛。

二、組件生命周期


(1)裝載過程

當(dāng)組件第一次被渲染時候梳杏。函數(shù)的調(diào)用次序:

  • constructor

    當(dāng)創(chuàng)造一個組件的實例時韧拒,必定會執(zhí)行構(gòu)造函數(shù)淹接,在這里可以初始化state,綁定成員的this環(huán)境叛溢。

     constructor(props) {
        super(props);
        this.incrementBtn = this.incrementBtn.bind(this);
        this.state = {
          count: props.initValue
        }
     }
    
  • getInitialState

    使用React.createClass創(chuàng)造組件時使用的塑悼,返回值用來初始this.state

  • getDefaultProps

    使用React.createClass創(chuàng)造組件時使用的楷掉,返回值用來設(shè)置默認的props厢蒜。

  • componentWillMount

    在render渲染之前執(zhí)行,此時沒有渲染任何東西烹植,在這邊做的事都可以挪到constructor中去做斑鸦。

  • render

    一個組件的靈魂(必不可少的部分),渲染界面草雕。

  • componentDidMount

    render函數(shù)被調(diào)用之后巷屿,這個函數(shù)并不會立馬被調(diào)用,而是會等到引用該組件的父組件中的render函數(shù)全部渲染之后墩虹,最后依次調(diào)用各個子組件的componentDidMount嘱巾,并且只會在瀏覽器端執(zhí)行。

(2)更新過程

注意:并不是所有的更新都會執(zhí)行下面的函數(shù)

  • componentWillReceiveProps

    當(dāng)父組件的render被調(diào)用時诫钓,子組件也會相應(yīng)地跟新浓冒,此時不管傳給子組件的props是否發(fā)生變化,都會觸發(fā)尖坤。所以props變化是觸發(fā)這個函數(shù)的充分不必要條件稳懒。

  • shouldComponentUpdate

    根據(jù)state前后數(shù)據(jù)和props前后數(shù)據(jù)來決定一個組件需不需要被重新渲染,返回結(jié)果為boolean值慢味,如果為true先嬉,則會調(diào)用componentWillUpdate莉钙、render袱瓮、 componentDidUpdate 函數(shù)逊拍,否則都不會執(zhí)行。

    主要作用:減少不必要的重新渲染驰唬,提高性能顶岸。

    shouldComponentUpdate(nextProps, nextState) { 
      return (nextProps.title !== this.props.title} ||                      (nextState.sum !==this.state.sum); 
    }
    
  • componentWillUpdate

  • render

  • componentDidUpdate

這三個函數(shù)執(zhí)行過程與裝載過程最后三個類似

(3)卸載過程

  • componentWillUnmount

    當(dāng)組件從DOM樹上刪除后,就會被調(diào)用叫编,用于做清理工作

三辖佣、向外傳遞數(shù)據(jù)


當(dāng)父組件想要獲取子組件的prop時,可以傳遞給子組件一個提前定義好的函數(shù)搓逾,而子組件只需要通過prop調(diào)用函數(shù)卷谈,并傳遞參數(shù),父組件就能獲取霞篡。但是通過propTypes不能限制函數(shù)的參數(shù)格式世蔗,還是要需要自己多注意端逼。

state和prop的局限性

  • 當(dāng)組件和父組件中的數(shù)據(jù)有了重復(fù),如果由于某種原因?qū)е聰?shù)據(jù)不一致污淋,比如回調(diào)沒有執(zhí)行顶滩,那么就會出現(xiàn)問題,這時候應(yīng)該要有一個全局的狀態(tài)來保持一致寸爆,來作為唯一可靠的數(shù)據(jù)來源礁鲁。
  • 如果祖父組件想要傳遞數(shù)據(jù)給孫子組件,那么還要經(jīng)過父組件而昨,可能這個數(shù)據(jù)對父組件根本沒啥用救氯,但也得乖乖中轉(zhuǎn)

要解決這些問題就要靠flux和redux的Store了找田。

下一章redux待續(xù)...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歌憨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子墩衙,更是在濱河造成了極大的恐慌务嫡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漆改,死亡現(xiàn)場離奇詭異心铃,居然都是意外死亡,警方通過查閱死者的電腦和手機挫剑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門去扣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人樊破,你說我怎么就攤上這事愉棱。” “怎么了哲戚?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵奔滑,是天一觀的道長。 經(jīng)常有香客問我顺少,道長朋其,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任脆炎,我火速辦了婚禮梅猿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秒裕。我一直安慰自己粒没,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布簇爆。 她就那樣靜靜地躺著癞松,像睡著了一般爽撒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上响蓉,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天硕勿,我揣著相機與錄音,去河邊找鬼枫甲。 笑死源武,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的想幻。 我是一名探鬼主播粱栖,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脏毯!你這毒婦竟也來了闹究?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤食店,失蹤者是張志新(化名)和其女友劉穎渣淤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吉嫩,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡价认,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了自娩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片用踩。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖忙迁,靈堂內(nèi)的尸體忽然破棺而出脐彩,到底是詐尸還是另有隱情,我是刑警寧澤动漾,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布丁屎,位于F島的核電站,受9級特大地震影響旱眯,放射性物質(zhì)發(fā)生泄漏晨川。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一删豺、第九天 我趴在偏房一處隱蔽的房頂上張望共虑。 院中可真熱鬧,春花似錦呀页、人聲如沸妈拌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尘分。三九已至猜惋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間培愁,已是汗流浹背著摔。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留定续,地道東北人谍咆。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像私股,于是被迫代替她去往敵國和親摹察。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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

  • 作為一個合格的開發(fā)者倡鲸,不要只滿足于編寫了可以運行的代碼供嚎。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個周閱讀 8,449評論 1 33
  • 目前旦签,react組件有三種寫法查坪,分別是es5的createClass寫法寸宏,es6的class寫法宁炫,以及statel...
    ZoomFunc閱讀 1,658評論 0 1
  • 生命周期流程圖簡單如下: 組件讓你把用戶界面分成獨立的,可重復(fù)使用的部分氮凝,并且將每個部分分開考慮羔巢。React.Co...
    Simple_Learn閱讀 1,079評論 0 0
  • 前言 本文篇幅有點長,希望看完后能給你帶去一些收獲罩阵;主要針對react組件化原理竿秆、與vue開發(fā)感知上的對比以及一些...
    辣筆小明閱讀 2,716評論 0 2
  • 畫山水口訣 書畫鑒賞典評收藏 4月18日 山為勾皴點,樹為彩墨染稿壁。畫前需定形幽钢,先從樹起跟。勾出樹枝干傅是,稍點樹梢墨匪燕。...
    逸塵居士閱讀 326評論 0 0