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

React Hook - 自定義Hook的基本使用和案例講解

 更新時(shí)間:2022年11月23日 10:20:44   作者:藍(lán)桉cyq  
自定義Hook本質(zhì)上只是一種函數(shù)代碼邏輯的抽取,嚴(yán)格意義上來(lái)說(shuō),它本身并不算React的特性,這篇文章主要介紹了React類(lèi)組件和函數(shù)組件對(duì)比-Hooks的介紹及初體驗(yàn),需要的朋友可以參考下

自定義Hook

自定義Hook基本使用

自定義Hook本質(zhì)上只是一種函數(shù)代碼邏輯的抽取,嚴(yán)格意義上來(lái)說(shuō),它本身并不算React的特性。

例如有這樣一個(gè)需求: 所有的組件在創(chuàng)建和銷(xiāo)毀時(shí)都進(jìn)行打印

組件被創(chuàng)建: 打印組件被創(chuàng)建了;

組件被銷(xiāo)毀: 打印組件被銷(xiāo)毀了;

如果每個(gè)組件我們都單獨(dú)編寫(xiě)是非常繁瑣的, 并且有許多重復(fù)代碼; 我們可以將實(shí)現(xiàn)這樣邏輯相同的代碼抽離為一個(gè)自定義的Hook

import { useEffect } from 'react'

// 自定義Hook
function useLogLife() {
  useEffect(() => {
    console.log("組件被創(chuàng)建")
    return () => {
      console.log("組件被銷(xiāo)毀")
    }
  }, [])
}

在其他的組件中調(diào)用自定義Hook即可

import React, { memo, useState, useEffect } from 'react'

// 自定義Hook
function useLogLife() {
  useEffect(() => {
    console.log("組件被創(chuàng)建")
    return () => {
      console.log("組件被銷(xiāo)毀")
    }
  }, [])
}

// Home組件
const Home = memo(() => {
  // 在組件中調(diào)用自定義Hook
  useLogLife()

  return (
    <h2>Home Page</h2>
  )
})

// About組件
const About = memo(() => {
  // 在組件中調(diào)用自定義Hook
  useLogLife()

  return (
    <h2>About Page</h2>
  )
})

// App根組件
const App = memo(() => {
  const [isShow, setIsShow] = useState(true)

  // 在組件中調(diào)用自定義Hook
  useLogLife()

  return (
    <div>
      <h2>App</h2>
      {/* 控制子組件顯式隱藏 */}
      <button onClick={() => setIsShow(!isShow)}>切換</button>
      { isShow && <Home/> }
      { isShow && <About/> }
    </div>
  )
})

export default App

自定義Hook案例練習(xí)

獲取Context數(shù)據(jù)

案例練習(xí)一: Context的共享, 例如我們有UserContext和TokenContext需要在多個(gè)組件中使用

例如先定義兩個(gè)Context

import { createContext } from "react";

const UserContext = createContext()
const TokenContext = createContext()

export {
  UserContext,
  TokenContext
}

使用定義的Context對(duì)App組件進(jìn)包裹

const root = ReactDOM.createRoot(document.querySelector("#root"))

root.render(
  <UserContext.Provider value={{user: "chenyq", password: 1234}}>
    <TokenContext.Provider value={"abcdefg"}>
      <App/>
    </TokenContext.Provider>
  </UserContext.Provider>
)

將從Context中獲取數(shù)據(jù)的操作封裝到一個(gè)自定義Hook中

import { useContext } from "react";
import { TokenContext, UserContext } from "../context";

function useUserToken() {
  const user = useContext(UserContext)
  const token = useContext(TokenContext)

  return [user, token]
}

export default useUserToken

在其他要使用UserContext和TokenContext共享數(shù)據(jù)的組件中直接使用自定義Hook即可, 就不需要再單獨(dú)的

import React, { memo } from 'react'
import useUserToken from './hooks/useUserToken'

// Home組件
const Home = memo(() => {
  const [user, token] = useUserToken()

  return (
    <h2>{user.user}-{user.password}-{token}</h2>
  )
})

// About組件
const About = memo(() => {
  const [user, token] = useUserToken()

  return (
    <h2>{user.user}-{user.password}-{token}</h2>
  )
})

// App根組件
const App = memo(() => {
  const [user, token] = useUserToken()

  return (
    <div>
      <h2>{user.user}-{user.password}-{token}</h2>
      <Home/>
      <About/>
    </div>
  )
})

export default App

獲取窗口滾輪數(shù)據(jù)

案例練習(xí)二: 在組件中監(jiān)聽(tīng)鼠標(biāo)滾輪的位置, 如多個(gè)組件中都需要監(jiān)聽(tīng)鼠標(biāo)滾輪的數(shù)據(jù), 我們就可以封裝到一個(gè)自定義的Hook中

封裝一個(gè)自定義的Hook監(jiān)聽(tīng)鼠標(biāo)滾動(dòng)的數(shù)據(jù), 由于監(jiān)聽(tīng)的操作屬于是副作用, 并且使用自定義Hook的組件如果重新渲染, 我們監(jiān)聽(tīng)的操作是不需要重新執(zhí)行的, 因此我們編寫(xiě)在Effect Hook中

import React, { memo } from 'react'
import useUserToken from './hooks/useUserToken'

// Home組件
const Home = memo(() => {
  const [user, token] = useUserToken()

  return (
    <h2>{user.user}-{user.password}-{token}</h2>
  )
})

// About組件
const About = memo(() => {
  const [user, token] = useUserToken()

  return (
    <h2>{user.user}-{user.password}-{token}</h2>
  )
})

// App根組件
const App = memo(() => {
  const [user, token] = useUserToken()

  return (
    <div>
      <h2>{user.user}-{user.password}-{token}</h2>
      <Home/>
      <About/>
    </div>
  )
})

export default App

在需要監(jiān)聽(tīng)的組件中調(diào)用自定義Hook, 就可以拿到滾動(dòng)的數(shù)據(jù)

import "./style.css"
import React, { memo } from 'react'
import useScrollPosition from './hooks/useScrollPosition'

// App根組件
const App = memo(() => {
  // 獲取自定義Hook中監(jiān)聽(tīng)滾動(dòng)的數(shù)據(jù)
  const [scrollX, scrollY] = useScrollPosition()
  console.log(scrollX, scrollY)

  return (
    <div className="app">
      <h2>App</h2>
    </div>
  )
})

export default App

到此這篇關(guān)于React Hook - 自定義Hook的基本使用和案例練習(xí)的文章就介紹到這了,更多相關(guān)React自定義Hook內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入掌握 react的 setState的工作機(jī)制

    深入掌握 react的 setState的工作機(jī)制

    本篇文章主要介紹了深入掌握 react的 setState的工作機(jī)制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • react實(shí)現(xiàn)阻止父容器滾動(dòng)

    react實(shí)現(xiàn)阻止父容器滾動(dòng)

    這篇文章主要介紹了react實(shí)現(xiàn)阻止父容器滾動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • react中關(guān)于Context/Provider/Consumer傳參的使用

    react中關(guān)于Context/Provider/Consumer傳參的使用

    這篇文章主要介紹了react中關(guān)于Context/Provider/Consumer傳參的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • React實(shí)現(xiàn)浮層組件的思路與方法詳解

    React實(shí)現(xiàn)浮層組件的思路與方法詳解

    React?浮層組件(也稱(chēng)為彈出組件或彈窗組件)通常是指在用戶(hù)界面上浮動(dòng)顯示的組件,本文主要介紹了浮層組件的實(shí)現(xiàn)方法,感興趣的小伙伴可以了解下
    2024-02-02
  • React中使用外部樣式的3種方式(小結(jié))

    React中使用外部樣式的3種方式(小結(jié))

    這篇文章主要介紹了React中使用外部樣式的3種方式(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • react生命周期(類(lèi)組件/函數(shù)組件)操作代碼

    react生命周期(類(lèi)組件/函數(shù)組件)操作代碼

    react代碼模式分為兩種類(lèi)組件和函數(shù)組件(生命周期也有所不同),這篇文章主要介紹了react生命周期(類(lèi)組件/函數(shù)組件),需要的朋友可以參考下
    2023-01-01
  • 基于antd的autocomplete的二次封裝查詢(xún)示例

    基于antd的autocomplete的二次封裝查詢(xún)示例

    這篇文章主要為大家介紹了基于antd的autocomplete的二次封裝查詢(xún)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • React中引用CSS方式及寫(xiě)法大全(三種方式)

    React中引用CSS方式及寫(xiě)法大全(三種方式)

    在React中引用CSS的方法有多種,可以根據(jù)個(gè)人的喜好和項(xiàng)目的需求來(lái)選擇,本文主要介紹了React中引用CSS方式及寫(xiě)法大全,感興趣的可以了解一下
    2023-10-10
  • JavaScript中React 面向組件編程(下)

    JavaScript中React 面向組件編程(下)

    在React面向組件編程中,除了上一章節(jié)的組件實(shí)例的三大核心屬性以外,還有很多重要的內(nèi)容比如:React 的生命周期,受控組件與非受控組件,高階函數(shù)和函數(shù)柯里化的理解等,在本文中會(huì)給大家繼續(xù)講解React 面向組件編程中剩余的內(nèi)容
    2023-03-03
  • react?redux及redux持久化示例詳解

    react?redux及redux持久化示例詳解

    這篇文章主要為大家介紹了react?redux及redux持久化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論

陕西省| 嘉鱼县| 凤冈县| 买车| 阿拉善盟| 庆云县| 洛南县| 孝义市| 苗栗县| 和林格尔县| 景宁| 安达市| 陆川县| 德令哈市| 九寨沟县| 斗六市| 禄劝| 漾濞| 西平县| 珠海市| 邢台市| 湘阴县| 柳江县| 宜昌市| 偃师市| 湖口县| 霍林郭勒市| 阜康市| 雷波县| 满城县| 云林县| 扎兰屯市| 五指山市| 沾化县| 平乡县| 昭通市| 卢龙县| 龙井市| 伊宁市| 棋牌| 怀远县|