React 16.6 之 React.memo()

想去海邊

見識越廣,計較越少男应,經(jīng)歷越多,抱怨越少娱仔,越閑沐飘,越矯情。

React.memo()

React 16.6.0 正式發(fā)布了!這次主要更新了兩個新的重要功能:

  • React.memo()
  • React.lazy(): 使用 React Suspense 進行代碼拆分和懶加載

今天我們會重點介紹 React.memo()耐朴,后續(xù)會介紹 React.lazy() 和 Suspense借卧。


React.memo() 是什么?

React.memo() 和 PureComponent 很相似筛峭,它幫助我們控制何時重新渲染組件铐刘。

組件僅在它的 props 發(fā)生改變的時候進行重新渲染。通常來說影晓,在組件樹中 React 組件镰吵,只要有變化就會走一遍渲染流程。但是通過 PureComponent 和 React.memo()挂签,我們可以僅僅讓某些組件進行渲染疤祭。

const ToBeBetterComponent = React.memo(function MyComponent(props) {
  // only renders if props have changed
})

由于只有需要被渲染的組件被渲染了,所以這是一個性能提升饵婆。

PureComponent 要依靠 class 才能使用勺馆。而 React.memo() 可以和 functional component 一起使用。

import React from 'react';

const MySnowyComponent = React.memo(function MyComponent(props) {
  // only renders if props have changed!
});

// can also be an es6 arrow function
const OtherSnowy = React.memo(props => {
  return <div>my memoized component</div>;
});

// and even shorter with implicit return
const ImplicitSnowy = React.memo(props => (
  <div>implicit memoized component</div>
));

包裹已有的組件

由于 React.memo() 是一個高階組件侨核,你可以使用它來包裹一個已有的 functional component:

const RocketComponent = props => <div>my rocket component. {props.fuel}!</div>;

// create a version that only renders on prop changes
const MemoizedRocketComponent = React.memo(RocketComponent);

為什么它被稱作 memo谓传?

在維基百科上是這么說的:

在計算機領域,記憶化是一種主要用來提升計算機程序速度的優(yōu)化技術方案芹关。它將開銷較大的函數(shù)調(diào)用的返回結(jié)果存儲起來续挟,當同樣的輸入再次發(fā)生時,則返回緩存好的數(shù)據(jù)侥衬,以此提升運算效率诗祸。

注: 在 《JavaScript 忍者秘籍》的 3.2.2 節(jié)中「自記憶函數(shù)」中有這樣的介紹:記憶化是一種構(gòu)建函數(shù)的處理過程,能夠記住上次計算結(jié)果轴总。在這個果殼里直颅,當函數(shù)計算得到結(jié)果時就將該結(jié)果按照參數(shù)存儲起來。采用這種方式時怀樟,如果另外一個調(diào)用也使用相同的參數(shù)功偿,我們則可以直接返回上次存儲的結(jié)果而不是再計算一遍。像這樣避免既重復又復雜的計算可以顯著地提高性能往堡。

這就是 React.memo() 所做的事情械荷,所以叫做 memo 也很說得通。它會檢查接下來的渲染是否與前一次的渲染相同虑灰,如果兩者是一樣的吨瞎,那么就會保留上一次的渲染結(jié)果。

也有人在 Twitter 上問了 Dan 這個問題穆咐,Dan 解釋了為什么它叫做 memo 而不是像 PureComponent 那樣颤诀,被叫做 memo

Memoized component. There was a lot of feedback on the RFC which we agree with — "pure" naming is confusing because memoization (which is what memo does) has nothing to do with function "purity".


結(jié)論

這是一個對于 React 非常有用的新功能字旭,因為我們之前只能使用 class component 來利用 PureComponent 帶來的性能優(yōu)勢。而現(xiàn)在崖叫,我們有了 React.memo()遗淳,就可以使用 functional component 了!


絮絮叨叨

最近對好多事情都提不起勁心傀,整個人都非常的不積極洲脂,這狀態(tài)真的很差勁。我覺得還是我把自己弄得太閑了剧包,很多事情擱置著恐锦,也沒有去做,需要讓自己忙起來疆液,多看書一铅,多看英語,多寫寫代碼堕油,應該就好了潘飘。嗯,醒醒掉缺。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卜录,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子眶明,更是在濱河造成了極大的恐慌艰毒,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搜囱,死亡現(xiàn)場離奇詭異丑瞧,居然都是意外死亡,警方通過查閱死者的電腦和手機蜀肘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門绊汹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扮宠,你說我怎么就攤上這事西乖。” “怎么了坛增?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵获雕,是天一觀的道長。 經(jīng)常有香客問我轿偎,道長典鸡,這世上最難降的妖魔是什么被廓? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任坏晦,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昆婿。我一直安慰自己球碉,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布仓蛆。 她就那樣靜靜地躺著睁冬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪看疙。 梳的紋絲不亂的頭發(fā)上豆拨,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音能庆,去河邊找鬼施禾。 笑死,一個胖子當著我的面吹牛搁胆,可吹牛的內(nèi)容都是我干的弥搞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼渠旁,長吁一口氣:“原來是場噩夢啊……” “哼攀例!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顾腊,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤粤铭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杂靶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體承耿,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年伪煤,在試婚紗的時候發(fā)現(xiàn)自己被綠了加袋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡抱既,死狀恐怖职烧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情防泵,我是刑警寧澤蚀之,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站捷泞,受9級特大地震影響足删,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锁右,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一失受、第九天 我趴在偏房一處隱蔽的房頂上張望讶泰。 院中可真熱鬧,春花似錦拂到、人聲如沸痪署。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狼犯。三九已至,卻和暖如春领铐,著一層夾襖步出監(jiān)牢的瞬間悯森,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工绪撵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呐馆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓莲兢,卻偏偏與公主長得像汹来,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子改艇,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

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

  • 作為一個合格的開發(fā)者收班,不要只滿足于編寫了可以運行的代碼。而要了解代碼背后的工作原理谒兄;不要只滿足于自己的程序...
    六個周閱讀 8,428評論 1 33
  • 1. 前言 在 React 中摔桦,一切皆是組件,因此理解組件的工作流與核心尤為重要承疲。我們有多種創(chuàng)建組件的方式(不僅 ...
    cbw100閱讀 3,642評論 0 10
  • 本文譯自《Optimizing React: Virtual DOM explained》邻耕,作者是Alexey I...
    YuyingWu閱讀 7,867評論 0 17
  • 說在前面 關于 react 的總結(jié)過去半年就一直碎碎念著要搞起來,各(wo)種(tai)原(lan)因(le)燕鸽。心...
    陳嘻嘻啊閱讀 6,850評論 7 41
  • 最近面試了幾個采購人員兄世,還巧了都是商務管理本科畢業(yè)。與他們交談都說他們這個專業(yè)都是老總的專業(yè)啊研。我不禁啞然失笑御滩。沒有...
    蘇城姑姑Ivy閱讀 355評論 1 2