模擬react中的hooks方法,實現自定義的hooks來封裝我們需要重復使用的組件,來優化代碼。這種hooks也是利用了react的原生hooks來實現我們需要的特定業務,可以返回任何我們需要的值,也可以不返回值,作為一個副作用方法使用
第三方hooks
- ahooks 官網地址 https://ahooks.js.org/zh-CN
- react-use 文檔地址: https://github.com/streamich/react-use
下面,封裝了幾個自己的簡單hooks,加深下對hooks的理解
修改頁面標題
-
實現效果
-
實現代碼
import { useEffect } from 'react'export function useTitle(title: string): void {useEffect(() => {document.title = title}, [])
}
捕獲鼠標位置
- 實現效果
- 實現代碼
import { useCallback, useEffect } from 'react'
import { useImmer } from 'use-immer'type TPosition = {x: numbery: number
}function useMouse(): TPosition {const [position, setPosition] = useImmer<TPosition>({x: 0,y: 0})const updateMouse = useCallback((e: MouseEvent) => {console.log('useEffect updateMouse')setPosition(draft => {draft.x = e.clientXdraft.y = e.clientY})}, [])useEffect(() => {document.addEventListener('mousemove', updateMouse)return () => {document.removeEventListener('mousemove', updateMouse)}})return position
}export default useMouse
異步請求
- 實現效果
- 實現代碼
import { useEffect } from 'react'
import { useImmer } from 'use-immer'type TResult = {name: stringage: number
}
function getInfo(): Promise<TResult> {return new Promise(resolve => {setTimeout(() => {resolve({name: 'why',age: 18})}, 2000)})
}const useGetInfo = () => {const [loading, setLoading] = useImmer(false)const [info, setInfo] = useImmer<TResult | null>(null)useEffect(() => {setLoading(true)getInfo().then(result => {setInfo(result)setLoading(false)})}, [])return { loading, info }
}export default useGetInfo