//方法一:
constructor(props) { this.handleClickBind = this.handleClick.bind(this); } //使用時:在props不變時button不刷新 <button onClick={this.handleClickBind}></button> //方法二:因爲bind返回一個新函數,因此不管props是否變化始終刷新 <button onClick={this.handleClick.bind(this)}></button> //方法三:用箭頭函數穿透,與方法二相似每次都刷新 <button onClick={()=>this.handleClick()}></button> 複製代碼
🔔第一步:讓函數組件擁有stateweb
const [state,setState]=useState({...initialState})
複製代碼
🔔第二步:讓函數組件擁有生命週期數組
useEffect(() => {
fn() return unfn() },[controlparams]) 複製代碼
「使用時請注意:」緩存
🔔第三步:讓函數組件跨組件共享狀態編輯器
const context = useContext(Context); // Context 爲 context 對象(React.createContext 的返回值) // useContext 返回Context的返回值。 // 當前的 context 值由上層組件中距離當前組件最近的<Context.Provider> 的 value prop 決定。 複製代碼
🔔第四步:讓函數組件緩存優化(應用更多場景 更深層)ide
const [state, dispatch] = useReducer(reducer, initialState);
const initialState = {count: 0}; function reducer(state, action) { switch (action.type) { case 'increment': return {count: state.count + 1}; case ‘decrement’: return {count: state.count - 1}; default: throw new Error(); } } function Counter() { const [state, dispatch] = useReducer(reducer, initialState); return ( <> Count: {state.count} <button onClick={() => dispatch({type: 'decrement'})}>-</button> <button onClick={() => dispatch({type: 'increment'})}>+</button> </> ); } 複製代碼
🔔第四步:讓函數組件緩存優化(diff)函數
const memoizedCallback = useCallback(() => {fn(a, b);},[a, b],);
複製代碼
🔔第四步:讓函數組件緩存優化(diff)性能
const memoizedValue = useMemo(() => fn(a, b), [a, b]);
複製代碼
useCallback:接收一個內聯回調函數參數和一個依賴項數組(子組件依賴父組件的狀態,即子組件會使用到父組件的值) ,useCallback 會返回該回調函數的 memoized 版本,該回調函數僅在某個依賴項改變時纔會更新 useMemo:把建立函數和依賴項數組做爲參數傳入 useMemo,它僅會在某個依賴項改變時才從新計算 memoized 值。這種優化有助於避免在每次渲染時都進行高開銷的計算flex
🔔第五步:讓函數組件能拿到一個可變,可是在組件的生命週期中指向的是同一個的ref對象優化
const refContainer = useRef(initialValue);
複製代碼
(不太肯定有無問題,持續更新...)ui
本文使用 mdnice 排版