本篇是參考官方文件,整理 React 內建的 Hooks API 功能。
- Basic Hooks
- useState
- useEffect
- useContext
- Additional Hooks
- useReducer
- useCallback
- useMemo
- useRef
- useImperativeHandle
- useLayoutEffect
- useDebugValue
- 第一次 render 時,回傳的 state 值會和 initialState 參數相同
- 可透過 setState 來更新 state,state 一旦改變,就會觸發 React 去重新渲染畫面
const [state, setState] = useState(initialState
setState(newState);
- 第一個參數帶入的 function 會在「畫面渲染完成後」被呼叫
- 第二個參數傳入一個陣列,用來放想要關注的資料,當變數改變時才會呼叫 useEffect
useEffect(
() => {
const subscription = props.source.subscribe();
return () => {
subscription.unsubscribe();
};
},
[props.source],
);
- 讓父層的資料能夠被底下的任意子層存取,不需要像 props 一層一層傳遞下去,避免造成 Props drilling
- 用
React.createContext
建立一個 context 物件,並由<MyContext.Provider value={}>
存取該物件的值,底下的子層就可以直接透過 useContext 來存取 MyContext
const value = useContext(MyContext);
- state:當前的 state 值
- dispatch:透過參數來和 function 溝通,藉此控制處理方式
- reducer: 用來接受一個
(state, action) => newState
,並回傳當前的 state 和對應的 dispatch 方法 - initState:設定 state 的初始值
const [state, dispatch] = useReducer(reducer, initState);
- 第一個參數是 function,第二個參數是其依賴陣列,會回傳一個 memoized 的 callback
- 在重新渲染時,只會在依賴改變時才更新,防止不必要的渲染,減少效能上的消耗
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
- 第一個參數是 function,第二個參數是其依賴陣列,會回傳一個 memoized 的值
- 在重新渲染時,傳到 useMemo 的 function 就只會在依賴改變時才執行,將 memoized 更新成回傳的值
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
- 會回傳一個 mutable 的 ref object,其
.current
屬性會被初始為傳入的參數 initialValue - 當
.current
屬性有變動時不會觸發重新 render,而每次 render 時都會給同一個 ref object
const refContainer = useRef(initialValue);
console.log(refContainer.current)
// initialValue
- 第一個參數是接收的 ref
- 第二個參數是傳給父層的方法
useImperativeHandle(ref, createHandle, [deps])
useDebugValue(value)