最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用 React hooks 實(shí)現(xiàn)類所有生命周期

 更新時(shí)間:2023年02月08日 08:45:45   作者:北海嶼鹿  
react 自 16.8 開始,引入了 Hooks 概念,使得函數(shù)組件中也可以擁有自己的狀態(tài),并且可以模擬對(duì)應(yīng)的生命周期,這篇文章主要介紹了使用 React hooks 怎么實(shí)現(xiàn)類里面的所有生命周期,需要的朋友可以參考下

在 React 16.8 之前,函數(shù)組件也稱為無狀態(tài)組件,因?yàn)楹瘮?shù)組件也不能訪問 react 生命周期,也沒有自己的狀態(tài)。react 自 16.8 開始,引入了 Hooks 概念,使得函數(shù)組件中也可以擁有自己的狀態(tài),并且可以模擬對(duì)應(yīng)的生命周期。

應(yīng)該在什么時(shí)候使用 Hooks 呢?

官方并不建議把原有的 class 組件,大規(guī)模重構(gòu)成 Hooks,而是有一個(gè)漸進(jìn)過程:

  • 首先,原有的函數(shù)組件如果需要自己的狀態(tài)或者需要訪問生命周期函數(shù),那么用 Hooks 是再好不過了;
  • 另外就是,可以先在一些邏輯較簡單的組件上嘗試 Hooks ,在使用起來相對(duì)較熟悉,且組內(nèi)人員比較能接受的前提下,再擴(kuò)大 Hooks 的使用范圍。

那么相對(duì)于傳統(tǒng)class, Hooks 有哪些優(yōu)勢?

  • State Hook 使得組件內(nèi)的狀態(tài)的設(shè)置和更新相對(duì)獨(dú)立,這樣便于對(duì)這些狀態(tài)單獨(dú)測試并復(fù)用。
  • Hook 將組件中相互關(guān)聯(lián)的部分拆分成更小的函數(shù)(比如設(shè)置訂閱或請(qǐng)求數(shù)據(jù)),而并非強(qiáng)制按照生命周期劃分,這樣使得各個(gè)邏輯相對(duì)獨(dú)立和清晰。

class 生命周期在 Hooks 中的實(shí)現(xiàn)

Hooks 組件更接近于實(shí)現(xiàn)狀態(tài)同步,而不是響應(yīng)生命周期事件。但是,由于先熟悉的 class 的生命周期,在寫代碼時(shí),難免會(huì)受此影響,那么 Hooks 中如何模擬 class 的中的生命周期呢:

總結(jié):

class 組件Hooks 組件
constructoruseState
getDerivedStateFromPropsuseEffect 手動(dòng)對(duì)比 props, 配合 useState 里面 update 函數(shù)
shouldComponentUpdateReact.memo
render函數(shù)本身
componentDidMountuseEffect 第二個(gè)參數(shù)為[]
componentDidUpdateuseEffect 配合useRef
componentWillUnmountuseEffect 里面返回的函數(shù)
componentDidCatch
getDerivedStateFromError

代碼實(shí)現(xiàn):

import React, { useState, useEffect, useRef, memo } from 'react';
 
// 使用 React.memo 實(shí)現(xiàn)類似 shouldComponentUpdate 的優(yōu)化, React.memo 只對(duì) props 進(jìn)行淺比較
const UseEffectExample = memo((props) => {
    console.log("===== UseStateExample render=======");
    // 聲明一個(gè)叫 “count” 的 state 變量。
    const [count, setCount] = useState(0);
    const [count2, setCount2] = useState(0);
    const [fatherCount, setFatherCount] = useState(props.fatherCount)
 
    console.log(props);
 
    // 模擬 getDerivedStateFromProps
    useEffect(() => {
        // props.fatherCount 有更新,才執(zhí)行對(duì)應(yīng)的修改,沒有更新執(zhí)行另外的邏輯
        if(props.fatherCount == fatherCount ){
            console.log("======= 模擬 getDerivedStateFromProps=======");
            console.log(props.fatherCount, fatherCount);
        }else{
            setFatherCount(props.fatherCount);
            console.log(props.fatherCount, fatherCount);
        }
    })
 
    // 模擬DidMount
    useEffect(() => {
        console.log("=======只渲染一次(相當(dāng)于DidMount)=======");
        console.log(count);
    }, [])
 
    // 模擬DidUpdate
    const mounted = useRef();
    useEffect(() => {
        console.log(mounted);
        if (!mounted.current) {
            mounted.current = true;
          } else {
            console.log("======count 改變時(shí)才執(zhí)行(相當(dāng)于DidUpdate)=========");
            console.log(count);
          }
    }, [count])
 
    // 模擬 Didmount和DidUpdate 、 unmount
    useEffect(() => {
    	// 在 componentDidMount,以及 count 更改時(shí) componentDidUpdate 執(zhí)行的內(nèi)容
        console.log("======初始化、或者 count 改變時(shí)才執(zhí)行(相當(dāng)于Didmount和DidUpdate)=========");
        console.log(count);
        return () => {
        	
            console.log("====unmount=======");
            console.log(count);
        }
    }, [count])
 
    return (
        <div>
            <p>You clicked {count} times</p>
            <button onClick={() => setCount(count + 1)}>
                Click me
            </button>
 
            <button onClick={() => setCount2(count2 + 1)}>
                Click me2
            </button>
        </div>
    );
});
 
export default UseEffectExample;

注意事項(xiàng)

  • useState 只在初始化時(shí)執(zhí)行一次,后面不再執(zhí)行;
  • useEffect 相當(dāng)于是 componentDidMount,componentDidUpdate 和 componentWillUnmount 這三個(gè)函數(shù)的組合,可以通過傳參及其他邏輯,分別模擬這三個(gè)生命周期函數(shù);
  • useEffect 第二個(gè)參數(shù)是一個(gè)數(shù)組,如果數(shù)組為空時(shí),則只執(zhí)行一次(相當(dāng)于componentDidMount);如果數(shù)組中有值時(shí),則該值更新時(shí),useEffect 中的函數(shù)才會(huì)執(zhí)行;如果沒有第二個(gè)參數(shù),則每次render時(shí),useEffect 中的函數(shù)都會(huì)執(zhí)行;
  • React 保證了每次運(yùn)行 effect 的同時(shí),DOM 都已經(jīng)更新完畢,也就是說 effect 中的獲取的 state 是最新的,但是需要注意的是,effect 中返回的函數(shù)(其清除函數(shù))中,獲取到的 state 是更新前的。
  • 傳遞給 useEffect 的函數(shù)在每次渲染中都會(huì)有所不同,這是刻意為之的。事實(shí)上這正是可以在 effect 中獲取最新的 count 的值,而不用擔(dān)心其過期的原因。每次我們重新渲染,都會(huì)生成新的 effect,替換掉之前的。某種意義上講,effect 更像是渲染結(jié)果的一部分 —— 每個(gè) effect “屬于”一次特定的渲染。
  • effect 的清除階段(返回函數(shù))在每次重新渲染時(shí)都會(huì)執(zhí)行,而不是只在卸載組件的時(shí)候執(zhí)行一次。它會(huì)在調(diào)用一個(gè)新的 effect 之前對(duì)前一個(gè) effect 進(jìn)行清理,從而避免了手動(dòng)去處理一些邏輯 。為了說明這一點(diǎn),下面按時(shí)間列出一個(gè)可能會(huì)產(chǎn)生的訂閱和取消訂閱操作調(diào)用序列:
function FriendStatus(props) {  
	// ...  
	useEffect(() => {  
    	// ...  
      	ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);  
    	return () => {  
    		ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);  
    	};  
	});  
    
    // ...
}
    
// Mount with { friend: { id: 100 } } props  
ChatAPI.subscribeToFriendStatus(100, handleStatusChange);     // 運(yùn)行第一個(gè) effect  
 
// Update with { friend: { id: 200 } } props  
ChatAPI.unsubscribeFromFriendStatus(100, handleStatusChange); // 清除上一個(gè) effect  
ChatAPI.subscribeToFriendStatus(200, handleStatusChange);     // 運(yùn)行下一個(gè) effect  
 
// Update with { friend: { id: 300 } } props  
ChatAPI.unsubscribeFromFriendStatus(200, handleStatusChange); // 清除上一個(gè) effect  
ChatAPI.subscribeToFriendStatus(300, handleStatusChange);     // 運(yùn)行下一個(gè) effect  
 
// Unmount  
ChatAPI.unsubscribeFromFriendStatus(300, handleStatusChange); // 清除最后一個(gè) effect  

到此這篇關(guān)于使用 React hooks 怎么實(shí)現(xiàn)類里面的所有生命周期的文章就介紹到這了,更多相關(guān)React hooks生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React替換傳統(tǒng)拷貝方法的Immutable使用

    React替換傳統(tǒng)拷貝方法的Immutable使用

    Immutable.js出自Facebook,是最流行的不可變數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)之一。它實(shí)現(xiàn)了完全的持久化數(shù)據(jù)結(jié)構(gòu),使用結(jié)構(gòu)共享。所有的更新操作都會(huì)返回新的值,但是在內(nèi)部結(jié)構(gòu)是共享的,來減少內(nèi)存占用
    2023-02-02
  • Redux模塊化拆分reducer函數(shù)流程介紹

    Redux模塊化拆分reducer函數(shù)流程介紹

    Reducer是個(gè)純函數(shù),即只要傳入相同的參數(shù),每次都應(yīng)返回相同的結(jié)果。不要把和處理數(shù)據(jù)無關(guān)的代碼放在Reducer里,讓Reducer保持純凈,只是單純地執(zhí)行計(jì)算,這篇文章主要介紹了Redux拆分reducer函數(shù)流程
    2022-09-09
  • React配置代理服務(wù)器的5種方法及使用場景

    React配置代理服務(wù)器的5種方法及使用場景

    這篇文章主要介紹了React配置代理服務(wù)器的5種方法,無論使用哪種方法,都需要確保代理服務(wù)器的地址和端口正確,并且在配置完成后重新啟動(dòng)React開發(fā)服務(wù)器,使配置生效,需要的朋友可以參考下
    2023-08-08
  • React?Native?中限制導(dǎo)入某些組件和模塊的方法

    React?Native?中限制導(dǎo)入某些組件和模塊的方法

    這篇文章主要介紹了React?Native?中限制導(dǎo)入某些組件和模塊的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • React使用useImperativeHandle自定義暴露給父組件的示例詳解

    React使用useImperativeHandle自定義暴露給父組件的示例詳解

    useImperativeHandle?是?React?提供的一個(gè)自定義?Hook,用于在函數(shù)組件中顯式地暴露給父組件特定實(shí)例的方法,本文將介紹?useImperativeHandle的基本用法、常見應(yīng)用場景,需要的可以參考下
    2024-03-03
  • 30分鐘帶你全面了解React Hooks

    30分鐘帶你全面了解React Hooks

    Hooks是一種函數(shù),該函數(shù)允許您從函數(shù)式組件 “勾住(hook into)”React狀態(tài)和生命周期功能。Hooks在類內(nèi)部不起作用 - 它們允許你無需類就使用 React。
    2021-05-05
  • ReactRouterV6如何獲取當(dāng)前路由參數(shù)

    ReactRouterV6如何獲取當(dāng)前路由參數(shù)

    這篇文章主要介紹了ReactRouterV6如何獲取當(dāng)前路由參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • react中使用heatmap.js實(shí)現(xiàn)熱力圖的繪制

    react中使用heatmap.js實(shí)現(xiàn)熱力圖的繪制

    heatmap.js?是一個(gè)用于生成熱力圖的?JavaScript?庫,React?是一個(gè)流行的?JavaScript?庫,用于構(gòu)建用戶界面,本小編給大家介紹了在React?應(yīng)用程序中使用heatmap.js實(shí)現(xiàn)熱力圖的繪制的示例,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • forwardRef?中React父組件控制子組件的實(shí)現(xiàn)代碼

    forwardRef?中React父組件控制子組件的實(shí)現(xiàn)代碼

    forwardRef 用于拿到父組件傳入的 ref 屬性,這樣在父組件便能通過 ref 控制子組件,這篇文章主要介紹了forwardRef?-?React父組件控制子組件的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2024-01-01
  • react中涉及的增加,刪除list方式

    react中涉及的增加,刪除list方式

    這篇文章主要介紹了react中涉及的增加,刪除list方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

新绛县| 大化| 肃北| 五河县| 鄂州市| 施甸县| 贡嘎县| 富川| 万安县| 河北省| 资兴市| 宁城县| 仙桃市| 化德县| 蒙阴县| 博白县| 望奎县| 龙泉市| 湘西| 中牟县| 乳源| 宿迁市| 瑞安市| 即墨市| 双牌县| 许昌县| 商水县| 柘荣县| 桑植县| 建德市| 九龙城区| 泸定县| 巴东县| 绥滨县| 江西省| 景谷| 彩票| 双江| 雅安市| 拜泉县| 元谋县|