成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說對React Hooks的理解?解決了什么問題?

開發 前端
Hook 是 React 16.8 的新增特性。它可以讓你在不編寫 class 的情況下使用 state 以及其他的 React 特性。

[[410916]]

本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系JS每日一題公眾號。

一、是什么

Hook 是 React 16.8 的新增特性。它可以讓你在不編寫 class 的情況下使用 state 以及其他的 React 特性

至于為什么引入hook,官方給出的動機是解決長時間使用和維護react過程中常遇到的問題,例如:

  • 難以重用和共享組件中的與狀態相關的邏輯
  • 邏輯復雜的組件難以開發與維護,當我們的組件需要處理多個互不相關的 local state 時,每個生命周期函數中可能會包含著各種互不相關的邏輯在里面
  • 類組件中的this增加學習成本,類組件在基于現有工具的優化上存在些許問題
  • 由于業務變動,函數組件不得不改為類組件等等

在以前,函數組件也被稱為無狀態的組件,只負責渲染的一些工作

因此,現在的函數組件也可以是有狀態的組件,內部也可以維護自身的狀態以及做一些邏輯方面的處理

二、有哪些

上面講到,Hooks讓我們的函數組件擁有了類組件的特性,例如組件內的狀態、生命周期

最常見的hooks有如下:

  • useState
  • useEffect
  • 其他

useState

首先給出一個例子,如下:

  1. import React, { useState } from 'react'
  2.  
  3. function Example() { 
  4.   // 聲明一個叫 "count" 的 state 變量 
  5.   const [count, setCount] = useState(0); 
  6.  
  7.   return ( 
  8.     <div> 
  9.       <p>You clicked {count} times</p> 
  10.       <button onClick={() => setCount(count + 1)}> 
  11.         Click me 
  12.       </button> 
  13.     </div> 
  14.   ); 

在函數組件中通過useState實現函數內部維護state,參數為state默認的值,返回值是一個數組,第一個值為當前的state,第二個值為更新state的函數

該函數組件等價于的類組件如下:

  1. class Example extends React.Component { 
  2.   constructor(props) { 
  3.     super(props); 
  4.     this.state = { 
  5.       count: 0 
  6.     }; 
  7.   } 
  8.  
  9.   render() { 
  10.     return ( 
  11.       <div> 
  12.         <p>You clicked {this.state.count} times</p> 
  13.         <button onClick={() => this.setState({ count: this.state.count + 1 })}> 
  14.           Click me 
  15.         </button> 
  16.       </div> 
  17.     ); 
  18.   } 

從上述兩種代碼分析,可以看出兩者區別:

  • state聲明方式:在函數組件中通過 useState 直接獲取,類組件通過constructor 構造函數中設置
  • state讀取方式:在函數組件中直接使用變量,類組件通過this.state.count的方式獲取
  • state更新方式:在函數組件中通過 setCount 更新,類組件通過this.setState()

總的來講,useState 使用起來更為簡潔,減少了this指向不明確的情況

useEffect

useEffect可以讓我們在函數組件中進行一些帶有副作用的操作

同樣給出一個計時器示例:

  1. class Example extends React.Component { 
  2.   constructor(props) { 
  3.     super(props); 
  4.     this.state = { 
  5.       count: 0 
  6.     }; 
  7.   } 
  8.  
  9.   componentDidMount() { 
  10.     document.title = `You clicked ${this.state.count} times`; 
  11.   } 
  12.   componentDidUpdate() { 
  13.     document.title = `You clicked ${this.state.count} times`; 
  14.   } 
  15.  
  16.   render() { 
  17.     return ( 
  18.       <div> 
  19.         <p>You clicked {this.state.count} times</p> 
  20.         <button onClick={() => this.setState({ count: this.state.count + 1 })}> 
  21.           Click me 
  22.         </button> 
  23.       </div> 
  24.     ); 
  25.   } 

從上面可以看見,組件在加載和更新階段都執行同樣操作

而如果使用useEffect后,則能夠將相同的邏輯抽離出來,這是類組件不具備的方法

對應的useEffect示例如下:

  1. import React, { useState, useEffect } from 'react'
  2. function Example() { 
  3.   const [count, setCount] = useState(0); 
  4.   
  5.   useEffect(() => {    document.title = `You clicked ${count} times`;  }); 
  6.   return ( 
  7.     <div> 
  8.       <p>You clicked {count} times</p> 
  9.       <button onClick={() => setCount(count + 1)}> 
  10.         Click me 
  11.       </button> 
  12.     </div> 
  13.   ); 

useEffect第一個參數接受一個回調函數,默認情況下,useEffect會在第一次渲染和更新之后都會執行,相當于在componentDidMount和componentDidUpdate兩個生命周期函數中執行回調

如果某些特定值在兩次重渲染之間沒有發生變化,你可以跳過對 effect 的調用,這時候只需要傳入第二個參數,如下:

  1. useEffect(() => { 
  2.   document.title = `You clicked ${count} times`; 
  3. }, [count]); // 僅在 count 更改時更新 

上述傳入第二個參數后,如果 count 的值是 5,而且我們的組件重渲染的時候 count 還是等于 5,React 將對前一次渲染的 [5] 和后一次渲染的 [5] 進行比較,如果是相等則跳過effects執行

回調函數中可以返回一個清除函數,這是effect可選的清除機制,相當于類組件中componentwillUnmount生命周期函數,可做一些清除副作用的操作,如下:

  1. useEffect(() => { 
  2.     function handleStatusChange(status) { 
  3.         setIsOnline(status.isOnline); 
  4.     } 
  5.  
  6.     ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange); 
  7.     return () => { 
  8.         ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange); 
  9.     }; 
  10. }); 

所以, useEffect相當于componentDidMount,componentDidUpdate 和 componentWillUnmount 這三個生命周期函數的組合

其它 hooks

在組件通信過程中可以使用useContext,refs學習中我們也用到了useRef獲取DOM結構......

還有很多額外的hooks,如:

  • useReducer
  • useCallback
  • useMemo
  • useRef

三、解決什么

通過對上面的初步認識,可以看到hooks能夠更容易解決狀態相關的重用的問題:

  • 每調用useHook一次都會生成一份獨立的狀態
  • 通過自定義hook能夠更好的封裝我們的功能

編寫hooks為函數式編程,每個功能都包裹在函數中,整體風格更清爽,更優雅

hooks的出現,使函數組件的功能得到了擴充,擁有了類組件相似的功能,在我們日常使用中,使用hooks能夠解決大多數問題,并且還擁有代碼復用機制,因此優先考慮hooks

參考文獻

https://zh-hans.reactjs.org/docs/hooks-state.html

https://zh-hans.reactjs.org/docs/hooks-effect.html

 

https://www.cnblogs.com/lalalagq/p/9898531.html

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2021-07-29 07:55:20

React Fiber架構引擎

2021-06-30 07:19:36

React事件機制

2021-07-07 08:36:45

React應用場景

2021-05-31 10:35:34

TCPWebSocket協議

2021-07-12 08:35:24

組件應用場景

2021-07-08 06:51:29

React函數組件

2021-06-07 09:41:48

NodeBuffer 網絡協議

2021-06-08 08:33:23

NodeStream數據

2021-09-13 09:23:52

TypeScript命名空間

2021-06-10 07:51:07

Node.js循環機制

2021-10-29 09:40:21

設計模式軟件

2021-06-03 08:14:01

NodeProcessJavaScript

2021-06-04 07:55:30

Node Fs 操作

2025-03-11 09:19:53

2020-08-03 07:38:12

單例模式

2021-11-25 10:18:42

RESTfulJava互聯網

2021-08-09 07:47:40

Git面試版本

2021-06-15 10:01:02

應用系統軟件

2021-06-29 09:47:34

ReactSetState機制

2021-07-19 07:55:24

Redux中間件原理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜国产 | 中文字幕在线视频免费视频 | 成人一级黄色毛片 | 亚洲精品乱码久久久久久9色 | 亚洲精品视频一区 | 国产在线一区二区 | 伊人久久国产 | 日本不卡视频在线播放 | 国产精品久久久久久久久久三级 | 日韩高清在线观看 | 亚洲美女一区二区三区 | 午夜精品久久久久久久久久久久 | 久久久久久亚洲国产精品 | 久久久久成人精品 | 精品国产一区二区三区久久 | 久草免费在线视频 | 中文字幕一区在线 | 国产成人精品一区二 | 国产激情精品 | 偷拍自拍网站 | 久久精品在线免费视频 | 日韩在线精品视频 | 国产精品久久久久9999鸭 | 国产精品一区二区在线 | 欧美日韩国产在线观看 | 欧美九九| 精品国产一区久久 | 亚洲综合激情 | 91麻豆精品国产91久久久更新资源速度超快 | 日韩欧美黄色 | 国产精品一区二区免费 | 黄色大片在线视频 | 黄色毛片一级 | 欧美精品啪啪 | 中文字幕国产精品 | 日本色婷婷 | 欧美日韩在线视频观看 | 午夜免费网站 | 天天影视亚洲综合网 | 成人做爰www免费看视频网站 | 国产精品1区2区3区 欧美 中文字幕 |