首頁  >  文章  >  web前端  >  react中hook是什麼

react中hook是什麼

WBOY
WBOY原創
2022-04-18 10:28:334316瀏覽

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

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影片教學

以上是react中hook是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn