React自定義hook的方法
Hook是 React 16.8 的新增特性。它通常與函數式組件同時使用??梢允购瘮凳浇M件在不編寫 class 的情況下,可以擁有class組件的狀態(tài)、生命周期、引用等功能。
React中常用的hooks有:
useState狀態(tài)管理useEffect生命周期useContext跨組件數據傳遞useRef組件引用- ....
自定義hook其實就是自定義函數,與我們寫函數組件非常類似。自定義的hook組件的命名與系統(tǒng)的hooks一樣,需要以use開頭。下面我們用react+ts就來介紹一下常用的幾個自定義hook
- 獲取窗口寬高變化
實現目標:通過 useWindowSize()來實時獲取窗口的寬高
新建一個hook文件useWindowSize.ts,代碼如下:
import { useEffect, useState } from "react";
//定義size對象
interface WindowSize {
width: number,
height: number
}
const useWindowSize = () => {
const [size, setSize] = useState<WindowSize>({
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
})
useEffect(() => {
//監(jiān)聽size變化
window.addEventListener('resize', () => {
setSize({
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
})
})
return () => {
//組件銷毀時移除監(jiān)聽
window.removeEventListener('resize', () => {
setSize({
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
})
})
}
},[])
return size
}
export default useWindowSize組件中這樣使用:
import useWindowSize from './hooks/useWindowSize';
function App() {
const size = useWindowSize()
return (
<div>
<div>頁面寬度:{size.width}</div>
<div>頁面高度:{size.height}</div>
</div>
)
}
export default App在瀏覽器拖動放大縮小時,頁面上的數據可動態(tài)變化
- 獲取滾動偏移量變化
目標:通過 useWindowScroll()來實時獲取頁面的滾動偏移量
新建一個hook文件useWindowScroll.ts,代碼如下:
import { useEffect, useState } from "react"
//定義偏移量對象
interface ScrollOffset {
x: number,
y: number
}
const useWindowScroll = () => {
const [off, setOff] = useState<ScrollOffset>({
x: window.scrollX,
y: window.scrollY
})
useEffect(() => {
//監(jiān)聽
window.addEventListener('scroll', () => {
setOff({
x: window.scrollX,
y: window.scrollY
})
})
return () => {
//移除監(jiān)聽
window.removeEventListener('scroll', () => {
setOff({
x: window.scrollX,
y: window.scrollY
})
})
}
})
return off
}
export default useWindowScroll組件中這樣使用:
import useWindowScroll from './hooks/useWindowScroll';
function App() {
const offSet = useWindowScroll()
return (
<div style={{height: '10000px', width: '10000px'}}>
<div>滾動y:{offSet.y}</div>
<div>滾動x:{offSet.x}</div>
</div>
)
}
export default App- 自動同步至localStorage
目標:通過 const [value, setValue] = useLocalStorage('key', 'value') 可以傳入默認的初始value和key,且每次修改value可以自動同步到localStorage中
新建一個hook類useLocalStorage,代碼如下:
import { useEffect, useState } from "react"
const useLocalStorage = (key: string, defaultValue: string) : ([string, React.Dispatch<React.SetStateAction<string>>]) => {
const [value, setValue] = useState(defaultValue)
useEffect(() => {
window.localStorage.setItem(key, value)
},[key, value])
return [value, setValue]
}
export default useLocalStorage組件中使用:
import useLocalStorage from './hooks/useLocalStorage';
function App() {
const [value, setValue] = useLocalStorage('key', 'react')
return (
<div>
<button onClick={() => {
//點擊修改value,會自動同步至本地
setValue('vue')
}}>點擊</button>
<div>{ value }</div>
</div>
)
}
export default App到此這篇關于React自定義hook的文章就介紹到這了,更多相關React自定義hook內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
TS裝飾器bindThis優(yōu)雅實現React類組件中this綁定
這篇文章主要為大家介紹了TS裝飾器bindThis優(yōu)雅實現React類組件中this綁定,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
使用react-beautiful-dnd實現列表間拖拽踩坑
相比于react-dnd,react-beautiful-dnd更適用于列表之間拖拽的場景,本文主要介紹了使用react-beautiful-dnd實現列表間拖拽踩坑,感興趣的可以了解一下2021-05-05
React Native中ScrollView組件輪播圖與ListView渲染列表組件用法實例分析
這篇文章主要介紹了React Native中ScrollView組件輪播圖與ListView渲染列表組件用法,結合實例形式詳細分析了ScrollView組件輪播圖與ListView渲染列表組件具體功能、使用方法與操作注意事項,需要的朋友可以參考下2020-01-01

