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 11 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
May 11 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
Jun 20 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
Oct 09 Javascript
原生js实现图片层叠轮播切换效果
Feb 02 Javascript
Javascript 6里的4个新语法
Aug 25 Javascript
微信小程序 video详解及简单实例
Jan 16 Javascript
vue使用keep-alive实现数据缓存不刷新
Oct 21 Javascript
javascript中的隐式调用
Feb 10 Javascript
vue中keep-alive组件的入门使用教程
Jun 06 Javascript
微信小程序开发之转发分享功能
Oct 22 Javascript
jquery传参及获取方式(两种方式)
Feb 13 jQuery
小程序实现侧滑删除功能
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
Email+URL的判断和自动转换函数
2006/10/09 PHP
php生成随机数或者字符串的代码
2008/09/05 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
jQuery入门知识简介
2010/03/04 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
理解python多线程(python多线程简明教程)
2014/06/09 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
python数据爬下来保存的位置
2020/02/17 Python
Django choices下拉列表绑定实例
2020/03/13 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
房地产出纳岗位职责
2013/12/01 职场文书
高中班级口号
2014/06/09 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
2014年科技工作总结
2014/11/26 职场文书
建党伟业的观后感
2015/06/01 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python