網(wǎng)站首頁 編程語言 正文
自定義Hook
自定義Hook基本使用
自定義Hook本質(zhì)上只是一種函數(shù)代碼邏輯的抽取,嚴(yán)格意義上來說,它本身并不算React的特性。
例如有這樣一個需求: 所有的組件在創(chuàng)建和銷毀時都進(jìn)行打印
組件被創(chuàng)建: 打印組件被創(chuàng)建了;
組件被銷毀: 打印組件被銷毀了;
如果每個組件我們都單獨(dú)編寫是非常繁瑣的, 并且有許多重復(fù)代碼; 我們可以將實(shí)現(xiàn)這樣邏輯相同的代碼抽離為一個自定義的Hook
import { useEffect } from 'react'
// 自定義Hook
function useLogLife() {
useEffect(() => {
console.log("組件被創(chuàng)建")
return () => {
console.log("組件被銷毀")
}
}, [])
}
在其他的組件中調(diào)用自定義Hook即可
import React, { memo, useState, useEffect } from 'react'
// 自定義Hook
function useLogLife() {
useEffect(() => {
console.log("組件被創(chuàng)建")
return () => {
console.log("組件被銷毀")
}
}, [])
}
// 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需要在多個組件中使用
例如先定義兩個Context
import { createContext } from "react";
const UserContext = createContext()
const TokenContext = createContext()
export {
UserContext,
TokenContext
}
使用定義的Context對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ù)的操作封裝到一個自定義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)聽鼠標(biāo)滾輪的位置, 如多個組件中都需要監(jiān)聽鼠標(biāo)滾輪的數(shù)據(jù), 我們就可以封裝到一個自定義的Hook中
封裝一個自定義的Hook監(jiān)聽鼠標(biāo)滾動的數(shù)據(jù), 由于監(jiān)聽的操作屬于是副作用, 并且使用自定義Hook的組件如果重新渲染, 我們監(jiān)聽的操作是不需要重新執(zhí)行的, 因此我們編寫在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)聽的組件中調(diào)用自定義Hook, 就可以拿到滾動的數(shù)據(jù)
import "./style.css"
import React, { memo } from 'react'
import useScrollPosition from './hooks/useScrollPosition'
// App根組件
const App = memo(() => {
// 獲取自定義Hook中監(jiān)聽滾動的數(shù)據(jù)
const [scrollX, scrollY] = useScrollPosition()
console.log(scrollX, scrollY)
return (
<div className="app">
<h2>App</h2>
</div>
)
})
export default App
原文鏈接:https://lanan.blog.csdn.net/article/details/126874856
相關(guān)推薦
- 2022-07-12 Linux環(huán)境Jenkins部署
- 2022-08-23 C++?primer超詳細(xì)講解泛型算法_C 語言
- 2023-01-19 GO語言的map類型實(shí)例詳解_Golang
- 2022-07-16 淺談常見的加密算法
- 2022-10-23 Python?selenium?八種定位元素的方式_python
- 2022-05-08 Python與C語言分別解決完全平方數(shù)問題_python
- 2023-01-01 matplotlib基本圖形繪制操作實(shí)例_python
- 2022-06-08 記錄linux ens33網(wǎng)卡啟動失敗的問題
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支