React 知識(shí)點(diǎn)補(bǔ)充

基本使用

? ??React基本使用

? ? 直接渲染 html陈醒,相當(dāng)于 vue 中的 v-html

直接渲染 html

React 事件

? ? bind this

事件的使用

? ? event

React event

? ? 總結(jié):react 中的 事件的 event 不是原生的 Event,是 React 封裝了的 SyntheticEvent冤荆,它模擬出 DOM 事件所有能力, event.nativeEvent 是原生事件對(duì)象康聂;所有的事件 都被掛載到 document 上,和 DOM 事件不一樣辑鲤,和 Vue 事件也不一樣纹因。


父子通信

? ? 傳遞自定義參數(shù)

? ? ????props 傳遞參數(shù)喷屋;

????????props 傳遞 函數(shù);

? ? ? ? ? ? (vue 中 是 @自定義函數(shù) = XXX瞭恰; 子組件 this.$emit 來觸發(fā)父組件事件實(shí)現(xiàn)的)

props

????props 類型檢查

類型檢查

setState

? ? 不可變值(重要)

? ????不要直接修改 State

不可變值

? ? ? ? ? ? 數(shù)字類型屯曹, 不能 this.state.XX ++;

? ? ? ? ? ? 數(shù)組類型,不能直接對(duì) this.state.arr 進(jìn)行 push 惊畏、pop恶耽、splice 等,這個(gè)違背不可變值颜启, 可以進(jìn)行如 concat偷俭、 [...this.state.arr, newvalue]、slice 截取缰盏、 filter 篩選涌萤、另外做個(gè)副本等操作,不能改變老的對(duì)象的值口猜。

? ? ? ? ? ? 對(duì)象類型负溪, {...this.state.obj, newKey: value}, Object.assign({}, this.state.obj)暮的,不能直接對(duì) this.state.obj 進(jìn)行屬性設(shè)置笙以,這樣違反不可變值。

? ? state的更新可能是異步更新

? ? ? ? setState 直接使用 是異步的冻辩;

? ? ? ? setTimeout 中的 setState 是同步的,自定義的DOM 事件拆祈, setState是同步的(比如document.body.addEventListener('click', () =>{? this.setState()}))

?state的更新可能是異步更新

????state 的更新可能會(huì)被合并

? ??????????出于性能考慮恨闪,React 可能會(huì)把多個(gè)?setState()?調(diào)用合并成一個(gè)調(diào)用;多次 setState 會(huì)被合并 放坏,執(zhí)行結(jié)果只一次咙咽。

? ? ? ? ????傳入函數(shù) ,不會(huì)被合并淤年。

????state 的更新可能會(huì)被合并

組件生命周期

? ? ? ? 單個(gè)組件生命周期

生命周期

? ? ? ? 父子組件生命周期 和? Vue 一樣


高級(jí)特性

? ? ? ? 函數(shù)組件

? ? ? ? ? ? 組件的兩種形式 class 和 function Component

? ? ? ? ? ? 函數(shù)組件:純函數(shù) 輸入 props 輸出 JSX; 沒有實(shí)例钧敞, 沒有生命周期,沒有 state; 不能擴(kuò)展其他的方法(hooks 另外介紹)

組件的兩種形式

? ? 非受控組件? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 非受控組件的 ref 的 三種創(chuàng)建方式(其中一種被淘汰):

? ? ? ? ? ? ? ? 1.??React.createRef() 麸粮; 2.?回調(diào) Refs 溉苛; 3. string ref (淘汰)。

? ??????????? ? defaultValue / defaultChecked:非受控組件 使用這兩個(gè)作為初始值

? 1.??React.createRef()
2. 回調(diào) Refs

? ? ? ? ? ? 函數(shù)組件使用 ref

React.forwardRef

????????????手動(dòng)操作 DOM 元素

? ? ? ? ? ? ? ? 使用場(chǎng)景 :必須收到操作 DOM 元素弄诲, setState 實(shí)現(xiàn)不了愚战; 文件上傳<input type='file'>; 某些富文本編輯器,需要傳入 DOM 元素;管理焦點(diǎn)寂玲,文本選擇或媒體播放塔插;觸發(fā)強(qiáng)制動(dòng)畫;集成第三方 DOM 庫(kù)拓哟。

? ? ? ? ? ? 注意 :優(yōu)先使用受控組件想许,符合 React 設(shè)計(jì)原則; 必須操作 DOM 時(shí)断序, 再使用 非受控組件伸刃。


? ? ? ? Portals

? ? ? ? ? ? 如何讓組件渲染到父組件以外?Portal 提供了一種將子節(jié)點(diǎn)渲染到存在于父組件以外的 DOM 節(jié)點(diǎn)的優(yōu)秀的方案逢倍。

Portals

? ??????????ReactDOM.createPortal(child,container)

????????????第一個(gè)參數(shù)(child)是 React 元素捧颅,例如一個(gè)元素,字符串或 fragment较雕。第二個(gè)參數(shù)(container)是一個(gè) DOM 元素碉哑,把這個(gè)組件渲染到哪個(gè) 節(jié)點(diǎn)上,比如 document.body亮蒋。

????????????使用場(chǎng)景: 比如 modal 是全局彈窗扣典, fixed需要放在 body 第一層級(jí); overflow:hidden慎玖,父組件是 BFC贮尖,會(huì)限制子組件在超出部分隱藏,可以讓子組件脫離父組件趁怔,在外面現(xiàn)實(shí)湿硝; 父組件 z-index 值太小, 讓它脫離 父組件润努。

? ? ? ? ? ? 總結(jié):一個(gè) portal 的典型用例是當(dāng)父組件有?overflow: hidden?或?z-index?樣式時(shí)关斜,但你需要子組件能夠在視覺上“跳出”其容器。例如铺浇,對(duì)話框痢畜、懸浮卡以及提示框。


? ? context

? ??????????React.createContext()

? ??????????Context 提供了一個(gè)無需為每層組件手動(dòng)添加 props鳍侣,就能在組件樹間進(jìn)行數(shù)據(jù)傳遞的方法丁稀。

? ??????????在一個(gè)典型的 React 應(yīng)用中,數(shù)據(jù)是通過 props 屬性自上而下(由父及子)進(jìn)行傳遞的倚聚,但這種做法對(duì)于某些類型的屬性而言是極其繁瑣的(例如:地區(qū)偏好线衫,UI 主題),這些屬性是應(yīng)用程序中許多組件都需要的秉沼。Context 提供了一種在組件之間共享此類值的方式桶雀,而不必顯式地通過組件樹的逐層傳遞 props矿酵。

? ? ? ? ? ? 應(yīng)用場(chǎng)景:公共信息(語(yǔ)言、主題)如何傳遞給每個(gè)組件矗积; 用 props 太繁瑣全肮; 用 redux 小題大作。

? ? context

? ? ? ? ? ? 函數(shù)組件 和 class 組件 消費(fèi)方式 是不一樣的

函數(shù)組件使用 context

? ? 多個(gè) context 的使用 棘捣,但是還不是不推薦這么嵌套辜腺, 可以重新設(shè)計(jì)組件的層級(jí)。

多個(gè) context

? ? ? ? 異步組件

? ? ? ? ? ? import()

? ? ? ? ? ? React.lazy

????????????????React.lazy()?允許你定義一個(gè)動(dòng)態(tài)加載的組件乍恐。這有助于縮減 bundle 的體積评疗,并延遲加載在初次渲染時(shí)未用到的組件。

? ? ? ? ? ? React.Suspense

? ??????????????應(yīng)在?Suspense?組件中渲染 lazy 組件茵烈,如此使得我們可以使用在等待加載 lazy 組件時(shí)做優(yōu)雅降級(jí)(如 loading 指示器等)百匆。fallback?屬性接受任何在組件加載過程中你想展示的 React 元素。你可以將?Suspense?組件置于懶加載組件之上的任何位置呜投。你甚至可以用一個(gè)?Suspense?組件包裹多個(gè)懶加載組件加匈。

?? ? 異步組件

? ? ? ? 性能優(yōu)化

? ? ? ? ? ? shouldComponentUpdate (簡(jiǎn)稱 SCU)

? ? ? ? ? ? 基本用法

SCU

? ? ? ? ? ? 為什么 react 可以定制這個(gè)生命周期 而不去硬規(guī)定 ??

? ? ? ? ? ? React 默認(rèn) :SCU 默認(rèn)返回true ,即父組件更新仑荐,子組件會(huì)無條件的更新雕拼。

? ? ? ? ? ? SCU 一定每次都要用嗎? ------ 可以先不用SCU粘招,需要性能優(yōu)化的時(shí)候才優(yōu)化并且使用 SCU啥寇; SCU 要配合不可變值使用。

????????????PureComponent 和 React.memo??

? ??????????????PureComponent洒扎, SCU 中 實(shí)現(xiàn)了淺比較(深度比較消耗性能)

只進(jìn)行淺比較

? ? ? ? ? ? ? ? memo 函數(shù)組件中的?PureComponent

? ? ? ? ? ? ? ? 淺比較已經(jīng)適用大部分情況(盡量不要做深度比較)

? ? ? ? ? ? ? ? 注意:如果 props 相等辑甜,areEqual?會(huì)返回?true;如果 props 不相等逊笆,則返回?false栈戳。這與?shouldComponentUpdate?方法的返回值相反。

memo

高階組件 HOC

? ? ?高階組件(HOC)是 React 中用于復(fù)用組件邏輯的一種高級(jí)技巧难裆。HOC 自身不是 React API 的一部分,它是一種基于 React 的組合特性而形成的設(shè)計(jì)模式镊掖。

? ? ?高階組件是參數(shù)為組件乃戈,返回值為新組件的函數(shù).

? ? ? 具體內(nèi)容 可以看React 高階組件

HOC

Render Props

? ??是指一種在 React 組件之間使用一個(gè)?值為函數(shù)的 prop 共享代碼的簡(jiǎn)單技術(shù)。

? ??render prop 是因?yàn)槟J讲疟环Q為?render?prop 亩进,你不一定要用名為?render?的 prop 來使用這種模式

Render Props

? ? HOC 和 Render Props

? ? ? ? HOC 模式簡(jiǎn)單症虑,但會(huì)增加組件層級(jí);Render Props 代碼比較簡(jiǎn)潔归薛;它們都是抽離公共邏輯提升代碼質(zhì)量的方法谍憔,按需使用匪蝙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市习贫,隨后出現(xiàn)的幾起案子逛球,更是在濱河造成了極大的恐慌,老刑警劉巖苫昌,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颤绕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡祟身,警方通過查閱死者的電腦和手機(jī)奥务,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袜硫,“玉大人氯葬,你說我怎么就攤上這事⊥裣荩” “怎么了帚称?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)憨攒。 經(jīng)常有香客問我世杀,道長(zhǎng),這世上最難降的妖魔是什么肝集? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任瞻坝,我火速辦了婚禮,結(jié)果婚禮上杏瞻,老公的妹妹穿的比我還像新娘所刀。我一直安慰自己,他們只是感情好捞挥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布浮创。 她就那樣靜靜地躺著,像睡著了一般砌函。 火紅的嫁衣襯著肌膚如雪斩披。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天讹俊,我揣著相機(jī)與錄音垦沉,去河邊找鬼。 笑死仍劈,一個(gè)胖子當(dāng)著我的面吹牛厕倍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贩疙,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼讹弯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼况既!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起组民,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤棒仍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后邪乍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體降狠,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年庇楞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榜配。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吕晌,死狀恐怖蛋褥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睛驳,我是刑警寧澤烙心,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站乏沸,受9級(jí)特大地震影響淫茵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹬跃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一匙瘪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝶缀,春花似錦丹喻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至柄慰,卻和暖如春鳍悠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坐搔。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工贼涩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薯蝎。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谤绳,于是被迫代替她去往敵國(guó)和親占锯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袒哥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353