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