React自定义hook的方法


Posted in Javascript onJune 25, 2022
  • 什么是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内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Javascript 相关文章推荐
使用jQuery的ajax功能实现的RSS Reader 代码
Sep 03 Javascript
基于jQuery的图片不完全按比例自动缩小
Jul 11 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
Dec 19 Javascript
使用jQuery制作浮动工具栏的实例分享
May 13 Javascript
AngularJS创建自定义指令的方法详解
Nov 03 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
Jan 11 Javascript
Bootstrap超大屏幕的实现代码
Mar 22 Javascript
微信小程序中的swiper组件详解
Apr 14 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
Aug 14 Javascript
JS实现Cookie读、写、删除操作工具类示例
Aug 28 Javascript
简单使用webpack打包文件的实现
Oct 29 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
Jul 21 Javascript
小程序实现侧滑删除功能
Jun 25 #Javascript
小程序自定义轮播图圆点组件
Jun 25 #Javascript
微信小程序实现轮播图指示器
Jun 25 #Javascript
create-react-app开发常用配置教程
Jun 25 #Javascript
JavaScript架构搭建前端监控如何采集异常数据
Jun 25 #Javascript
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 #Javascript
JavaScript设计模式之原型模式详情
Jun 21 #Javascript
You might like
php对称加密算法示例
2014/05/07 PHP
深入认识JavaScript中的函数
2007/01/22 Javascript
JavaScript CSS修改学习第五章 给“上传”添加样式
2010/02/19 Javascript
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
Windows下搭建python开发环境详细步骤
2020/07/20 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
python线程信号量semaphore使用解析
2019/11/30 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
联谊会主持词
2014/03/26 职场文书
四议两公开实施方案
2014/03/28 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
《夸父追日》教学反思
2016/02/20 职场文书