React 創(chuàng)建無狀態(tài)組件(stateless-components)

無狀態(tài)函數(shù)組件

創(chuàng)建無狀態(tài)函數(shù)式組件形式是從React 0.14版本開始出現(xiàn)的。它是為了創(chuàng)建純展示組件莱睁,這種組件只負(fù)責(zé)根據(jù)傳入的props來展示是己,不涉及到要state狀態(tài)的操作。具體的無狀態(tài)函數(shù)式組件竖配,其官方指出:

在大部分React代碼中颠焦,大多數(shù)組件被寫成無狀態(tài)的組件斩熊,通過簡單組合可以構(gòu)建成其他的組件等;這種通過多個簡單然后合并成一個大應(yīng)用的設(shè)計模式被提倡伐庭。

無狀態(tài)函數(shù)式組件形式上表現(xiàn)為一個只帶有一個render方法的組件類粉渠,通過函數(shù)形式或者ES6 arrow function的形式在創(chuàng)建,并且該組件是無state狀態(tài)的圾另。具體的創(chuàng)建形式如下:

ES5 純函數(shù)

function HelloComponent(props) {
    return <div>Hello,{props.name}</div>
}
ReactDOM.render(<HelloComponent name={"Word"}/>, document.getElementById('root'));

箭頭函數(shù)

const HelloComponent= props => (
    <div>Hello {props.name}</div>
)

無狀態(tài)組件的創(chuàng)建形式使代碼的可讀性更好霸株,并且減少了大量冗余的代碼,精簡至只有一個render方法集乔,大大的增強了編寫一個組件的便利去件,除此之外無狀態(tài)組件還有以下幾個顯著的特點:
1.組件不會被實例化,整體渲染性能得到提升
因為組件被精簡成一個render方法的函數(shù)來實現(xiàn)的扰路,由于是無狀態(tài)組件尤溜,所以無狀態(tài)組件就不會在有組件實例化的過程,無實例化過程也就不需要分配多余的內(nèi)存汗唱,從而性能得到一定的提升宫莱。
2.組件不能訪問this對象
無狀態(tài)組件由于沒有實例化過程,所以無法訪問組件this中的對象哩罪,例如:this.ref授霸、this.state等均不能訪問。若想訪問就不能使用這種形式來創(chuàng)建組件
3.組件無法訪問生命周期的方法
因為無狀態(tài)組件是不需要組件生命周期管理和狀態(tài)管理际插,所以底層實現(xiàn)這種形式的組件時是不會實現(xiàn)組件的生命周期方法碘耳。所以無狀態(tài)組件是不能參與組件的各個生命周期管理的。
4.無狀態(tài)組件只能訪問輸入的props腹鹉,同樣的props會得到同樣的渲染結(jié)果,不會有副作用
無狀態(tài)組件被鼓勵在大型項目中盡可能以簡單的寫法來分割原本龐大的組件敷硅,未來React也會這種面向無狀態(tài)組件在譬如無意義的檢查和內(nèi)存分配領(lǐng)域進行一系列優(yōu)化功咒,所以只要有可能愉阎,盡量使用無狀態(tài)組件[1]

React.memo()防止渲染[2]

const HelloComponent= props => (
    <div>Hello {props.name}</div>
)
export default React.memo(HelloComponent)

仍可使用ref功能[3]

無狀態(tài)組件內(nèi)部其實是可以使用ref功能的力奋,雖然不能通過this.refs訪問到榜旦,但是可以通過將ref內(nèi)容保存到無狀態(tài)組件內(nèi)部的一個本地變量中獲取到。[1]

function CustomTextInput(props) {
  // textInput must be declared here so the ref callback can refer to it
  let textInput = null;

  function handleClick() {
    textInput.focus();
  }

  return (
    <div>
      <input
        type="text"
        ref={(input) => { textInput = input; }} />
      <input
        type="button"
        value="Focus the text input"
        onClick={handleClick}
      />
    </div>
  );  
}

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溅呢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子猿挚,更是在濱河造成了極大的恐慌咐旧,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绩蜻,死亡現(xiàn)場離奇詭異铣墨,居然都是意外死亡,警方通過查閱死者的電腦和手機办绝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門伊约,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孕蝉,你說我怎么就攤上這事屡律。” “怎么了降淮?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵超埋,是天一觀的道長。 經(jīng)常有香客問我骤肛,道長纳本,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任腋颠,我火速辦了婚禮繁成,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淑玫。我一直安慰自己巾腕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布絮蒿。 她就那樣靜靜地躺著尊搬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪土涝。 梳的紋絲不亂的頭發(fā)上佛寿,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼冀泻。 笑死常侣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弹渔。 我是一名探鬼主播胳施,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肢专!你這毒婦竟也來了舞肆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤博杖,失蹤者是張志新(化名)和其女友劉穎椿胯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欧募,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡压状,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了跟继。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片种冬。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舔糖,靈堂內(nèi)的尸體忽然破棺而出娱两,到底是詐尸還是另有隱情,我是刑警寧澤金吗,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布十兢,位于F島的核電站,受9級特大地震影響摇庙,放射性物質(zhì)發(fā)生泄漏旱物。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一卫袒、第九天 我趴在偏房一處隱蔽的房頂上張望宵呛。 院中可真熱鬧,春花似錦夕凝、人聲如沸宝穗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逮矛。三九已至,卻和暖如春转砖,著一層夾襖步出監(jiān)牢的瞬間须鼎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晋控,地道東北人挑围。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像糖荒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子模捂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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