亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

React Hooks使用方法全方位介紹

 更新時(shí)間:2023年03月17日 08:44:37   作者:糖^O^  
在react類組件(class)寫(xiě)法中,有setState和生命周期對(duì)狀態(tài)進(jìn)行管理,但是在函數(shù)組件中不存在這些,故引入hooks(版本:>=16.8),使開(kāi)發(fā)者在非class的情況下使用更多react特性

hooks介紹

在react類組件(class)寫(xiě)法中,有setState和生命周期對(duì)狀態(tài)進(jìn)行管理,但是在函數(shù)組件中不存在,因此引入hooks

React的組件創(chuàng)建方式,一種是類組件,一種是純函數(shù)組件,并且React團(tuán)隊(duì)希望,組件不要變成復(fù)雜的容器,最好只是數(shù)據(jù)流的管道。開(kāi)發(fā)者根據(jù)需要,組合管道即可。也就是說(shuō)組件的最佳寫(xiě)法應(yīng)該是函數(shù),而不是類。

使用hooks理由

  • 高階組件為了復(fù)用,導(dǎo)致代碼層級(jí)復(fù)雜
  • 生命周期的復(fù)雜
  • 寫(xiě)成functional組件,無(wú)狀態(tài)組件 ,因?yàn)樾枰獱顟B(tài),又改成了class,成本高

類組件與函數(shù)組件的區(qū)別:

  • 函數(shù)組件沒(méi)有生命周期,類組件有(掛載、更新、銷毀)
  • 函數(shù)組件沒(méi)有狀態(tài)(state),類組件有
  • 函數(shù)組件沒(méi)有this,類組件有

useState(保存組件狀態(tài))

純函數(shù)組件沒(méi)有狀態(tài),useState()用于設(shè)置和使用組件的狀態(tài)屬性

const [state, setstate] = useState(initialState)
//state:初始狀態(tài)屬性,指向狀態(tài)當(dāng)前值
//setstate:修改狀態(tài)屬性函數(shù),用來(lái)更新?tīng)顟B(tài)
//initialState:狀態(tài)的初始值,該值會(huì)賦給state

state是一個(gè)對(duì)象:

setState()不會(huì)局部更新

useEffect()

useEffect()是副作用的鉤子,可以檢測(cè)數(shù)據(jù)更新 ,可以實(shí)現(xiàn)特定的功能,如異步請(qǐng)求

  • useEffect()接受兩個(gè)參數(shù),第一個(gè)參數(shù)是你要進(jìn)行的異步操作,第二個(gè)參數(shù)是一個(gè)數(shù)組,用來(lái)給出Effect()的依賴項(xiàng)。
  • 只要數(shù)組發(fā)生改變,useEffect()就會(huì)執(zhí)行。
  • 當(dāng)?shù)诙?xiàng)省略不填時(shí),useEffect()會(huì)在每次組件渲染時(shí)執(zhí)行,這一點(diǎn)類似于componentDidMount。
useEffect(() => {
//effect
return () => {
//cleanup
};
}, [依賴的狀態(tài);空數(shù)組,表示不依賴])

不要對(duì) Dependencies 撒謊,如果你明明使用了某個(gè)變量,卻沒(méi)有申明在依賴中,你等于向 React撒了謊,后果就是,當(dāng)依賴的變量改變時(shí),useEffffect也不會(huì)再次執(zhí)行, eslint會(huì)報(bào)警告

useEffffect和useLayoutEffffect區(qū)別: 

簡(jiǎn)單來(lái)說(shuō)就是調(diào)用時(shí)機(jī)不useLayoutEffect() 和原來(lái)componentDidMount &componentDidUpdate

一致,在react完成DOM更新后馬上同步調(diào)用的代碼,會(huì)阻塞頁(yè)面渲染。而 useEffect() 是會(huì)在整個(gè)頁(yè)面渲染完才會(huì)異步調(diào)用。

在實(shí)際使用時(shí)如果想避免頁(yè)面抖動(dòng)(在 useEffect 里修改DOM很有可能出現(xiàn))的話,可以把需要操作DOM的代碼放useLayoutEffect 里。在這里做點(diǎn)dom操作,這些dom修改會(huì)和 react 做出的更改一起被一次性渲染到屏幕上

useCallback(記憶函數(shù))

防止因?yàn)榻M件重新渲染,導(dǎo)致方法被重新創(chuàng)建,起到緩存作用;只有第二個(gè)參數(shù) 變化了,才重新聲明一次

var handleClick = useCallback(()=>{
console.log(name)
},[name])
<button onClick={()=>handleClick()}>hello</button>
//只有name改變后, 這個(gè)函數(shù)才會(huì)重新聲明一次,
//如果傳入空數(shù)組, 那么就是第一次創(chuàng)建后就被緩存, 如果name后期改變了,拿到的還是老的name。
//如果不傳第二個(gè)參數(shù),每次都會(huì)重新聲明一次,拿到的就是最新的name.

useMemo(記憶組件)

useCallback() 的功能完全可以由 useMemo() 所取代,使用 useMemo() 也可以返回一個(gè)記憶函數(shù)

useCallback(fn, inputs) is equivalent to useMemo(() => fn, inputs).

useCallback()與useMemo()的區(qū)別:

  • useCallback 不會(huì)執(zhí)行第一個(gè)參數(shù)函數(shù),而是將它返回給你,而useMemo會(huì)執(zhí)行第一個(gè)函數(shù)并且將函數(shù)執(zhí)行結(jié)果返回給你。
  • useCallback() 常用記憶事件函數(shù),生成記憶后的事件函數(shù)并傳遞給子組件使用。而 useMemo() 更適合經(jīng)過(guò)函數(shù)

useRef(保存引用值)

用于在函數(shù)組件中獲取真實(shí)的DOM元素對(duì)象或者是組件實(shí)例。(因?yàn)楹瘮?shù)組件沒(méi)有實(shí)例,所以這里的獲取組件實(shí)例指的是獲取類組件實(shí)例)

返回值是一個(gè)可變的ref對(duì)象,并且這個(gè)對(duì)象的值發(fā)生改變時(shí)不會(huì)引起頁(yè)面的渲染。

const myswiper = useRef(null);
<Swiper ref={myswipe}/

useRef()可以存儲(chǔ)不需要引起頁(yè)面渲染的數(shù)據(jù);修改useRef值的唯一方法是修改.current,且修改后不會(huì)引起重渲染。

useReducer

在使用React的過(guò)程中,如遇到狀態(tài)管理,一般會(huì)用到Redux,而React本身是不提供狀態(tài)管理的。而useReducer()提供了狀態(tài)管理

useState() 的替代方案,用于包含多種狀態(tài),或者下一個(gè) state 依賴于之前的 state,實(shí)現(xiàn)函數(shù)組件的狀態(tài)管理。

基本原理是通過(guò)用戶在頁(yè)面中發(fā)起action, 從而通過(guò)reducer方法來(lái)改變state, 從而實(shí)現(xiàn)頁(yè)面和狀態(tài)的通信。

useContext(減少組件層級(jí))

useContext()可以共享狀態(tài),作用是進(jìn)行狀態(tài)的分發(fā),避免了使用Props進(jìn)行數(shù)據(jù)的傳遞

import React from 'react'
var GlobalContext= React.createContext()
// 注意此時(shí)的reduecer 返回值是一個(gè)對(duì)象 {isShow:false,list:[]}
function App(props){
let [state,dispatch] = useReducer(reducer,{isShow:true,list:[]})
return <GlobalContext.Provider value={{
dispatch
}}>
<div>
{
state.isShow?
<div >我是選項(xiàng)卡</div>
:null
}
{props.children}
</div>
</GlobalContext.Provider>
}
function Detail(){
var {dispatch} = useContext(GlobalContext)
useEffect(() => {
//隱藏
dispatch({
type:"Hide",
payload:false
})
return () => {
//顯示
dispatch({
type:"Show",
payload:true
})
};
}, [])
return <div>
detail
</div>
}

自定義hooks

當(dāng)我們想在兩個(gè)函數(shù)之間共享邏輯時(shí),我們會(huì)把它提取到第三個(gè)函數(shù)中。

用戶自定義的Hooks:

  • 命名的要求:用use開(kāi)頭,后跟名稱(首字母大寫(xiě))
  • 作用:根據(jù)具體業(yè)務(wù)的需求,對(duì)Hooks中默認(rèn)的鉤子函數(shù)進(jìn)行封裝,使代碼的結(jié)構(gòu)更加清晰,便于使用和維護(hù)
import React, { useEffect, useState } from 'react'
function useToLocaleUpperCase(text) {
    const [name, setName] = useState(text)
    useEffect(() => {
        setName(name.toLocaleUpperCase())
    }, [])
    return { name };
}
export default function App() {
    const { name } = useToLocaleUpperCase('zhansan')
 
    return (
        <div>App-{name}
            <Child></Child>
        </div>
    )
}
function Child() {
    const { name } = useToLocaleUpperCase('lisi')
    return (
        <div>App-{name}</div>
    )
}

到此這篇關(guān)于React Hooks使用方法全方位介紹的文章就介紹到這了,更多相關(guān)React Hooks內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react使用axios進(jìn)行api網(wǎng)絡(luò)請(qǐng)求的封裝方法詳解

    react使用axios進(jìn)行api網(wǎng)絡(luò)請(qǐng)求的封裝方法詳解

    這篇文章主要為大家詳細(xì)介紹了react使用axios進(jìn)行api網(wǎng)絡(luò)請(qǐng)求的封裝方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • React Native使用百度Echarts顯示圖表的示例代碼

    React Native使用百度Echarts顯示圖表的示例代碼

    本篇文章主要介紹了React Native使用百度Echarts顯示圖表的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • react四種組件中DOM樣式設(shè)置方式詳解

    react四種組件中DOM樣式設(shè)置方式詳解

    這篇文章主要介紹了react之四種組件中DOM樣式設(shè)置方式,通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • React?Refs?的使用forwardRef?源碼示例解析

    React?Refs?的使用forwardRef?源碼示例解析

    這篇文章主要為大家介紹了React?之?Refs?的使用和?forwardRef?的源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • react寫(xiě)一個(gè)select組件的實(shí)現(xiàn)代碼

    react寫(xiě)一個(gè)select組件的實(shí)現(xiàn)代碼

    這篇文章主要介紹了react寫(xiě)一個(gè)select組件的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • React 路由懶加載的幾種實(shí)現(xiàn)方案

    React 路由懶加載的幾種實(shí)現(xiàn)方案

    這篇文章主要介紹了React 路由懶加載的幾種實(shí)現(xiàn)方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • react vue背景掛載機(jī)器問(wèn)題

    react vue背景掛載機(jī)器問(wèn)題

    這篇文章主要介紹了react vue背景掛載機(jī)器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React/Redux應(yīng)用使用Async/Await的方法

    React/Redux應(yīng)用使用Async/Await的方法

    本篇文章主要介紹了React/Redux應(yīng)用使用Async/Await的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • React如何以Hook的方式使用Echarts

    React如何以Hook的方式使用Echarts

    這篇文章主要介紹了React如何以Hook的方式使用Echarts問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 淺談react性能優(yōu)化的方法

    淺談react性能優(yōu)化的方法

    這篇文章主要介紹了淺談react性能優(yōu)化的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論