<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Hook
是 React 16.8
的新增特性。它通常與函數式元件同時使用。可以使函數式元件在不編寫 class
的情況下,可以擁有class
元件的狀態、生命週期、參照等功能。
React
中常用的hooks
有:
useState
狀態管理useEffect
生命週期useContext
跨元件資料傳遞useRef
元件參照自定義hook
其實就是自定義函數,與我們寫函陣列件非常類似。自定義的hook
元件的命名與系統的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(() => { //監聽size變化 window.addEventListener('resize', () => { setSize({ width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }) }) return () => { //元件銷燬時移除監聽 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
在瀏覽器拖動放大縮小時,頁面上的資料可動態變化
目標:通過 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(() => { //監聽 window.addEventListener('scroll', () => { setOff({ x: window.scrollX, y: window.scrollY }) }) return () => { //移除監聽 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
目標:通過 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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45