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 相关文章推荐
javascript的函数
Jan 31 Javascript
DOM基础教程之事件类型
Jan 20 Javascript
jquery制作图片时钟特效
Mar 30 Javascript
JavaScript计划任务后台运行的方法
Dec 18 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
Aug 23 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
Oct 24 Javascript
Bootstrap导航条的使用和理解3
Dec 14 Javascript
深入理解javascript的getTime()方法
Feb 16 Javascript
jQuery给表格添加分页效果
Mar 02 Javascript
swiper自定义分页器使用方法详解
Sep 14 Javascript
微信小程序支付功能 php后台对接完整代码分享
Jun 12 Javascript
Vue element-ui父组件控制子组件的表单校验操作
Jul 17 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网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
js 实现菜单上下显示附效果图
2013/11/21 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
javascript如何实现create方法
2019/11/04 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
跟老齐学Python之再深点,更懂list
2014/09/20 Python
Python守护进程用法实例分析
2015/06/04 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
python实现按长宽比缩放图片
2018/06/07 Python
python实现微信小程序自动回复
2018/09/10 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
基于python监控程序是否关闭
2020/01/14 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
html5将图片转换成base64的实例代码
2016/09/21 HTML / CSS
zooplus意大利:在线宠物商店
2019/08/07 全球购物
农民工工资发放承诺书
2014/03/31 职场文书
综艺节目策划方案
2014/06/13 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis