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 10 Javascript
js 小数取整的函数
May 10 Javascript
javascript object array方法使用详解
Dec 03 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
Jun 24 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
Oct 15 Javascript
JS动态调用方法名示例介绍
Dec 18 Javascript
js加入收藏夹代码(兼容ie/ff/op)
May 16 Javascript
深入理解requestAnimationFrame的动画循环
Sep 20 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
Apr 24 Javascript
如何在postman测试用例中实现断言过程解析
Jul 09 Javascript
深入解析微信小程序开发中遇到的几个小问题
Jul 11 Javascript
JavaScript实现瀑布流布局的3种方式
Dec 27 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获取MAC地址的具体实例
2013/12/13 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
判断浏览器的javascript版本的代码
2010/09/03 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
浅谈Vue SSR中的Bundle的具有使用
2019/11/21 Javascript
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
介绍一下如何优化MySql
2016/12/20 面试题
外贸英语毕业生自荐信
2013/11/14 职场文书
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
《云雀的心愿》教学反思
2014/02/25 职场文书
项目申请汇报材料
2014/08/16 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
2014年终工作总结范本
2014/12/15 职场文书
中英文求职信范文
2015/03/19 职场文书
员工升职自荐信
2015/03/27 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
解析MySQL索引的作用
2022/03/03 MySQL