React Hook - 自定義Hook的基本使用和案例講解
自定義Hook
自定義Hook基本使用
自定義Hook本質(zhì)上只是一種函數(shù)代碼邏輯的抽取,嚴格意義上來說,它本身并不算React的特性。
例如有這樣一個需求: 所有的組件在創(chuàng)建和銷毀時都進行打印
組件被創(chuàng)建: 打印組件被創(chuàng)建了;
組件被銷毀: 打印組件被銷毀了;
如果每個組件我們都單獨編寫是非常繁瑣的, 并且有許多重復(fù)代碼; 我們可以將實現(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組件進包裹
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即可, 就不需要再單獨的
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)聽鼠標滾輪的位置, 如多個組件中都需要監(jiān)聽鼠標滾輪的數(shù)據(jù), 我們就可以封裝到一個自定義的Hook中
封裝一個自定義的Hook監(jiān)聽鼠標滾動的數(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
到此這篇關(guān)于React Hook - 自定義Hook的基本使用和案例練習(xí)的文章就介紹到這了,更多相關(guān)React自定義Hook內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用React-Router實現(xiàn)前端路由鑒權(quán)的示例代碼
這篇文章主要介紹了使用React-Router實現(xiàn)前端路由鑒權(quán)的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07React+echarts?(echarts-for-react)?實現(xiàn)中國地圖及省份切換功能
這篇文章主要介紹了React+echarts?(echarts-for-react)?畫中國地圖及省份切換,有足夠的地圖數(shù)據(jù),可以點擊到街道,示例我只出到市級,本文結(jié)合實例代碼給大家介紹的非常詳細需要的朋友可以參考下2022-11-11使用 React hooks 實現(xiàn)類所有生命周期
react 自 16.8 開始,引入了 Hooks 概念,使得函數(shù)組件中也可以擁有自己的狀態(tài),并且可以模擬對應(yīng)的生命周期,這篇文章主要介紹了使用 React hooks 怎么實現(xiàn)類里面的所有生命周期,需要的朋友可以參考下2023-02-02react中hooks使用useState的更新不觸發(fā)dom更新問題及解決
這篇文章主要介紹了react中hooks使用useState的更新不觸發(fā)dom更新問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01更強大的React 狀態(tài)管理庫Zustand使用詳解
這篇文章主要為大家介紹了更強大的React 狀態(tài)管理庫Zustand使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10React?Hook中的useState函數(shù)的詳細解析
Hook 就是 JavaScript 函數(shù),這個函數(shù)可以幫助你鉤入(hook into) React State以及生命周期等特性,這篇文章主要介紹了React?Hook?useState函數(shù)的詳細解析的相關(guān)資料,需要的朋友可以參考下2022-10-10react性能優(yōu)化useMemo與useCallback使用對比詳解
這篇文章主要為大家介紹了react性能優(yōu)化useMemo與useCallback使用對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08