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 相关文章推荐
在chrome中window.onload事件的一些问题
Mar 01 Javascript
JQuery下的Live方法和$.browser方法使用代码
Jun 02 Javascript
jquery实现奇偶行赋值不同css值
Feb 17 Javascript
JS两种定义方式的区别、内部原理
Nov 21 Javascript
js实现点击添加一个input节点
Dec 05 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
Dec 01 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
Feb 22 Javascript
Javascript之BOM(window对象)详解
May 25 Javascript
jQuery使用方法
Feb 04 Javascript
JavaScript实现自动跳转文本功能
May 25 Javascript
SVG实现时钟效果
Jul 17 Javascript
js实现碰撞检测
Jan 29 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
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
JavaScript中json使用自己总结
2013/08/13 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
Python中实现常量(Const)功能
2015/01/28 Python
python使用urlparse分析网址中域名的方法
2015/04/15 Python
pygame播放音乐的方法
2015/05/19 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
python中subprocess批量执行linux命令
2018/04/27 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
Python之字典对象的几种创建方法
2020/09/30 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
如何撰写一封出色的求职信
2014/04/27 职场文书
给老婆的保证书范文
2014/04/28 职场文书
节约用水标语
2014/06/11 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
解放思想大讨论活动总结
2015/05/09 职场文书
运动会广播稿100字
2015/08/19 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
JavaScript分页组件使用方法详解
2021/07/26 Javascript