3

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?創(chuàng)建可重用的組建


為了創(chuàng)建真實(shí)可重用的組建铜涉,我們需要理解React自定義的組建和最好是選擇一個(gè)或另一個(gè)之間不同的可能性趟畏,最近椎瘟,一種新的組建類型被React提出阶淘,即聲明一個(gè)組建為無狀態(tài)的函數(shù)粤攒,掌握它栽渴,學(xué)會何時(shí)使用它和為什么要使用它尖坤,也越來越變的重要,

你可能已經(jīng)使用了組建的內(nèi)部狀態(tài)闲擦,但是或許你還不能清晰的使用它和它會帶來哪些問題慢味,

最好的學(xué)習(xí)方式是看例子,那么接下來墅冷,將會會用寫一個(gè)組建提供單一的目的并且轉(zhuǎn)化成可重用的一個(gè)組建纯路,

首先,讓我們退后一步繼續(xù)討論基本的概念寞忿,然后大步的創(chuàng)建生動(dòng)的組建樣式直到這章的最后驰唬,

在這個(gè)章節(jié)里:

-不同創(chuàng)建React組建的方式和如何選擇

-什么是無狀態(tài)組建,功能和狀態(tài)之間的不同

-狀態(tài)是如何運(yùn)行的,避免使用它

-定義清晰的Prop類型為每個(gè)組建為什么很重要叫编,怎樣產(chǎn)生動(dòng)態(tài)的文檔配合React Docgen

-一個(gè)真實(shí)的例子轉(zhuǎn)化耦合的組建成一個(gè)可重用的組建

-如何創(chuàng)建生動(dòng)的樣式從React storybook


創(chuàng)建類

我們已經(jīng)在第一章的時(shí)候辖佣,使用過elements顯示過組建,現(xiàn)在我們用另外一種方式定義組建

繼承自React.Component

推薦使用

主要的不同點(diǎn)

出去語法的差異搓逾,還有重要的不同卷谈,在使用的時(shí)候應(yīng)特別的注意,選擇最合適的

Props

createClass?

const Button = React.createClass({??

? ? ?propTypes: {? ??

? ? ? ? ? text: React.PropTypes.string,?

? ? ? },??

? ? ?getDefaultProps() {? ?

? ? ? ? ? ?return {? ? ? text: 'Click me!',? ? }??

? ? ?},??

? ? ?render() {? ??

? ? ? ? ? ? ?return{this.props.text}},?

})

如你所見恃逻,我們使用propTypes 屬性列出所有props傳遞給組建,然后使用getDefaultProps函數(shù)定義值藕施,

達(dá)到同樣目的用classes的寫法如下

class Button extends React.Component {??

? ? ? render() {? ??

? ? ? ? ? return{this.props.text}

? ? ? }?

}

Button.propTypes = {? text: React.PropTypes.string, }

Button.defaultProps = {? text: 'Click me!', }

state

const Button = React.createClass({?

? ? getInitialState() {? ??

? ? ? ? ? return {? ? ? text: 'Click me!',? ? }?

? ? },??

? ? render() { ?<button> ?return{this.state.text}}</button>},?

})

class Button extends React.Component {??

? ? ? constructor(props) {? ??

? ? ? ? ? super(props)

? ? ? ? ? this.state = {

? ? ? ? ? ? ? ?text: 'Click me!',? ?

? ? ? ? ? }??

? ? ? ?}??

? ? ?render() {? ? return{this.state.text}}

})

Autobinding

箭頭函數(shù) 解決事件綁定的一個(gè)方法是使用箭頭函數(shù)

() => this.setState() ?用babel轉(zhuǎn)化成

var _this = this;

(function () {? return _this.setState(); });

class Button extends React.Component {?

?handleClick() {? ? console.log(this)? }??

render() {? ? return <button onClick={()=>this.handleClick()}></button>}

}

這樣做不會有什么問題寇损,唯一的缺點(diǎn)是如果考慮性能的話還要理解代碼本身,其實(shí)裳食,箭頭函數(shù)的副作用,每一次render的時(shí)候如果遇到這些寫法矛市,都會重新用handleClick函數(shù)與this去綁定從而重新創(chuàng)建一個(gè)新的函數(shù),影響性能,

問題是诲祸,如果我們傳遞一個(gè)函數(shù)到子組建浊吏,子組建接受一個(gè)新的prop在每次更新的時(shí)候,導(dǎo)致無效的渲染救氯,這就是問題的出現(xiàn)找田,特別是如果組建是純的,最好的解決方式是綁定這個(gè)函數(shù)一次在組建的構(gòu)造函數(shù)里面着憨,

class Button extends React.Component {??

? ? ? ? constructor(props) {? ??

? ? ? ? ? ? ? ? ? super(props)? ?

? ? ? ? ? ? ? ? ? ?this.handleClick = this.handleClick.bind(this)??

? ? ? ?}?

? ? ? handleClick() {? ? console.log(this)? }?

? ? ? render() {? ? return <button onClick={this.handleClick}></button>} }

無狀態(tài)的組建

no state/lifecycle/refs/event handlers?


深入講解 有狀態(tài)和無狀態(tài)組建

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墩衙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子甲抖,更是在濱河造成了極大的恐慌漆改,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件准谚,死亡現(xiàn)場離奇詭異挫剑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柱衔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門樊破,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唆铐,你說我怎么就攤上這事捶码。” “怎么了或链?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵惫恼,是天一觀的道長。 經(jīng)常有香客問我澳盐,道長祈纯,這世上最難降的妖魔是什么令宿? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮腕窥,結(jié)果婚禮上粒没,老公的妹妹穿的比我還像新娘。我一直安慰自己簇爆,他們只是感情好癞松,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著入蛆,像睡著了一般响蓉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哨毁,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天枫甲,我揣著相機(jī)與錄音,去河邊找鬼扼褪。 笑死想幻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的话浇。 我是一名探鬼主播脏毯,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼幔崖!你這毒婦竟也來了抄沮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤岖瑰,失蹤者是張志新(化名)和其女友劉穎叛买,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹋订,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡率挣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了露戒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椒功。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖智什,靈堂內(nèi)的尸體忽然破棺而出动漾,到底是詐尸還是另有隱情,我是刑警寧澤荠锭,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布旱眯,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏删豺。R本人自食惡果不足惜共虑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呀页。 院中可真熱鬧妈拌,春花似錦、人聲如沸蓬蝶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丸氛。三九已至培愁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雪位,已是汗流浹背竭钝。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工梨撞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雹洗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓卧波,卻偏偏與公主長得像时肿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子港粱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

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

  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南螃成,這只是我在學(xué)習(xí)過程中的一些閱讀筆記,個(gè)人覺得該教程講解深入淺出查坪,比目前大...
    leonaxiong閱讀 2,833評論 1 18
  • 我到達(dá)南京的那天寸宏,南京正好下著多年來最大的一場雨夾雪。 很意外偿曙,今年看過最大的一場雪竟然不是在青海氮凝,而是在南京。 ...
    我是發(fā)兒呀閱讀 274評論 0 2
  • 很喜歡看玩具總動(dòng)員,之前一直喜歡巴斯光年启摄,臺詞動(dòng)人稿壁,后來無意中發(fā)現(xiàn)海洋堂山口式的胡迪的手辦,立刻被這猥瑣的警長深深...
    造作不矯情閱讀 1,590評論 8 7
  • 哈哈哈哈 哈哈哈哈
    sagajeanne閱讀 133評論 0 0