React Native 常用Hooks詳解.md

useState

用于為函數(shù)組件保存狀態(tài)柬采。當(dāng)狀態(tài)改變,組件重新渲染時且警。狀態(tài)值依然不變粉捻,通過set方法來改變狀態(tài)值

import { useState } from "react"
import { Button, View, Text } from "react-native"

const App = () => {
    const [count, setCount] = useState<number>(0)
    return <>
        <View>
            <Text>{count}</Text>
            <Button
                title="+1"
                onPress={() => {
                    setCount(count + 1)
                }}></Button>
        </View>
    </>
}
  • 1.接收唯一的參數(shù)即狀態(tài)初始值,初始值可以時任意的數(shù)據(jù)類型
  • 2.返回值為數(shù)組斑芜,數(shù)組中存儲狀態(tài)值和更改狀態(tài)值的方法肩刃。方法名稱約定以set開頭,后面加上狀態(tài)名稱
  • 3.方法可以被調(diào)用多次杏头,用以保存不同的狀態(tài)值
  • 4.參數(shù)可以時一個函數(shù)盈包,函數(shù)返回什么,初始狀態(tài)值就是什么醇王,函數(shù)只會被調(diào)用一次呢燥,用在初始值時動態(tài)值的情況
    //從其他頁面?zhèn)魅氲闹底鳛槌跏贾担?       const [count, setCount] = useState<number>(()=>{
        return props.count
    })
  • 5.設(shè)置狀態(tài)值方法的參數(shù)可以是一個值,也可以是一個函數(shù)
    const handleCount = () => {
        setCount((count)=>{
            //也可以直接return 100寓娩,這樣的話count就直接被賦值為100了
            return count + 1
        })
    }

這樣叛氨,點擊按鈕,count自增的功能就實現(xiàn)了棘伴。

  • 6.設(shè)置狀態(tài)值的方法本身是異步的
   const handleCount = () => {
        setCount((count)=>{
            return count + 1
        })
        //這里的count不一定就是count+1后的值
        console.log(count)
    }

useEffect

讓函數(shù)型組件擁有處理副作用的能力寞埠,類似生命周期函數(shù)。

執(zhí)行時機(jī)

可以把useEffect看做componentDidMount(組件掛載)排嫌、componentDidUpdate(組件更新)和componentWillUnmount(組件卸載)這三個函數(shù)的組合畸裳。

  • 1.useEffect(()=>{})
    componentDidMount和componentDidUpdate,組件裝載和組件更新時執(zhí)行
  • 2.useEffect(()=>{},[])
    componentDidMount淳地,組件裝載時執(zhí)行
  • 3.useEffect(()=>()=>{})
    componentWillUnmount怖糊,組件卸載時執(zhí)行
    //組件掛載完成之后執(zhí)行帅容,組件數(shù)據(jù)更新完成之后執(zhí)行
    useEffect(() => {
        console.log('hello world!')
    })

    //組件掛載完成之后執(zhí)行
    useEffect(() => {
        console.log('hello world!')
    }, [])

    //組件被卸載之前執(zhí)行
    useEffect(() => {
        return () => {
            console.log('組件被卸載了')
        }
    })

    useEffect(() => {
        //組件掛載時執(zhí)行定時器
        const timerId = setInterval(() => {
            setCount(count+1)
        },1000)
        //組件卸載時清除定時器
        return () => {
            clearInterval(timerId)
        }
    },[])
useEffect的第二個參數(shù)
 //組件掛載完成之后執(zhí)行,組件數(shù)據(jù)更新完成之后執(zhí)行
    useEffect(() => {
        console.log('hello world!')
    })
 //組件掛載完成之后執(zhí)行伍伤,count改變之后執(zhí)行
    useEffect(() => {
        console.log('hello world!')
    },[count])

當(dāng)不設(shè)置第二個參數(shù)時并徘,useEffect將會在掛載和更新時都會執(zhí)行。但是有些情況扰魂,并不需要useEffect執(zhí)行麦乞,這個時候我們就可以設(shè)置第2個參數(shù)劝评,來指定useEffect在count改變的情況下執(zhí)行(組件掛載和count變化的情況下)姐直,這個時候就可以減少一些沒必要的執(zhí)行操作。

useEffect結(jié)合異步函數(shù)

useCallback

性能優(yōu)化蒋畜,緩存函數(shù)声畏,使組件重新渲染得到相同的函數(shù)實例。
每次組件重新渲染時姻成,得到的是相同的函數(shù)實例插龄,就不會導(dǎo)致里層的函數(shù)重新個渲染

useRef

獲取DOM元素對象
保存數(shù)據(jù)(跨組件周期)

useState保存的數(shù)據(jù),當(dāng)數(shù)據(jù)發(fā)生變化科展,會觸發(fā)重新渲染均牢。
useRef即使組件重新渲染,保存的數(shù)據(jù)仍然還在才睹,useRef保存的數(shù)據(jù)被更改不會觸發(fā)組件重新渲染徘跪。

useMemo

useMemo的行為類似Vue的計算屬性,可以監(jiān)測某個值的變化砂竖,根據(jù)變化值計算新值真椿。計算出的新值可以參與試圖渲染

useMemo會緩存計算結(jié)果,如果監(jiān)測值沒有發(fā)生變化乎澄,即將組件重新渲染突硝,也不會重新計算。此行為可以有助于避免在每個渲染上進(jìn)行昂貴的計算置济。

    //當(dāng)count發(fā)生變化時解恰,useMemo才會重新執(zhí)行,引用result的組件重新渲染浙于。count不變的話护盈,result就不會變化,被緩存下來
    const result = useMemo(() => {
        return count * 2
    },[count])
memo方法

性能優(yōu)化羞酗,如果本組件中的數(shù)據(jù)沒有發(fā)生變化腐宋,阻止組件更新。類似組件中的PureComponent 和 shouldComponentUpdate

    //count不變化,test組件不會重新渲染
    const test = memo(() => {
        return <Text>{count}</Text>
    })

useContext

useReducer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胸竞,一起剝皮案震驚了整個濱河市欺嗤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卫枝,老刑警劉巖煎饼,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異校赤,居然都是意外死亡吆玖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門马篮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沾乘,“玉大人,你說我怎么就攤上這事浑测∫饩ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵尽爆,是天一觀的道長。 經(jīng)常有香客問我读慎,道長漱贱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任夭委,我火速辦了婚禮幅狮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘株灸。我一直安慰自己崇摄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布慌烧。 她就那樣靜靜地躺著逐抑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屹蚊。 梳的紋絲不亂的頭發(fā)上厕氨,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音汹粤,去河邊找鬼命斧。 笑死,一個胖子當(dāng)著我的面吹牛嘱兼,可吹牛的內(nèi)容都是我干的国葬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼汇四!你這毒婦竟也來了接奈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤船殉,失蹤者是張志新(化名)和其女友劉穎鲫趁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體利虫,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡挨厚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了糠惫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疫剃。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖硼讽,靈堂內(nèi)的尸體忽然破棺而出巢价,到底是詐尸還是另有隱情,我是刑警寧澤固阁,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布壤躲,位于F島的核電站,受9級特大地震影響备燃,放射性物質(zhì)發(fā)生泄漏碉克。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一并齐、第九天 我趴在偏房一處隱蔽的房頂上張望漏麦。 院中可真熱鬧,春花似錦况褪、人聲如沸撕贞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捏膨。三九已至,卻和暖如春食侮,著一層夾襖步出監(jiān)牢的瞬間脊奋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工疙描, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留诚隙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓起胰,卻偏偏與公主長得像久又,于是被迫代替她去往敵國和親巫延。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1 關(guān)于hook 1.1 為什么使用hook 在react類組件(class)寫法中地消,有setState和生命周期...
    江湖yi山人閱讀 1,849評論 0 3
  • 你還在為該使用無狀態(tài)組件(Function)還是有狀態(tài)組件(Class)而煩惱嗎炉峰?——擁有了hooks,你再也不需...
    米亞流年閱讀 942評論 0 5
  • React是現(xiàn)在最流行的前端框架之一脉执,它的輕量化疼阔,組件化,單向數(shù)據(jù)流等特性把前端引入了一個新的高度半夷,現(xiàn)在它又引入的...
    老鼠AI大米_Java全棧閱讀 5,775評論 0 26
  • 你還在為該使用無狀態(tài)組件(Function)還是有狀態(tài)組件(Class)而煩惱嗎婆廊?——擁有了hooks,你再也不需...
    CodeMT閱讀 175評論 0 0
  • 你還在為該使用無狀態(tài)組件(Function)還是有狀態(tài)組件(Class)而煩惱嗎巫橄?——擁有了hooks淘邻,你再也不需...
    水落斜陽閱讀 82,323評論 11 100