//方法一: 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> 复制代码
🔔第一步:让函数组件拥有state
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 决定。 复制代码
🔔第四步:让函数组件缓存优化(应用更多场景 更深层)
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 值。这种优化有助于避免在每次渲染时都进行高开销的计算
🔔第五步:让函数组件能拿到一个可变,但是在组件的生命周期中指向的是同一个的ref对象
const refContainer = useRef(initialValue); 复制代码
(不太确定有无问题,持续更新...)
本文使用 mdnice 排版