React自定義hook

本文首發(fā)于公眾號【一個老碼農(nóng)】

  • 什么是hook

HookReact 16.8 的新增特性。它通常與函數(shù)式組件同時使用。可以使函數(shù)式組件在不編寫 class 的情況下,可以擁有class組件的狀態(tài)、生命周期、引用等功能。

  • 常用的有哪些hook

React中常用的hooks有:

  1. useState 狀態(tài)管理
  2. useEffect 生命周期
  3. useContext 跨組件數(shù)據(jù)傳遞
  4. useRef 組件引用
  5. ....
  • 自定義hook

自定義hook其實就是自定義函數(shù),與我們寫函數(shù)組件非常類似。自定義的hook組件的命名與系統(tǒng)的hooks一樣,需要以use開頭。下面我們用react+ts就來介紹一下常用的幾個自定義hook

  1. 獲取窗口寬高變化

實現(xiàn)目標(biāo):通過 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(() => {
        const fun = () => {
            setSize({
                width: document.documentElement.clientWidth,
                height: document.documentElement.clientHeight
            })
        }
        window.addEventListener('resize', fun)
        return () => {
            window.removeEventListener('resize', fun)
        }
    },[])
    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

在瀏覽器拖動放大縮小時,頁面上的數(shù)據(jù)可動態(tài)變化

  1. 獲取滾動偏移量變化

目標(biāo):通過 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(() => {
    
        const fun = () => {
            setOff({
                x: window.scrollX,
                y: window.scrollY
            })
        }
        //監(jiān)聽
        window.addEventListener('scroll', fun)
        return () => {
            //移除監(jiān)聽
            window.removeEventListener('scroll', fun)
        }
    })
    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

  1. 自動同步至localStorage

目標(biāo):通過
const [value, setValue] = useLocalStorage('key', 'value')可以傳入默認(rèn)的初始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

原文地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容