拯救react的hooks:react的問題和hooks的作用

react組件和react組件邏輯復(fù)用

react是一個視圖層組件方案攻人,最核心的功能就是綁定視圖與數(shù)據(jù)和邏輯,實(shí)現(xiàn)響應(yīng)式的渲染悬槽。react的組件最核心的就是渲染出的Vdom怀吻,也就是jsx的部分。

渲染jsx的這部分邏輯封裝在一個函數(shù)內(nèi)就可以了初婆,這就是函數(shù)組件蓬坡,組件的最基本形態(tài)。渲染結(jié)果只與參數(shù)有關(guān)烟逊,參數(shù)相同渣窜,每次渲染結(jié)果都相同。但有的情況下宪躯,每次渲染是不相同的,需要一個上下文來保存狀態(tài)位迂,所以會用class來封裝這部分邏輯访雪,渲染的那部分核心邏輯移到了render函數(shù)中,這就是 class 組件掂林,組件的第二種形態(tài)臣缀。類組件除了能夠保存狀態(tài),使得每次渲染結(jié)果與狀態(tài)有關(guān)之外泻帮,還可以在一些組件的執(zhí)行階段加入一些處理邏輯精置,也就是生命周期函數(shù)。

組件之間有復(fù)用的需求锣杂,有一些可復(fù)用的邏輯需要從組件中抽取出來脂倦,變成可復(fù)用的形態(tài),函數(shù)的邏輯復(fù)用套一層函數(shù)就好了元莫,也就是高階組件(HOC)赖阻,類組件的復(fù)用可以傳入一個參數(shù)作為渲染內(nèi)容,其余部分為可復(fù)用部分踱蠢,這就是render props火欧。 這兩種方案就是16.8版本之前的react所支持的組件間邏輯復(fù)用方案了。

邏輯復(fù)用方案hoc和render props的問題

但render props會多生成一層組件茎截,HOC會改變組件名苇侵,這樣在調(diào)試時會發(fā)現(xiàn)組件樹特別不直觀。而且類組件的方案中處理同一個事情的邏輯可能會散亂在多個生命周期函數(shù)中企锌,使得組件變得越來越臃腫榆浓。種種原因,使得類組件霎俩、函數(shù)組件這兩種組件形態(tài)哀军,和HOC還有render props這兩種擴(kuò)展方式繼續(xù)進(jìn)行變革沉眶,來解決越來越嚴(yán)重的組件維護(hù)和邏輯復(fù)用問題。

hooks 的設(shè)計(jì)思路

渲染出Vdom也就是jsx的部分杉适,是一個組件最核心的功能谎倔,使用類組件只是因?yàn)橛幸恍顟B(tài)需要上下文來管理,于是按照這個思路猿推,react在16.8中加入了hooks片习,可以在函數(shù)組件中添加一些有自己獨(dú)立上下文管理的狀態(tài)(useState),不再依賴于類組件蹬叭,同時一些邏輯也可以放到hooks中來復(fù)用(useEffects)藕咏。

注意,hooks之間的狀態(tài)是各自獨(dú)立維護(hù)的秽五,這和mixins不同孽查,mixins只是會把邏輯混到一個上下文中,使得之間會相互影響坦喘。而每個hooks之間都是獨(dú)立的上下文盲再,不會有mixins方案的問題。

這樣之后組件形態(tài)就在函數(shù)組件(無狀態(tài))瓣铣,類組件之外多了函數(shù)組件(hooks管理狀態(tài))的第三種組件形態(tài)答朋,擴(kuò)展方式也在HOC、render props之外加入了hooks的組合的方案(custom hooks)棠笑。這樣就完美的解決了組件樹不直觀梦碗、類組件難維護(hù)、邏輯不易復(fù)用這幾個問題蓖救。

hooks的優(yōu)缺點(diǎn)

hooks相當(dāng)于補(bǔ)充了一個render前后的生命周期洪规,很多邏輯可以移到這里面來,能夠優(yōu)雅的實(shí)現(xiàn)之前要在多個生命周期中才能完成的功能藻糖。具體的一些例子可以看(官方文檔
)淹冰。

當(dāng)然hooks也不是完美的,他也有自己的問題巨柒,比如hooks是每次渲染都執(zhí)行的樱拴,所以性能是個問題,react的useEffects hooks支持第二個參數(shù)洋满,可以傳入依賴的狀態(tài)變量晶乔,只有在變量改變時才會執(zhí)行,也可以傳入一個空數(shù)組牺勾,這樣就只執(zhí)行一次正罢。

總結(jié)

視圖層組件最核心的就是渲染出vdom也就是jsx的部分,函數(shù)組件是基本形態(tài)驻民,有狀態(tài)時可以使用類組件形態(tài)翻具,組件間邏輯復(fù)用可以使用函數(shù)組件的HOC和類組件render props來實(shí)現(xiàn)履怯,但這種狀態(tài)下,存在組件樹不直觀裆泳、類組件難維護(hù)叹洲、組件的有狀態(tài)邏輯難復(fù)用的問題,所以react 16.8加入了hooks的方案工禾。每個hooks獨(dú)立的上下文來維護(hù)狀態(tài)运提,可以添加到函數(shù)組件中,這樣函數(shù)組件就可以完成一些有狀態(tài)的邏輯闻葵。邏輯復(fù)用方案也在HOC和render props之外加入了 custom hooks的方式民泵。但hooks也不是完美的,他也有性能問題槽畔,因?yàn)槊看蝦ender 都會調(diào)用栈妆,所以需要指定依賴的狀態(tài)變量來優(yōu)化性能。

hooks拯救react于一些越來越突出的問題之中竟痰,算是react的一個轉(zhuǎn)折點(diǎn)吧签钩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坏快,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌憎夷,老刑警劉巖莽鸿,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拾给,居然都是意外死亡祥得,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蒋得,熙熙樓的掌柜王于貴愁眉苦臉地迎上來级及,“玉大人,你說我怎么就攤上這事额衙∫梗” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵窍侧,是天一觀的道長县踢。 經(jīng)常有香客問我,道長伟件,這世上最難降的妖魔是什么硼啤? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮斧账,結(jié)果婚禮上谴返,老公的妹妹穿的比我還像新娘煞肾。我一直安慰自己,他們只是感情好嗓袱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布籍救。 她就那樣靜靜地躺著,像睡著了一般索抓。 火紅的嫁衣襯著肌膚如雪钧忽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天逼肯,我揣著相機(jī)與錄音耸黑,去河邊找鬼。 笑死篮幢,一個胖子當(dāng)著我的面吹牛大刊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播三椿,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼缺菌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搜锰?” 一聲冷哼從身側(cè)響起伴郁,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛋叼,沒想到半個月后焊傅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狈涮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年狐胎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌馍。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡握巢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出松却,到底是詐尸還是另有隱情暴浦,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布玻褪,位于F島的核電站肉渴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏带射。R本人自食惡果不足惜同规,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧券勺,春花似錦绪钥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至儒拂,卻和暖如春寸潦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背社痛。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工见转, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒜哀。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓斩箫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撵儿。 傳聞我的和親對象是個殘疾皇子乘客,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353