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 相关文章推荐
Tinymce+jQuery.Validation使用产生的BUG
Mar 29 Javascript
jquery 延迟执行实例介绍
Aug 20 Javascript
jQuery拖拽插件gridster使用指南
Apr 21 Javascript
JQuery鼠标移到小图显示大图效果的方法
Jun 10 Javascript
js图片卷帘门导航菜单特效代码分享
Sep 10 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
May 30 Javascript
json定义及jquery操作json的方法
Oct 03 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
Jun 28 Javascript
在 Node.js 中使用原生 ES 模块方法解析
Sep 19 Javascript
Vue封装Swiper实现图片轮播效果
Feb 06 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
JavaScript实现移动端拖动元素
Nov 24 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中调用JAVA
2006/10/09 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
解密效果
2006/06/23 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
Vue中引入样式文件的方法
2017/08/18 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
2019/09/04 Javascript
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
python查找目录下指定扩展名的文件实例
2015/04/01 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
2020/01/06 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
Java文件和目录(IO)操作
2014/08/26 面试题
赔偿协议书范本
2014/04/15 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
倡议书范文大全
2015/04/28 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis
JavaScript文档对象模型DOM
2021/11/20 Javascript
CSS3实现360度循环旋转功能
2022/02/12 HTML / CSS
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python
基于docker安装zabbix的详细教程
2022/06/05 Servers