react hooks 全面轉換攻略(二) react本篇剩餘 api

useCallback,useMemo

因爲這兩個 api 的作用是一樣的,所以我放在一起講;

語法:

function useMemo<T>(factory: () => T, deps: DependencyList | undefined): T;
function useCallback<T extends (...args: any[]) => any>(callback: T, deps: DependencyList): T;

區別在於第一個參數,還有參數的傳遞,另外 useCallback 中 DependencyList 是一個必須值

這兩個 api 的作用基本就是緩存數據/方法

使用過 react 的人都知道,在組件傳遞值的時候,如果 props 中某一值對象引用發生變化,就會發生重新渲染,即使前後2個對象是完全相同的;

這2個參數就是爲了解決這個問題,另外也有可以減輕一些方法的rerender的速度;


useRef

作用基本是取代 class 中的 createRef,在此不多細說


useContext

作用基本是取代 class 中的 Context 中 Context.Provider ,接受參數 Context,因爲可能會有多層 context,所以這個參數是必須的,不然無法辨別


useImperativeHandle

語法:

function useImperativeHandle<T, R extends T>(ref: Ref<T>|undefined, init: () => R, deps?: DependencyList): void;

官網是叫 useImperativeMethods,但是我在 @types/[email protected] 中,是叫做 useImperativeHandle的,不過函數名還是以實際爲準

在官網中,他的作用是這樣解釋的:

useImperativeMethods自定義使用ref時公開給父組件的實例值。 與往常一樣,在大多數情況下應避免使用refs的命令式代碼。

這個 api 的使用必定伴隨着 forwardRef 這個 api, 使用率基本較低;

官方例子:

function FancyInput(props, ref) {
  const inputRef = useRef();
  useImperativeMethods(ref, () => ({
    focus: () => {
      inputRef.current.focus();
    }
  }));
  return <input ref={inputRef}  />;
}
FancyInput = forwardRef(FancyInput);
在此示例中,呈現<FancyInput ref = {fancyInputRef} />的父組件將能夠調用fancyInputRef.current.focus()。

簡單的說就是講子組件中的創建方法暴露給父組件


useMutationEffect

簽名與useEffect相同,但在更新兄弟組件之前,它在React執行其DOM突變的同一階段同步觸發。 使用它來執行自定義DOM突變。

同樣的 @types/[email protected] 沒有這個函數的聲明;
不過官網中 大多是告誡儘量少用此函數


useLayoutEffect

語法:

function useLayoutEffect(effect: EffectCallback, deps?: DependencyList): void;

參數基本和 useEffect 相同

官方所說的效果:

簽名與useEffect相同,但在所有DOM突變後它會同步觸發。 使用它從DOM讀取佈局並同步重新渲染。 在瀏覽器有機會繪製之前,將在useLayoutEffect內部計劃的更新將同步刷新。

不知道大家有沒有使用過 vue,他的作用和 vue 中的 nexttick 差不多吧;
在需要讀取 dom 的高度,寬度的時候特別需要


說到現在, api 基本已經講完了,除了 useReducer, 我將會放在 redux 篇中講述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章