1.为ä½è¦ä½¿ç¨React Hooksï¼
2.译值得推荐的钩t钩十大React Hook 库
3.什么是react生命周期和生命周期钩子函数?
4.React Hooks —— useEffect 由浅入深
5.React Hook
6.如何理解钩子函数
为ä½è¦ä½¿ç¨React Hooksï¼
å¨äºè§£React Hooksä¹åï¼æä»¬å¿ é¡»å ç¥éReactçå½æ°ç»ä»¶æ§è´¨ä»¥åçå½æ°ç»ä»¶ä¸ºä»ä¹è¦ç¨Hooksã
大ä¼å¿é½ç¥éï¼æ ç»ä»¶ä¸Reactï¼èReactçç»ä»¶åå为类å¼ç»ä»¶åå½æ°å¼ç»ä»¶ï¼ä¸ºä»ä¹å½æ°å¼ç»ä»¶å¤§åReactå¼åè çæ¨å¹¿ï¼
é¦å æ们ä»æºç çè§åº¦æ¥ç®åè°ä¸ä¸ç±»å¼ç»ä»¶åå½æ°å¼ç»ä»¶çåºå«ï¼
å®ä¹ç±»ç»ä»¶æ¶ï¼æä»¬å¿ é¡»ç»§æ¿React.Component
åæ¶ï¼å®å ·æä¸ä¸ªrenderå½æ°
å±ä»¬è§å¥½å°±æ¶ï¼æ¯ç«å ·ä½æä½éè¦æ¶åæºç ï¼ä¸æ¯ä¸æ¶åä¼è§£éçæ¸ çãé£ä¹renderå è½½ç»ä»¶æ¶ï¼åçäºä»ä¹ï¼
1.æ ¹æ®ç»ä»¶æ ç¾ï¼æ¾å°ç»ä»¶
2.ç±äºæ¯ç±»å¼ç»ä»¶ï¼å建æ°çå®ä¾ï¼å¹¶éè¿è¯¥å®ä¾è°ç¨å°ååä¸çrenderæ¹æ³
3.å°èæDom转å为çå®DOM
ç±»å¼ç»ä»¶è¢«å®ä¹ä¸ºå¤æçç»ä»¶ï¼è¿ä¸æ¯Reactæå¸æçï¼Reactæ³è¦çç»ä»¶æ¯çº¯å½æ°ç»æç管éï¼é£ä¹ä¾¿å¼åºäºä½ä¸ºç®åç»ä»¶çå½æ°ç»ä»¶ã
èå½æ°ç»ä»¶ä½ä¸ºä¸ä¸ªå½æ°ï¼æ¯æ²¡æ继æ¿React.Componentçï¼ä»åªéè¦ä¸¤æ¥ 1.æ¾å°ç»ä»¶ 2.渲æç»ä»¶ ï¼æ以ä¹å°± ä¸åå¨çå½å¨æï¼ä»¥åç¶æåthisã
è¿å°±æå³çï¼å½æ°ç»ä»¶å®ç°æå ³stateç管çï¼éè¦åå©reduxï¼ç§æ¿reduxè½ä¸ç¨å°±ä¸ç¨çååï¼å ¶å®æçæ¶åè¿è®é¦çï¼å ¨å±ç®¡çæ¹ä¾¿ï¼ï¼å¾å¾ä¼å¦åè½ç®åçReactç»ä»¶åå¾ç¬¨éã
äºæ¯Reactå¢éèª.8çæ¬ä»¥æ¥ï¼æ¨åºäºç¨³å®çReact HOOKSæ¥è§£å³ä¸è¿°é®é¢ã
React约å®é©åçåç¼ä¸ºuseï¼æ以éè¦èªå®ä¹é©åæ¶ï¼ä¸è¬ä½¿ç¨use为åç¼å建é©åãé¤æ¤ä¹å¤ï¼Reacté»è®¤æä¾äºåç§é©åï¼
1ï¼useState
ç¸å½äºä¸ç§éæ声æï¼ç®çæ¯å¼å ¥ç¶æï¼æ¤æ¶çé©åä¿åç¶æãuseState()æ¥æ¶å½æ°ç¶æçåå§å¼ï¼å ·æ两个åæ°ï¼ç¬¬ä¸ä¸ªä¸ºç¶æåéï¼ç¬¬äºä¸ªä¸ºæ¹åç¶æçæ¹æ³ï¼æ¯å¦const [number,setNumber] = useState(0)
2)useEffect
å¯ä½ç¨é©åï¼ç¨æ¥æ¿ä»£çå½å¨æï¼æ常è§æ¯åæå¡å¨è¯·æ±æ°æ®
useEffect()ä½ä¸ºå¸¸ç¨çé©åä¹ä¸ï¼æ¥æ¶ä¸¤ä¸ªåæ°ï¼ç¬¬ä¸ä¸ªåæ°æ¯å½æ°ï¼ç¬¬äºä¸ªåæ°æ¯ä¸ä¸ªæ°ç»ï¼ç»åºä¾èµé¡¹ï¼æ°ç»éçå¼ä»£è¡¨éè¦çæµç对象ã
é®é¢æ¥äºï¼çå½å¨æé£éä½ç°ï¼
å½ç»ä»¶åæ°åçæ¹åæ¶ï¼useEffect()å°±ä¼æ§è¡ãç»ä»¶ç¬¬ä¸æ¬¡æ¸²ææ¶ï¼useEffect()ä¹ä¼æ§è¡ãæ¯ä¸æ¯ç¸å½äºçå½å¨æä¸ç componentDidMount() å¢ï¼èuseEffect()ä¸çreturnï¼ä¸è¬åå¨ç¬¬ä¸ä¸ªåæ°çå¼æ¥æä½åï¼ç¸å½äº componentWillUnmount() ï¼å¨ç»ä»¶å¸è½½åæ§è¡ï¼åæ¶å°¾å·¥ä½ã
3ï¼useReducer
å±äºactioné©åï¼useReducer()å°ç®åºæ°çstateï¼è¿åä¸ä¸ªæ°ç»ãä¾å¦const [state, dispatch] = useReducer(ReducerFunc, initState)
第ä¸ä¸ªå¼æ¯å½åç¶æå¼ï¼ç¬¬äºä¸ªå¼æ¯åéactionçdispatchãä¸ReduxçReducerä¸æ ·ï¼è½å¤å ±äº«ç¶æï¼ä½æ¯ä¸åä¹å¤æ¯æ²¡æ³æä¾ä¸é´ä»¶åæ¶é´æ è¡(time travel)ã
4)useContext
å ±äº«ç¶æçä¸ä¸ªé©åï¼å¨ç»ä»¶å¤é¨å»ºç«ä¸ä¸ªContextï¼å 裹ç»ä»¶æ¶ï¼å¯ä»¥å°è¢«å 裹ç»ä»¶çç¶æå ±äº«ç»ç»ä»¶å é¨è°ç¨çå ¶ä»ç»ä»¶ï¼å³ï¼
1.å¤é¨å»ºç«Context()
2.å 裹å«æç¶æçç»ä»¶1
3.å¨å ¶ä»å½æ°ç»ä»¶å é¨è°ç¨è¯¥Context()æ¶ï¼å¯ä»¥å°ç»ä»¶1çç¶æå ±äº«
ä½æ¯æä¸ç¹éè¦æ³¨æçæ¯ï¼ä½¿ç¨useContextè¿è¡çæ°æ®æµç®¡çï¼æ¯å½contextæ´æ°æ¶ï¼ææ ä½¿ç¨ å°è¯¥contextçç»ä»¶é½ä¼éæ°æ¸²æãæ以éè¦æ¹æ³å¯¹useContext()è¿è¡ä¼åï¼åå°ä¸å¿ è¦çæ´æ°ï¼ä¼åæ¹æ³å¯ä»¥åèï¼ å¦ä½ä¼é å°å¤ç使ç¨React Context 导è´çä¸å¿ è¦æ¸²æé®é¢ï¼
é¤æ¤ä¹å¤è¿æä¸äºèªå¸¦çé©åï¼æ¯å¦ï¼
5)useCallbackåuseMemo
å¯ä»¥ç¨åReactæ§è½ä¼å
reactå¾ç¦ï¼ä¸ä½æ´æ°æ°æ®ï¼renderä¾æ¬¡diffå·æ°èç¹ï¼æ¦é½æ¦ä¸ä½ãuseCallbackåuseMemoå°±æ¯æ¦ä½ä»å·æ°çæ¹æ³ã
å设Reactç»ä»¶ä¸æ个buttonï¼åæ¶å£°æäºclickæ¹æ³ï¼æ¯æ¬¡renderæ¶ï¼buttonåclickæ¹æ³é½ä¼éæ°renderãäºæ¯å¯ä»¥ä½¿ç¨useCallback()ï¼é¿å ç»ä»¶éå¤æ æä¹ç渲æã
æ¯å¦ï¼
åå æ¯ç¼åäºç¸åçå¼ç¨ï¼ä»¥æ¤é¿å äºæ ærenderã
useMemoåæ°ç¨æ³ä¸è´ï¼ä¸è¿useCallbackä¸è¬ç¨äºç¼åå½æ°ï¼useMemoç¨äºç¼å计ç®ç»æä¹ç±»ã
useCallback(fn, deps)ç¸å½äºuseMemo(()=>fn, deps)
*å¯ä»¥æ¨åºï¼ä½¿ç¨useCallbackå®ç°useMemoçæ¹æ³ï¼
useMemo(fun,...deps)
useCallback(fun(...deps), [...deps])
è¿ä¸¤è æ¯çä»·çã
译值得推荐的十大React Hook 库
React Hook的出现为React开发者带来了革命性的变化,其在社区中的源码普及速度令人瞩目。随着时间的钩t钩推移,支持React Hook的源码库数量显著增长,使得开发者在编写代码时更加轻松、钩t钩高效。源码重庆小程序源码本文将聚焦于值得推荐的钩t钩十大React Hook库,旨在帮助开发者提高代码质量,源码优化可读性、钩t钩维护性,源码并减少重复编码。钩t钩
让我们逐一探索这十款库的源码独特功能及其在实际应用中的优势。
1. use-ponentWillMount`: 在组件挂载之前被调用,钩t钩易众课堂源码此时组件还没有生成实际的源码DOM,处于虚拟DOM的钩t钩状态。在这个阶段可以进行一些数据处理,比如查询或准备页面渲染所需的数据。
- `componentDidMount`: 在组件挂载完成之后被调用,此时页面已经生成实际的DOM。可以在这个阶段操作页面上的DOM元素,例如通过`document.getElementById`获取DOM对象,或者加载如echarts图表等。
- `componentWillUnmount`: 在组件即将被卸载之前调用。在这个方法中可以执行一些清理工作,例如清除定时器或解绑事件监听器。Android源码运行器
React Hooks —— useEffect 由浅入深
React Hooks: 深入理解 useEffect 的生命周期与优化</ 在React中,useEffect</钩子是一个强大的工具,用于在组件渲染后执行副作用操作,如DOM操作、数据获取和事件监听。它确保在视图更新后执行,保持组件逻辑清晰。 首先,让我们了解它的基本原理。每次组件渲染,useEffect中的代码会在视图更新后执行,比如在控制视频播放/暂停组件中,jsp校园跑腿源码我们学习如何正确地处理DOM操作,避免使用顶层ref可能导致的问题。 重要的是理解React对useEffect的执行策略。默认情况下,它在组件挂载、更新和卸载时运行,但React 引入了更严格的规范,确保Effect代码仅在必要时执行。这有助于性能优化,React Hook
react .8 以åå ä¸äº react hookï¼å®å¯ä»¥è®©ä½ å¨ä¸ç¼å class çæ åµä¸ä½¿ç¨ state 以åå ¶ä»ç React ç¹æ§ã.8ä¹åï¼reactç»ä»¶å¯ä»¥å为类ç»ä»¶åå½æ°ç»ä»¶ãæ们为ä»ä¹è¦æ¥æ±react hookï¼ç±äºç±»ç»ä»¶åå¨ä»¥ä¸å ç¹é®é¢ï¼
ä¸é¢éä¸ä»ç»å®æ¹æä¾çhook APIã
1.useState()
ä½ç¨ï¼è¿åä¸ä¸ªç¶æ以åè½ä¿®æ¹è¿ä¸ªç¶æçsetterï¼å¨å ¶ä»è¯è¨ç§°ä¸ºå ç»ï¼tupleï¼ï¼ä¸æ¦mountä¹ååªè½éè¿è¿ä¸ªsetterä¿®æ¹è¿ä¸ªç¶æã
2.useEffect(callback, arr)
ä½ç¨ï¼å¤çå½æ°ç»ä»¶ä¸çå¯ä½ç¨ï¼å¦å¼æ¥æä½ã延è¿æä½çãuseEffectæ两个åæ°ï¼callbackåæ°ç»ä¾èµé¡¹ï¼æ arræ¶ç¸å½äºcomponentDidMountçå½å¨æï¼æarræ¶ç¸å½componentDidMountåcomponentDidUpdataçå½å¨æãå¦æcallbackä¸æreturnï¼åç¸å½äºcomponentWillUnmountã
3.useContext
ä½ç¨ï¼è·¨ç»ä»¶å ±äº«æ°æ®é©åï¼ä½¿ç¨å¯å为ä¸æ¥ï¼
4.useReducer
ä½ç¨ï¼ç¨äºç®¡çå¤æçæ°æ®ç»æï¼useStateä¸è¬ç¨äºç®¡çæå¹³ç»æçç¶æï¼ï¼åºæ¬å®ç°äºreduxçæ ¸å¿åè½ã useState çæ¿ä»£æ¹æ¡ãå®æ¥æ¶ä¸ä¸ªå½¢å¦ (state, action) => newState ç reducerï¼å¹¶è¿åå½åç state 以åä¸å ¶é å¥ç dispatch æ¹æ³ã
5.useMemoãuseCallback
è¿ä¿©ä¸ªApiä¸æ§è½ä¼åæå ³ãreactä¸ï¼æ§è½çä¼åç¹å¨äºï¼
åºäºä¸é¢ç两ç¹ï¼æ们é常ç解å³æ¹æ¡æ¯ï¼ä½¿ç¨immutableè¿è¡æ¯è¾ï¼å¨ä¸ç¸ççæ¶åè°ç¨setStateï¼å¨shouldComponentUpdateä¸å¤æååçpropsåstateï¼å¦æ没æååï¼åè¿åfalseæ¥é»æ¢æ´æ°ã
å¨hooksåºæ¥ä¹åï¼æ们è½å¤ä½¿ç¨functionçå½¢å¼æ¥å建å å«å é¨stateçç»ä»¶ãä½æ¯ï¼ä½¿ç¨functionçå½¢å¼ï¼å¤±å»äºä¸é¢çshouldComponentUpdateï¼æ们æ æ³éè¿å¤æååç¶ææ¥å³å®æ¯å¦æ´æ°ãèä¸ï¼å¨å½æ°ç»ä»¶ä¸ï¼reactä¸ååºåmountåupdate两个ç¶æï¼è¿æå³çå½æ°ç»ä»¶çæ¯ä¸æ¬¡è°ç¨é½ä¼æ§è¡å ¶å é¨çææé»è¾ï¼é£ä¹ä¼å¸¦æ¥è¾å¤§çæ§è½æèãå æ¤useMemo åuseCallbackå°±æ¯è§£å³æ§è½é®é¢çææéã
useCallbackåuseMemoçåæ°è·useEffectä¸è´ãuseMemoåuseCallbacké½ä¼å¨ç»ä»¶ç¬¬ä¸æ¬¡æ¸²æçæ¶åæ§è¡ï¼ä¹åä¼å¨å ¶ä¾èµçåéåçæ¹åæ¶å次æ§è¡ï¼å¹¶ä¸è¿ä¸¤ä¸ªhooksé½è¿åç¼åçå¼ï¼useMemoè¿åç¼åçåéï¼useCallbackè¿åç¼åçå½æ°ã
éè¿ä¸ä¸ªä¾åæ¥çuseMemoçä½ç¨ï¼
ä¸ä½¿ç¨useMemoï¼æ 论countè¿æ¯valæ¹åé½ä¼æ§è¡expensive()
使ç¨useMemoï¼åªæå¨countåçæ¹å使æä¼ä¼æ§è¡expensive()
useCallbackè·useMemoæ¯è¾ç±»ä¼¼ï¼ä½æ¯ä½¿ç¨åºæ¯ä¸åï¼æ¯å¦æä¸ä¸ªç¶ç»ä»¶ï¼å ¶ä¸å å«åç»ä»¶ï¼åç»ä»¶æ¥æ¶ä¸ä¸ªå½æ°ä½ä¸ºpropsï¼é常èè¨ï¼å¦æç¶ç»ä»¶æ´æ°äºï¼åç»ä»¶ä¹ä¼æ§è¡æ´æ°ï¼ä½æ¯å¤§å¤æ°åºæ¯ä¸ï¼æ´æ°æ¯æ²¡æå¿ è¦çï¼æ们å¯ä»¥åå©useCallbackæ¥è¿åå½æ°ï¼ç¶åæè¿ä¸ªå½æ°ä½ä¸ºpropsä¼ éç»åç»ä»¶ï¼è¿æ ·ï¼åç»ä»¶å°±è½é¿å ä¸å¿ è¦çæ´æ°ã
6.useRef
useRefæ¯ä¸ä¸ªæ¹æ³ï¼è¿åä¸ä¸ªå¯åç ref 对象ï¼å ¶ .current å±æ§è¢«åå§åä¸ºä¼ å ¥çåæ°ï¼initialValueï¼ï¼å¯ä»¥ä¿åä»»ä½ç±»åçå¼:domã对象çä»»ä½å¯åå¼ï¼è¿åç ref 对象å¨ç»ä»¶çæ´ä¸ªçå½å¨æå ä¿æä¸åï¼ä¿®æ¹ ref çå¼æ¯ä¸ä¼å¼åç»ä»¶çéæ° render ã
useRefé常常ç¨çä¸ä¸ªæä½ï¼è®¿é®DOMèç¹ï¼å¯¹DOMè¿è¡æä½ï¼çå¬äºä»¶ççï¼å¦ä¸ï¼
é¤äºä¼ ç»çç¨æ³ä¹å¤,å®è¿å¯ä»¥â跨渲æå¨æâä¿åæ°æ®ã
å¨ä¸é¢çä¾åä¸ï¼ç¹å»äº æå°like æé®åï¼è¿ç»ç¹å»æ°åæé®ï¼ä¼åç°2så likeRef.current æå°åºï¼è like æå°åº1ã
å 为ï¼å¨ä»»æä¸æ¬¡æ¸²æä¸ï¼propså state æ¯å§ç»ä¿æä¸åçï¼å¦æpropsåstateå¨ä»»æä¸å渲æä¸æ¯ç¸äºç¬ç«çè¯ï¼é£ä¹ä½¿ç¨å°ä»ä»¬çä»»ä½å¼ä¹æ¯ç¬ç«çãæ以onButtonClickæ¶æ¿å°çæ¶æªç¹å»æ°åæé®æ¶ç like å¼ã
èref å¨ææ render é½ä¿æçå¯ä¸çå¼ç¨ï¼å æ¤ææç对 ref çèµå¼æè åå¼æ¿å°çé½æ¯ä¸ä¸ªæç»çç¶æï¼èä¸ä¼åå¨é离ã
7.useImperativeHandle
å½userRefç¨äºä¸ä¸ªç»ä»¶æ¶ï¼useImperativeHandle å¯ä»¥è®©ä½ å¨ä½¿ç¨ ref æ¶èªå®ä¹æ´é²ç»ç¶ç»ä»¶çå®ä¾å¼ï¼å¦æä¸ä½¿ç¨ï¼ç¶ç»ä»¶çref(chidlRef)访é®ä¸å°ä»»ä½å¼ï¼childRef.current==nullï¼ï¼ä¸ useImperativeHandle åºå½ä¸ forwardRef ä¸èµ·ä½¿ç¨ã
8.useLayoutEffect
ç¨æ³ä¸useEffect ç¸åï¼ä½å®ä¼å¨ææç DOM åæ´ä¹ååæ¥è°ç¨ï¼ç«å³æ§è¡ï¼ãå¯ä»¥ä½¿ç¨å®æ¥è¯»å DOM å¸å±å¹¶åæ¥è§¦åé渲æãå¨æµè§å¨æ§è¡ç»å¶ä¹åï¼useLayoutEffect å é¨çæ´æ°è®¡åå°è¢«åæ¥å·æ°ãç±äºä¼å¨æµè§å¨è¿è¡ä»»ä½ç»å¶ä¹åè¿è¡å®æï¼é»å¡äºæµè§å¨çç»å¶ã
使ç¨åºæ¯ï¼å½useEffectéé¢çæä½éè¦å¤çDOM,并ä¸ä¼æ¹å页é¢çæ ·å¼,å°±éè¦ç¨è¿ä¸ª,å¦åå¯è½ä¼åºç°éªå±é®é¢ã
9.useDebugValue
useDebugValue ç¨äºå¨ React å¼åè å·¥å ·ä¸æ¾ç¤º èªå®ä¹ Hook çæ ç¾ã
useDebugValue æ¥åä¸ä¸ªæ ¼å¼åå½æ°ä½ä¸ºå¯éç第äºä¸ªåæ°ã该å½æ°åªæå¨ Hook 被æ£æ¥æ¶æä¼è¢«è°ç¨ãå®æ¥å debug å¼ä½ä¸ºåæ°ï¼å¹¶ä¸ä¼è¿åä¸ä¸ªæ ¼å¼åçæ¾ç¤ºå¼ã
如何理解钩子函数
对于钩子函数,我起初对此称呼感到困惑,尽管在开发过程中并不需要深入了解,内存搜索ce源码但这个问题一直困扰了我很久。今天,我查阅了相关资料,并对此进行了一些总结。
钩子函数是许多开发语言中都会涉及的一个概念。简单来说,它是一种系统在处理消息时预先设置好的函数。打个比喻,就像某个周期性的任务由系统自动执行,我们如何在这个周期中人为地干预其进程呢?下面这张图可以更直观地说明这一点。
关于钩子函数,以下是一些基本概念:
1. 它是一种函数,当系统消息触发时,系统会自动调用它。
2. 它不是由用户直接触发的。
3. 使用钩子函数时,我们只需直接编写函数体。
钩子函数的名称是固定的,当系统消息触发时,系统会自动调用相应的钩子函数。
以react的componentWillUpdate函数为例,用户只需编写componentWillUpdate的函数体。当组件状态发生改变,需要更新时,系统会自动调用componentWillUpdate函数。
此外,还有一些常用的钩子函数,如vue生命周期的几个钩子函数等。
React 函数式组件和 React Hooks
本文将解析 React 中函数式组件和 Hooks 的概念与应用。函数式组件通过引入 Hooks 实现了状态和生命周期功能,简化了代码。
Hooks 是一类特殊的函数,为函数式组件提供了功能增强,使其具备类组件的特性。
React 需要 Hooks 概念的主要原因是解决类组件在状态管理和生命周期逻辑上的局限性。通过引入 Hooks,可以实现组件逻辑的清晰化,避免类组件中混杂多任务。
之前函数式组件存在的问题是无法存储状态,而 Hooks 则解决了这一问题。类组件的生命周期钩子函数逻辑混乱,而 Hooks 逻辑复用更佳,使得组件设计更加灵活。
引入 Hooks 使得函数式组件功能增强,解决了组件初始化和更新时重新执行的问题,同时使得组件状态管理更加高效。
Hooks 的优点在于逻辑复用性强,提高了代码的可读性和可维护性。相比高阶组件,Hooks 在实现功能的同时避免了引入的复杂性。
常用 Hooks 函数包括 useState, useEffect, useRef, useContext 和 useReducer 等。这些函数分别提供了不同场景下的功能,如状态管理、副作用处理、DOM 元素访问、数据共享和复杂状态管理。
Hooks 的使用遵循特定规则,以确保组件状态的正确管理。例如,不能在 if 判断中使用 Hooks,以保持组件状态的连续性和一致性。
综上所述,引入 Hooks 是 React 进行架构变革的重要一步,它不仅简化了组件逻辑,还提高了代码的可读性和复用性,使得函数式组件能够具备与类组件相近的功能。通过合理使用 Hooks,开发者可以构建出更加高效、灵活的组件化应用。