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与函数式编程解释
Apr 27 Javascript
javascript 异常处理使用总结
Jun 21 Javascript
Javascript 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
Feb 02 Javascript
深入理解逻辑表达式的用法 与或非的用法
Jun 06 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
Nov 25 Javascript
jQuery实现导航回弹效果
Feb 27 Javascript
vue-cli webpack 引入swiper的操作方法
Sep 15 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
Oct 07 Javascript
小程序实现图片移动缩放效果
May 26 Javascript
vue基础知识--axios合并请求和slot
Jun 04 Javascript
vue实现登陆页面开发实践
May 30 Vue.js
小程序实现侧滑删除功能
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
星际争霸兵种名称对照表
2020/03/04 星际争霸
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
javascript 表单验证常见正则
2009/09/28 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
python之Character string(实例讲解)
2017/09/25 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
python实现在一个画布上画多个子图
2020/01/19 Python
Python3运算符常见用法分析
2020/02/14 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
美国折扣网站:jClub
2017/08/07 全球购物
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
区域销售经理职责
2013/12/22 职场文书
建筑人员岗位职责
2013/12/25 职场文书
店面销售职位的职责
2014/03/09 职场文书
食品安全演讲稿
2014/09/01 职场文书
贫困生助学金感谢信
2015/01/21 职场文书
信仰观后感
2015/06/03 职场文书
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android
JavaScript中reduce()的用法
2022/05/11 Javascript