摘要:看完代碼應(yīng)該就能很好的理解的使用了吧,具體代碼的運(yùn)行點(diǎn)擊在線演示查看在線演示總結(jié)給我們帶來的就是在函數(shù)的基礎(chǔ)上可以加入狀態(tài)和生命周期等函數(shù)不曾有的特性,這個(gè)特性的加入能夠讓我們更好的抽象組件,提高代碼的復(fù)用性。
Hook 簡(jiǎn)介
Hook 是 React 16.8 的新增特性。是對(duì) React 函數(shù)組件的一種擴(kuò)展,通過提供一些特殊的函數(shù),讓無狀態(tài)的組件擁有狀態(tài)組件才擁有的能力。
沒有Hook之前寫組件有兩種形式,分別為
函數(shù)組件
class組件
函數(shù)組件特點(diǎn)如下
所有的數(shù)據(jù)都是依賴props傳入的,沒有內(nèi)部state
沒有生命周期
沒有this(組件實(shí)例)
實(shí)際開發(fā)中因?yàn)闃I(yè)務(wù)復(fù)雜,一般使用函數(shù)組件無法滿足,所以大家默認(rèn)都是使用class組件進(jìn)行開發(fā),這是一個(gè)不會(huì)出錯(cuò)的選擇。函數(shù)組件大家平時(shí)應(yīng)該都挺少會(huì)去用的,因?yàn)楹瘮?shù)組件能提供的功能比較局限。但是引入Hook后,函數(shù)的能力就被擴(kuò)展了許多,因?yàn)楹瘮?shù)的特性,非常適合抽象成可復(fù)用的組件。
解決哪些問題 不同組件間與狀態(tài)有關(guān)的邏輯復(fù)用問題平時(shí)寫組件的方式就是通過props傳遞給下一個(gè)組件,有些簡(jiǎn)單的情況這樣也挺好的。但是當(dāng)項(xiàng)目不斷迭代,會(huì)發(fā)現(xiàn)當(dāng)組件被多個(gè)模塊多次引用,還是會(huì)多寫一些重復(fù)的邏輯。因?yàn)槭艿降綘顟B(tài)或者生命周期的影響,導(dǎo)致這部分邏輯卻又很難拆出來。
引入Hook就可以將受狀態(tài)或生命周期影響的組件抽出來。
業(yè)務(wù)發(fā)展導(dǎo)致組件日益龐大最外層的代碼集中維護(hù)許多state狀態(tài),導(dǎo)致頁面引入越來越多毫無關(guān)聯(lián)的模塊,代碼的可讀性大大降低,有時(shí)候因?yàn)槎鄠€(gè)生命周期里面有大量不相關(guān)的邏輯,這樣雜亂的代碼容易引起bug,也增加了其它開發(fā)人員維護(hù)的難度。
Hook將組件中每一個(gè)相關(guān)的小模塊拆分成一個(gè)函數(shù),這樣能夠讓組件即使龐大結(jié)構(gòu)也是清晰的。
用法State Hook: 在函數(shù)組件中使用state
Effect Hook: 在函數(shù)組件中使用生命周期
Custom Hook: 自定義Hook,可以將組件邏輯提取到函數(shù)中。(注意:自定義 Hook 是一個(gè)函數(shù),其名稱以 “use” 開頭,函數(shù)內(nèi)部可以調(diào)用其他的 Hook)
Hook 規(guī)則Hook 本質(zhì)就是 JavaScript 函數(shù),但是在使用它時(shí)需要遵循兩條規(guī)則
只在最頂層使用 Hook(不要在循環(huán),條件或嵌套函數(shù)中調(diào)用)
只在 React 函數(shù)中調(diào)用 Hook
ESLint 插件強(qiáng)制執(zhí)行 hooks 的最佳實(shí)踐
eslint-plugin-react-hooks
如何使用詳細(xì)的一些概念官方文檔已經(jīng)寫得很全面了,可以參考:Hook的官方文檔。
接下來就用一個(gè)實(shí)際的例子來說明一下State Hook的使用
示例產(chǎn)品第一版本需求如下:
現(xiàn)在有 小A,小B 兩位同學(xué),每位同學(xué)都處于未穿鞋的狀態(tài),小A穿鞋需要2s,小B穿鞋需要5s,在頁面一中用文字描述兩位同學(xué)的穿鞋狀態(tài)變更( 如果小A正在穿鞋中,則在頁面上顯示 "小A正在穿鞋子",如果小A已經(jīng)穿好了鞋子,則將文字替換為 "小A已經(jīng)穿好鞋子")
使用class組件實(shí)現(xiàn)如下:
src/demo1.js
import React from "react"; class Page extends React.Component { state = { data: [ { id: 1, name: "小A", time: "2000" }, { id: 2, name: "小B", time: "5000" } ] }; start(item) { this.setState({ [item.id]: "穿鞋子" }); setTimeout(() => { this.setState({ [item.id]: "穿好鞋子" }); }, item.time); } componentDidMount() { this.state.data.forEach(item => { this.start(item); }); } render() { return ({this.state.data.map(item => { return (); } } export default Page;{this.state[item.id] === "穿鞋子" ? `${item.name}正在穿鞋子...` : `${item.name}已經(jīng)穿好鞋子了`}
); })}
使用Hook組件實(shí)現(xiàn)如下:
自定義hook如下:
src/useHook.js
import React, { useState } from "react"; function useHook(item) { const [status, setStatus] = useState("穿鞋子"); setTimeout(() => { setStatus("穿好鞋子"); }, item.time); return ({status === "穿鞋子" ? `${item.name}正在穿鞋子...` : `${item.name}已經(jīng)穿好鞋子了`}
); } export default useHook;
引用hook的函數(shù)組件
src/hookDemo1.js
import React from "react"; import useHook from "./useHook"; function Page() { const data = [ { id: 1, name: "小A", time: "2000" }, { id: 2, name: "小B", time: "5000" } ]; return ({data.map(item => { return useHook(item); })}); } export default Page;
好了,實(shí)現(xiàn)完上面的需求,現(xiàn)在覺得hook的好處并沒有什么體現(xiàn),接下來產(chǎn)品又發(fā)布了第二版需求,要求我們?cè)诹硪粋€(gè)頁面顯示另外兩位同學(xué)的狀態(tài)。需求如下:
現(xiàn)在有 小C,小D 兩位同學(xué),每位同學(xué)都處于未穿鞋的狀態(tài),小A穿鞋需要4s,小B穿鞋需要8s,在頁面二中用文字描述兩位同學(xué)的穿鞋狀態(tài)變更( 如果小A正在穿鞋中,則在頁面上顯示 "小C正在穿鞋子",如果小C已經(jīng)穿好了鞋子,則將文字替換為 "小C已經(jīng)穿好鞋子")
接下來再第一個(gè)版本的基礎(chǔ)上來實(shí)現(xiàn)第二個(gè)需求
使用class組件實(shí)現(xiàn)如下:
src/demo2.js
import React from "react"; class Page extends React.Component { state = { data: [ { id: 1, name: "小C", time: "4000" }, { id: 2, name: "小D", time: "8000" } ] }; start(item) { this.setState({ [item.id]: "穿鞋子" }); setTimeout(() => { this.setState({ [item.id]: "穿好鞋子" }); }, item.time); } componentDidMount() { this.state.data.forEach(item => { this.start(item); }); } render() { return ({this.state.data.map(item => { return (); } } export default Page;{this.state[item.id] === "穿鞋子" ? `${item.name}正在穿鞋子...` : `${item.name}已經(jīng)穿好鞋子了`}
); })}
使用Hook組件實(shí)現(xiàn)如下:
src/hookDemo2.js
import React from "react"; import useHook from "./useHook"; function Page() { const data = [ { id: 1, name: "小C", time: "4000" }, { id: 2, name: "小D", time: "8000" } ]; return ({data.map(item => { return useHook(item); })}); } export default Page;
第二次的代碼明顯比第一次少了許多,而且如果之后產(chǎn)品如果增加了一個(gè)狀態(tài),那明顯使用Hook實(shí)現(xiàn)的方式可以更快的適應(yīng)需求的變更,代碼的維護(hù)性也變高了許多。
看完代碼應(yīng)該就能很好的理解hook的使用了吧,具體代碼的運(yùn)行點(diǎn)擊在線演示查看
在線演示
總結(jié)Hook給我們帶來的就是在函數(shù)的基礎(chǔ)上可以加入狀態(tài)和生命周期等函數(shù)不曾有的特性,這個(gè)特性的加入能夠讓我們更好的抽象組件,提高代碼的復(fù)用性。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/104086.html
摘要:當(dāng)組件安裝和更新時(shí),回調(diào)函數(shù)都會(huì)被調(diào)用。好在為我們提供了第二個(gè)參數(shù),如果第二個(gè)參數(shù)傳入一個(gè)數(shù)組,僅當(dāng)重新渲染時(shí)數(shù)組中的值發(fā)生改變時(shí),中的回調(diào)函數(shù)才會(huì)執(zhí)行。 前言 首先歡迎大家關(guān)注我的Github博客,也算是對(duì)我的一點(diǎn)鼓勵(lì),畢竟寫東西沒法獲得變現(xiàn),能堅(jiān)持下去也是靠的是自己的熱情和大家的鼓勵(lì),希望大家多多關(guān)注呀!React 16.8中新增了Hooks特性,并且在React官方文檔中新增...
摘要:使用完成副作用操作,賦值給的函數(shù)會(huì)在組件渲染到屏幕之后。如此很容易產(chǎn)生,并且導(dǎo)致邏輯不一致。同時(shí),這也是很多人將與狀態(tài)管理庫(kù)結(jié)合使用的原因之一。當(dāng)我們通過的第二個(gè)數(shù)組類型參數(shù),指明當(dāng)前的依賴,就能避免不相關(guān)的執(zhí)行開銷了。 前言 本文內(nèi)容大部分參考了 overreacted.io 博客一文,同時(shí)結(jié)合 React Hook 官方 文章,整理并歸納一些筆記和輸出個(gè)人的一些理解 什么是 Hoo...
摘要:起飛指南作者元瀟方凳雅集出品目前放出來了個(gè)內(nèi)置,但僅僅基于以下兩個(gè),就能做很多事情。行代碼實(shí)現(xiàn)一個(gè)全局元瀟根組件掛上即可子組件調(diào)用隨時(shí)隨地實(shí)現(xiàn)一個(gè)局部元瀟的本質(zhì)是的一個(gè)語法糖,感興趣可以閱讀一下的類型定義和實(shí)現(xiàn)。 React Hook起飛指南 作者:元瀟 方凳雅集出品 16.8目前放出來了10個(gè)內(nèi)置hook,但僅僅基于以下兩個(gè)API,就能做很多事情。所以這篇文章不會(huì)講很多API,...
摘要:另外也不利于組件的,及。所以在使用時(shí),盡量將相關(guān)聯(lián)的,會(huì)共同變化的值放入一個(gè)。有同學(xué)可能會(huì)想,每次后都會(huì)執(zhí)行,這樣會(huì)不會(huì)對(duì)性能造成影響。另外必須以開頭來命名,這樣工具才能正確檢測(cè)其是否符合規(guī)范。 由于工作的原因我已經(jīng)很長(zhǎng)時(shí)間沒接觸過React了。前段時(shí)間圈子里都在討論React Hooks,出于好奇也學(xué)習(xí)了一番,特此整理以加深理解。 緣由 在web應(yīng)用無所不能的9012年,組成應(yīng)用的C...
摘要:比如在條件判斷中使用,在循環(huán),嵌套函數(shù)中使用,都會(huì)造成執(zhí)行順序不一致的問題。而比如定時(shí)器,事件監(jiān)聽。第一個(gè)參數(shù)的返回值,會(huì)在組件卸載時(shí)執(zhí)行,相當(dāng)于,可以清理定時(shí)器,移除事件監(jiān)聽,取消一些訂閱。 什么是 Hooks? 不通過編寫類組件的情況下,可以在組件內(nèi)部使用狀態(tài)(state) 和其他 React 特性(生命周期,context)的技術(shù) Hooks 為什么會(huì)出現(xiàn) 在之前的 React ...
閱讀 2508·2023-04-25 16:42
閱讀 1288·2021-11-22 14:45
閱讀 2459·2021-10-19 13:10
閱讀 2887·2021-09-29 09:34
閱讀 3488·2021-09-23 11:21
閱讀 2191·2021-08-12 13:25
閱讀 2292·2021-07-30 15:15
閱讀 3555·2019-08-30 15:54