Hooks的背景
It’s essentially a way to create components with features, like state, without the need for class components.
以上是react官方對於hooks的解釋,簡單點說就是用了hooks後,不需要建立類元件了,傳統的無狀態函式式元件搭載了hooks可能實現類元件的生命週期以及狀態的管理,更牛逼的是狀態管理的邏輯可以重用, 聽起來是不是很酷炫狂拽吊炸天。
Hooks
A Hook is a special function that lets you “hook into” React features. For example, useState
is a Hook that lets you add React state to function components. We’ll learn other Hooks later.
React官方已經定了一些內建的hooks,在這裡我就不一一介紹了,我主要介紹兩個常用的hooks, useState
, useEffect
useState
import React, { useState } from 'react';
function Example() {
// Declare a new state variable, which we'll call "count"
const [count, setCount] = useState(0);複製程式碼
話不多說,先上程式碼,useState是一個方法,該方法只接受一個引數 initState, 可以任意一種資料型別,可以是一個number, 也可以是一個物件, 或者string, boolean.
該方法返回一個長度為2的陣列,陣列第一個是狀態值,陣列第二個值是改變狀態值的方法,具體該方法的name規範,請參考React的文件 Use the State Hook 例子當中 setCount方法類似與setState的方法,狀態的修改會觸發重新的render。
useEffect
By using this Hook, you tell React that your component needs to do something after render. React will remember the function you passed (we’ll refer to it as our “effect”), and call it later after performing the DOM updates. In this effect, we set the document title, but we could also perform data fetching or call some other imperative
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// Similar to componentDidMount and componentDidUpdate:
useEffect(() => {
// Update the document title using the browser API
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}複製程式碼
由於引進了hooks後,React不在依賴於定義於class來設定生命週期,useEffect就是來管理useState裡面設定的狀態,不侷限於一個特定的class,而是針對於某個或多個特定的狀態的生命週期管理,具體關於useEffect的使用,請參考官網Using the Effect Hooks
⚠️: useEffect方法在每次render的時候,預設的情況下會執行一次,但是你可以設定它的執行規則,具體參考 Using the Effect Hooks
自定義hooks,
這一部分是最關鍵了,我們可以定義自己的hooks 輪子。what's more, 可以分享定義的輪子並讓其他開發者去使用,這在之前的React的裡面是一個里程碑的改變,如果自定義hooks內,這一部分也很簡單,就是定一個hook function, 並引入useState, useEffect 等方法來管理狀態,將需要重用的狀態邏輯抽離出來封裝到自定義的hook方法裡。 具體如何實現,大家可以參考一下我的github react-hooks , 歡迎大家review我的code,並提出一些issues ?。 大家可以看一下我那個demo 的github pages
總結:
hooks 幫助擺脫定義繁瑣的class 元件的束縛,同時封裝重用的自定義hooks的邏輯。
useState, useEffect 等內建的hooks來幫助創造hooks的生態圈,實現state 邏輯的共享。
⚠️踩過的坑:在專案裡面如果在不同的元件裡面都引用同樣的hook, 該hook裡面定義的state並不會共享,而是相互獨立的,這一點大家自己測試一下。
這是第一次寫技術文件,希望各位大咖多給點建議,feedback is always important for improvment. 如果大家覺得我寫的那個react-hooks demo不錯的話,大家給個star吧?。