react中hook是什麼

2022-04-18 13:00:42

在react中,hook是React16.8新增的特性,用於在不編寫class的情況下使用state及其他的react特性;可以用函陣列件去使用react中的一些特性,也可以讓函陣列件也擁有狀態,通過自定義hook實現在元件間公用狀態操作。

本教學操作環境:Windows10系統、react17.0.1版、Dell G3電腦。

react中hook是什麼

react hook是react中引入新特性,它可以讓react函陣列件也擁有狀態;

通過自定義hook可以實現在元件間公用狀態操作;

含義:Hook 是 React 16.8 的新增特性。它可以讓你在不編寫 class 的情況下使用 state 以及其他的 React 特性。簡單來說就是可以使用函陣列件去使用react中的一些特性

所要解決的問題:

解決元件之間複用狀態邏輯很難得問題,hook能解決的就是在你無需修改之前元件結構的情況下複用狀態邏輯,在不使用hook的情況下,需要使用到一些高階的用法如高階元件、provider、customer等,這種方式對於新手來說不太友好,可能在理解上就比較的困難

對於複雜元件可以去拆分其邏輯,例如在你使用生命週期函數時,不同的生命週期需要在不同的時刻進行,因此在此時對於複雜的元件來說,有的生命週期函數中就存在大量的邏輯,在可讀性上面就大打折扣。當使用hook時,就可以進行元件邏輯的劃分,將相同的邏輯給整合在一起,這樣就大大增加可讀性也在一方面利於維護

不需要對於class元件的理解,當你在最初去學習時,你不得不去理解this這個關鍵字,在當前元件所表示的含義,但是在hook中就不需要。能夠解決你在不使用class元件的情況下去體現react的特性

需要注意的一點就是hook和class元件是不能夠同時使用的,在實際的使用過程中一定要注意,否則就會出現報錯。

react-hook的用法

react提供了useState、useEffect兩個hook函數來建立stack hook和effect hook

state hook

在函陣列件內使用useState可以給元件使用狀態;

useState的入參為初始狀態,出參為當前state以及更新state的函數;

function useState<S = undefined>(): [S | undefined, Dispatch<SetStateAction<S | undefined>>];
function Example() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

useState第一次執行時將建立一個狀態,之後執行都是使用這個狀態;

effect hook

使用useEffect可以給元件新增副作用邏輯;

所謂副作用個人理解是與react範圍外的世界產生的互動,如dom操作、網路請求等(說實話,副作用具體是啥我還沒完全弄明白);

useEffect入參有兩個第一個引數是副作用函數、第二個引數是個用於判斷是否執行副作用的陣列;

function useEffect(effect: EffectCallback, deps?: DependencyList): void;
type EffectCallback = () => (void | (() => void | undefined));
type DependencyList = ReadonlyArray<any>;

副作用有一個執行過程和一個可選的清除過程,副作用函數定義了執行過程,它的返回值函數定義了清除過程;

在元件函數中定義的副作用像是渲染結果的一部分,副作用在每次渲染後都會執行,在渲染前、元件銷燬前清除之前的副作用;這樣做使得我們的副作用可以讀到每次的props、state;

function FriendStatusWithCounter(props) {
  const [count, setCount] = useState(0);
  useEffect(() => {
    document.title = `You clicked ${count} times`;
  });
  const [isOnline, setIsOnline] = useState(null);
  useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });
  // ...
}

如果不想每次渲染都執行副作用,可以給useEffect第二個引數傳一陣列,當陣列中的元素沒有變化時,不會觸發副作用;

自定義hook

自定義hook其實就是個內部使用了useState、useEffect的普通函數,並且函數名以use開頭;

使用自定義hook可以將元件邏輯提取到可重用的函數中;

function useFriendStatus(friendID) {
  const [isOnline, setIsOnline] = useState(null);
  useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }
    ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
    };
  });
  return isOnline;
}

TODO

render props、高階元件、effect效能優化的注意事項

推薦學習:《》

以上就是react中hook是什麼的詳細內容,更多請關注TW511.COM其它相關文章!