自定義Hooks 函數 和 用Hooks 創建組件很相似,跟我們平時用 JavaScript 寫函數幾乎一模一樣,可能就是多了些 React Hooks 的特性,自定義 Hooks 函數偏向於功能,而組件偏向於界面和業務邏輯。
自定義Hooks 函數獲取窗口大小
import React,{useState,useEffect,useCallback} from 'react'
function useWinSize(){
const [size,setSize] = useState({ //先用useState設置size狀態
width:document.documentElement.clientWidth,
height:document.documentElement.clientHeight
})
//編寫一個每次修改狀態的方法 onResize
const onResize = useCallback( //使用callback,目的是為了緩存方法(useMemo是為了緩存變量)
() => {
setSize({
width:document.documentElement.clientWidth,
height:document.documentElement.clientHeight
})
},
[],
)
//在第一次進入方法時使用useEffect 來注冊 resize 監聽事件
useEffect(() => {
window.addEventListener('resize:',onResize)
return () => {
window.removeEventListener('resize:',onResize) //為了防止一直監聽,在方法移除時,使用return 的方式移除監聽
}
}, [])
return size; //最后返回size變量
}
//編寫組件並使用自定義函數
function HWinsize(){
const size=useWinSize()
return(
<div>
頁面size:{size.width} x {size.height}
</div>
)
}
export default HWinsize;
在瀏覽器中預覽一下結果,可以看到當我們放大縮小瀏覽器窗口時,頁面上的結果都會跟着變化。
