首頁 > 軟體

React自定義hook的方法

2022-06-24 22:00:21
  • 什麼是hook

HookReact 16.8 的新增特性。它通常與函數式元件同時使用。可以使函數式元件在不編寫 class 的情況下,可以擁有class元件的狀態、生命週期、參照等功能。

  • 常用的有哪些hook

React中常用的hooks有:

  • useState 狀態管理
  • useEffect 生命週期
  • useContext 跨元件資料傳遞
  • useRef 元件參照
  • ....
  • 自定義hook

自定義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
  • 自動同步至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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com