淺析React有狀態(tài)組件和無狀態(tài)組件

在適合的情況下疚俱,我們都應該且必須使用無狀態(tài)組件劝术。無狀態(tài)組件不像其他兩種方法在調(diào)用時會創(chuàng)建新實例,它創(chuàng)建時始終保持了一個實例呆奕,避免了不必要的檢查和內(nèi)存分配养晋,做到了內(nèi)部優(yōu)化×杭兀——摘自《深入 React 技術(shù)椛》

無狀態(tài)組件

無狀態(tài)組件又稱變現(xiàn)性組件或者木偶組件,為何叫木偶組件姆泻?因為它只關(guān)心數(shù)據(jù)傳遞props零酪,只能訪問輸入的 props冒嫡,同樣的 props 會得到同樣的渲染結(jié)果,不會有副作用四苇。

無狀態(tài)組件無法訪問生命周期的方法孝凌,因為它是不需要組件生命周期管理和狀態(tài)管理,所以底層實現(xiàn)這種形式的組件時是不會實現(xiàn)組件的生命周期方法月腋。所以無狀態(tài)組件是不能參與組件的各個生命周期管理的蟀架。

無狀態(tài)組件不會被實例化,無實例化過程也就不需要分配多余的內(nèi)存榆骚,所以相比有狀態(tài)組件辜窑,它的性能更優(yōu)。同樣寨躁,由于沒有實例化穆碎,所以無法訪問組件this中的對象,例如:this.ref职恳、this.state 等均不能訪問所禀。若想訪問就不能使用這種形式來創(chuàng)建組件。

它有兩種情況放钦,要么是純粹的渲染 html內(nèi)容色徘,不需要對數(shù)據(jù)進行判斷和處理。要么這個組件所需要的數(shù)據(jù)操禀,都是來自于父組件props傳遞來或者 Reduxstore 中的數(shù)據(jù))褂策,無狀態(tài)組件應該保持模板的純粹性。

const Title = (props) => (
    <div className="title-style">
        {props.word}
    </div>
)

export default Title;

有狀態(tài)組件

有狀態(tài)組件又被稱為容器組件或者聰明組件颓屑,它主要用來處理數(shù)據(jù)或者頁面邏輯交互斤寂。它比無狀態(tài)功能更加強大。類組件可以維護自身的狀態(tài)變量揪惦,即組件的state遍搞。

有狀態(tài)組件組件還有不同的生命周期方法,可以讓開發(fā)者能夠在組件的不同階段(掛載器腋、更新溪猿、卸載),對組件做更多的控制纫塌。

React組件中有狀態(tài)組件相當于一個樞紐站诊县。因為它就像一個容器,里面包含的是無狀態(tài)組件措左,在容器組件中獲取完數(shù)據(jù)后依痊,再將這些數(shù)據(jù)分配給子組件。就像下面的例子媳荒,Title是一個無狀態(tài)組件抗悍,數(shù)據(jù)在有狀態(tài)組件中處理完在傳遞給給Title驹饺,

import Title from './Title.js';
class Title extends React.Component{
    constructor(props){
        super(props);
        this.state={
             titleWord:'hello world'
        }
    }
    render(){
        return(
            <div className="title-style">
                <Title word={this.state.titleWord}/>
            </div>
        )
    }
}

export default Title;

從性能角度分析兩者區(qū)別

這里摘抄自如何為組件增加狀態(tài)?

通常缴渊,函數(shù)(function)與類(class)最大的區(qū)別是:是否能夠維護自己的數(shù)據(jù)(即狀態(tài))赏壹。函數(shù)基本上僅關(guān)注動作(action),而不關(guān)心數(shù)據(jù)的維護衔沼,不用維持一個狀態(tài)蝌借,不用把自己的數(shù)據(jù)保存在內(nèi)存中。函數(shù)使用的數(shù)據(jù)是從外部獲戎敢稀(或者不獲取數(shù)據(jù))菩佑,函數(shù)運行時,會完成一系列的動作凝化,最后將結(jié)果返回(也可能不返回稍坯,僅僅是完成指定的動作)。相對而言搓劫,類有能力維護狀態(tài)(保存數(shù)據(jù))瞧哟,也可以定義自己的一系列動作。

一般來說枪向,函數(shù)的速度較快勤揩,適合用于做表現(xiàn)層,而類能夠處理復雜邏輯和狀態(tài)秘蛔,適合做邏輯層和數(shù)據(jù)層陨亡。所以,對于 React 來說深员,一般選擇函數(shù)來無狀態(tài)組件负蠕,得到所謂的無狀態(tài)函數(shù)(stateless function),好處是渲染的速度快辨液,所以多使用無狀態(tài)組件虐急,盡量不要讓數(shù)據(jù)散落在各個組件中。數(shù)據(jù)集中管理可以更好的保持數(shù)據(jù)的一致性和可維護性滔迈。

有狀態(tài)組件就是使用類來生成。類可以有自己的狀態(tài)被辑,維護自己的數(shù)據(jù)燎悍,也是完全符合有狀態(tài)組件的要求。但是類相對來說速度比函數(shù)慢盼理,影響渲染的性能谈山,同時數(shù)據(jù)過于分散會給后期的維護帶來比較大的困難(這也是為什么狀態(tài)過多時要使用 Redux 的原因),因此要盡量控制有狀態(tài)組件的數(shù)量宏怔。當然奏路,類也可以生成無狀態(tài)組件畴椰,但是既然不需要維護狀態(tài)的工作,用函數(shù)能完成得更好鸽粉,其實也就沒有必要使用類來做無狀態(tài)組件斜脂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市触机,隨后出現(xiàn)的幾起案子帚戳,更是在濱河造成了極大的恐慌,老刑警劉巖儡首,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件片任,死亡現(xiàn)場離奇詭異,居然都是意外死亡蔬胯,警方通過查閱死者的電腦和手機对供,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氛濒,“玉大人产场,你說我怎么就攤上這事∑瞄伲” “怎么了涝动?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炬灭。 經(jīng)常有香客問我醋粟,道長,這世上最難降的妖魔是什么重归? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任米愿,我火速辦了婚禮,結(jié)果婚禮上鼻吮,老公的妹妹穿的比我還像新娘育苟。我一直安慰自己,他們只是感情好椎木,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布违柏。 她就那樣靜靜地躺著,像睡著了一般香椎。 火紅的嫁衣襯著肌膚如雪漱竖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天畜伐,我揣著相機與錄音馍惹,去河邊找鬼。 笑死,一個胖子當著我的面吹牛万矾,可吹牛的內(nèi)容都是我干的悼吱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼良狈,長吁一口氣:“原來是場噩夢啊……” “哼后添!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起们颜,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吕朵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窥突,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體努溃,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年阻问,在試婚紗的時候發(fā)現(xiàn)自己被綠了梧税。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡称近,死狀恐怖第队,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刨秆,我是刑警寧澤凳谦,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站衡未,受9級特大地震影響尸执,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缓醋,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一如失、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧送粱,春花似錦褪贵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至动雹,卻和暖如春偎快,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洽胶。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姊氓。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓丐怯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翔横。 傳聞我的和親對象是個殘疾皇子读跷,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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