認識 React Hooks

回顧函數組件

函數組件

  • 沒有組件實例

  • 不能監聽各個生命周期

  • 無法擴展屬性和方法

  • 沒有 state 和 setState

  • 只是輸入 props ,輸出 jsx ,純函數

?// class 組件class List extends React.Component {constructor(props) {super(props)}render() {const { list } = this.props?return <ul>{list.map((item, index) => {return <li key={item.id}><span>{item.title}</span></li>})}</ul>}}?// 函數組件function List(props) {const { list } = props?return <ul>{list.map((item, index) => {return <li key={item.id}><span>{item.title}</span></li>})}</ul>}

class 組件 vs 函數組件

class 組件有如下問題

  • 大型組件很難拆分和重構,也很難測試

  • 業務邏輯分散在組件的各個方法之中,導致重復邏輯或關聯邏輯

  • 組件類引入了 復雜的編程模式,比如 render props 和高階組件。

按照 React 函數式編程的思維來說,一個組件更像一個函數,而不像一個 class ,即 view = fn(props) 所以,函數組件會看起來更簡潔、符合邏輯。

但函數組件沒有 state ,沒有生命周期,還無法取代 class 組件。所以,才有了 React Hooks

state hook

函數組件,要求必需是純函數,不能有副作用。因此,要在函數組件使用 state ,不能直接使用,而是要“鉤”進來,這就是 Hooks

那如何把 state “鉤”到函數組件呢?

代碼總結

  • const [data, setData] = useState(0) 傳入初始值,返回一個數組

  • 數組第一個元素,state 值

  • 數組第二個元素,setState 函數

注意命名規范

  • 規定所有 Hook 命名必須是 use 開頭,如 useXxx

  • 自定義的 Hook ,也要 use 開頭

  • 其他地方,不要亂用 useXxx 名字

effect hook

有了 state 之后,還差一個常用的功能 —— 組件生命周期。例如,組件經常會在 didMount 里發請求

模擬聲生命周期

  • 模擬 ComponentDidMount :useEffect 依賴 []

  • 模擬 ComponentDidUpdate :useEffect 無依賴,或者依賴 [a, b]

  • 模擬 ComponentWillUnMount :useEffect 中返回一個函數

  • 模擬 ComponentDidMount + ComponentDidUpdate :useEffect 無依賴

effect 實現的是副作用,解釋一下這個詞

  • 純函數,輸入參數,返回結果,不應該有副作用

  • 副作用:對函數之外的干擾,如設置一個定時任務

  • 而組件卻需要副作用,所以用 effect hook 實現

模擬 ComponentWillUnMount 和 class 組件的 WillUnMount 還不一樣。

以一個“監聽好友在線狀態(支持途中好友切換)”的組件為例子說明 —— FriendStatusClass.jsFriendStatus.js ,對比著看。

  • 先用 class 組件:演示,光有 WillUnmount 滿足不了需求,需要結合 Update 聲明周期

  • 而用 effect Hook 一步就可以解決問題:

    • 使用 useEffect 無依賴,實現同時模擬 Update 生命周期

  • 所以這里的 “模擬 ComponentWillUnMount” 和 class 組件的 WillUnMount 不一樣

    • 因為模擬 ComponentWillUnMount中 返回的函數 會在 下一次effect 執行之前被執行,無論是更新還是卸載

小結

有了 state ,有了最基本的 3 個生命周期,日常見的功能也就都能做了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13525.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13525.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13525.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信息泄露--注意點點

目錄 明確目標: 信息泄露: 版本軟件 敏感文件 配置錯誤 url基于文件: url基于路由: 狀態碼: http頭信息泄露 報錯信息泄露 頁面信息泄露 robots.txt敏感信息泄露 .get文件泄露 --判斷: 搜索引擎收錄泄露 BP: 爆破: 明確目標: 失能 讀取 寫入 執行 信息泄…

【文末附gpt升級方案】Ilya離開OpenAI內幕探究:算力削減與商業優先策略的沖突

Ilya離開OpenAI內幕探究&#xff1a;算力削減與商業優先策略的沖突 一、引言 在人工智能&#xff08;AI&#xff09;領域的飛速發展中&#xff0c;OpenAI一直以其領先的技術和創新產品而備受矚目。然而&#xff0c;近日發生的Ilya Sutskever離開OpenAI的事件卻引起了業界的廣…

java企業級云MES系統全套源碼,支持app、小程序、H5、臺后管理

企業級云MES全套源碼&#xff0c;支持app、小程序、H5、臺后管理端 企業級智能制造MES系統源碼&#xff0c;技術架構&#xff1a;springboot vue-element-plus-admin MES指的是制造企業生產過程執行系統&#xff0c;是一套面向制造企業車間執行層的生產信息化管理系統。MES可以…

棧(基于動態順序表實現的棧)

棧的簡單介紹 關于棧的性質咳咳 棧&#xff1a;棧是一種特殊的線性表,其中只讓在一端插入和刪除元素。 后進先出 進行插入刪除的那一端叫棧頂&#xff0c;另一端叫棧底 我們實現的棧是基于一個動態順序表的的棧&#xff0c;會實現棧的 入棧&#xff0c;出棧&#xff0c;獲取…

修改默認時區,默認語言,默認國家

確認時區&#xff0c;語言&#xff0c;國家 build/make/target/product/languages_default.mkframeworks/base/packages/SettingsLib/res/xml/timezones.xml設備mk中添加相關內容 PRODUCT_PROPERTY_OVERRIDES \persist.sys.timezoneEurope/AmsterdamPRODUCT_PROPERTY_OVERRI…

嵌入式學習——3——超時timeout

1、自帶超時參數的函數 select自帶超時 定義超時時間變量 struct timeval tv {5, 0}; while(1) { tv.tv_sec 5; tv.tv_usec 0; int res select(1, &readfds, NULL, NULL, &tv); ..... } poll自帶超時 1、poll函數的第三個參數&#xff0c;是以毫秒為單位的超時時間…

前端vue用el-table如何實現表頭內容過長換行處理,實現換行效果

前端vue用el-table如何實現表頭內容過長換行處理&#xff0c;實現換行效果 這是效果圖 有兩種方法&#xff0c;一種簡易版本&#xff0c;一種萬能方法,都是el-table&#xff0c;先看文檔 表頭標題是可以自定義的 方法一 label的解釋寫在代碼里面了&#xff0c;這里會自動形成換…

Python概述

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 了解Python Python&#xff0c;本義是指“蟒蛇”。1989年&#xff0c;荷蘭人Guido van Rossum發明了一種面向對象的解釋型高級編程語言&#xff0c;…

利用神經網絡學習語言(六)——總結與常見面試問題

相關說明 這篇文章的大部分內容參考自我的新書《解構大語言模型&#xff1a;從線性回歸到通用人工智能》&#xff0c;歡迎有興趣的讀者多多支持。 文章列表&#xff1a; 利用神經網絡學習語言&#xff08;一&#xff09;——自然語言處理的基本要素利用神經網絡學習語言&…

Java基礎入門day49

day49 tomcat 啟動 進入tomcat的bin目錄&#xff0c;雙擊或者運行startup.bat文件啟動tomcat 控制臺最后出現服務器啟動在多少毫米之內&#xff0c;代表服務器成功啟動 org.apache.catalina.startup.Catalina.start Server startup in 405 ms 驗證tomcat 在瀏覽器中輸入 loca…

一次性計時器

Name: 一次性計時器 Copyright:No Author: 袁神派蒙 Date: 22/05/24 20:40 Description: 一次性的計時器&#xff08;by 袁神派蒙&#xff09; 直接上代碼&#xff1a; /*Name: 一次性計時器 Copyright:No Author: 袁神派蒙Date: 22/05/24 20:40Description: 一次性的計時器…

[算法] 優先算法(二): 雙指針算法(下)

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄:&#x1f355; Collection與數據結構 (91平均質量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

基于transformers框架實踐Bert系列6-完形填空

本系列用于Bert模型實踐實際場景&#xff0c;分別包括分類器、命名實體識別、選擇題、文本摘要等等。&#xff08;關于Bert的結構和詳細這里就不做講解&#xff0c;但了解Bert的基本結構是做實踐的基礎&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

自己動手寫docker——Namespace

Linux Namespace linux Namespace用于隔離一系列的系統資源&#xff0c;例如pid&#xff0c;userid&#xff0c;netword等&#xff0c;借助于Linux Namespace&#xff0c;可以實現容器的基本隔離。 Namespce介紹 Namespace類型系統調用參數作用Mount NamespaceCLONE_NEWNS隔離…

Python筑基之旅-MySQL數據庫(一)

目錄 一、MySQL數據庫 1、簡介 2、優點 2-1、開源和免費 2-2、高性能 2-3、可擴展性 2-4、易用性 2-5、靈活性 2-6、安全性和穩定性 2-7、豐富的功能 2-8、結合其他工具和服務 2-9、良好的兼容性和移植性 3、缺點 3-1、對大數據的支持有限 3-2、缺乏全文…

微服務如何做好監控

大家好&#xff0c;我是蒼何。 在脈脈上看到這條帖子&#xff0c;說阿里 P8 因為上面 P9 斗爭失敗走人&#xff0c;以超齡 35 被裁&#xff0c;Boss 上找工作半年&#xff0c;到現在還處于失業中。 看了下溝通記錄&#xff0c; 溝通了 1000 多次&#xff0c;但沒有一個邀請投遞…

uniapp中使用 iconfont字體

下載 iconfont 字體文件 打開 iconfont.css 文件&#xff0c;修改一下 把文件 復制到 static/iconfont/… 目錄下 在App.vue中引入iconfont 5. 使用iconfont 使用 iconfont 有兩種方式&#xff0c; 一種是 class 方式&#xff0c; 一種是使用 unicode 的方式 5.1 使用 class 的…

【Mac】Dreamweaver 2021 for mac v21.3 Rid中文版安裝教程

軟件介紹 Dreamweaver是Adobe公司開發的一款專業網頁設計與前端開發軟件。它集成了所見即所得&#xff08;WYSIWYG&#xff09;編輯器和代碼編輯器&#xff0c;可以幫助開發者快速創建和編輯網頁。Dreamweaver提供了豐富的功能和工具&#xff0c;包括代碼提示、語法高亮、代碼…

51單片機學習(1)2-1點亮一個LED

#include <REGX52.H> void() { p20xFE;//1111 1110 while(1) { //讓程序停了下來了。 } }

教你一分鐘搭建適合IT人員的在線開發工具箱

文章目錄 1. 使用Docker本地部署it-tools2. 本地訪問it-tools3. 安裝cpolar內網穿透4. 固定it-tools公網地址 本篇文章將介紹如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同樣可以結合cpolar實現公網訪問。 在前一篇文章中我們講解了如何在Linux中使用Docker搭…