React Hook - 自定义Hook的基本使用和案例讲解

目录
  • 自定义Hook
    • 自定义Hook基本使用
    • 自定义Hook案例练习
      • 获取Context数据
      • 获取窗口滚轮数据

自定义Hook

自定义Hook基本使用

自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上来说,它本身并不算React的特性。

例如有这样一个需求: 所有的组件在创建和销毁时都进行打印

组件被创建: 打印组件被创建了;

组件被销毁: 打印组件被销毁了;

如果每个组件我们都单独编写是非常繁琐的, 并且有许多重复代码; 我们可以将实现这样逻辑相同的代码抽离为一个自定义的Hook

import { useEffect } from 'react'

// 自定义Hook
function useLogLife() {
  useEffect(() => {
    console.log("组件被创建")
    return () => {
      console.log("组件被销毁")
    }
  }, [])
}

在其他的组件中调用自定义Hook即可

import React, { memo, useState, useEffect } from 'react'

// 自定义Hook
function useLogLife() {
  useEffect(() => {
    console.log("组件被创建")
    return () => {
      console.log("组件被销毁")
    }
  }, [])
}

// Home组件
const Home = memo(() => {
  // 在组件中调用自定义Hook
  useLogLife()

  return (
    <h2>Home Page</h2>
  )
})

// About组件
const About = memo(() => {
  // 在组件中调用自定义Hook
  useLogLife()

  return (
    <h2>About Page</h2>
  )
})

// App根组件
const App = memo(() => {
  const [isShow, setIsShow] = useState(true)

  // 在组件中调用自定义Hook
  useLogLife()

  return (
    <div>
      <h2>App</h2>
      {/* 控制子组件显式隐藏 */}
      <button onClick={() => setIsShow(!isShow)}>切换</button>
      { isShow && <Home/> }
      { isShow && <About/> }
    </div>
  )
})

export default App

自定义Hook案例练习

获取Context数据

案例练习一: Context的共享, 例如我们有UserContext和TokenContext需要在多个组件中使用

例如先定义两个Context

import { createContext } from "react";

const UserContext = createContext()
const TokenContext = createContext()

export {
  UserContext,
  TokenContext
}

使用定义的Context对App组件进包裹

const root = ReactDOM.createRoot(document.querySelector("#root"))

root.render(
  <UserContext.Provider value={{user: "chenyq", password: 1234}}>
    <TokenContext.Provider value={"abcdefg"}>
      <App/>
    </TokenContext.Provider>
  </UserContext.Provider>
)

将从Context中获取数据的操作封装到一个自定义Hook中

import { useContext } from "react";
import { TokenContext, UserContext } from "../context";

function useUserToken() {
  const user = useContext(UserContext)
  const token = useContext(TokenContext)

  return [user, token]
}

export default useUserToken

在其他要使用UserContext和TokenContext共享数据的组件中直接使用自定义Hook即可, 就不需要再单独的

import React, { memo } from 'react'
import useUserToken from './hooks/useUserToken'

// Home组件
const Home = memo(() => {
  const [user, token] = useUserToken()

  return (
    <h2>{user.user}-{user.password}-{token}</h2>
  )
})

// About组件
const About = memo(() => {
  const [user, token] = useUserToken()

  return (
    <h2>{user.user}-{user.password}-{token}</h2>
  )
})

// App根组件
const App = memo(() => {
  const [user, token] = useUserToken()

  return (
    <div>
      <h2>{user.user}-{user.password}-{token}</h2>
      <Home/>
      <About/>
    </div>
  )
})

export default App

获取窗口滚轮数据

案例练习二: 在组件中监听鼠标滚轮的位置, 如多个组件中都需要监听鼠标滚轮的数据, 我们就可以封装到一个自定义的Hook中

封装一个自定义的Hook监听鼠标滚动的数据, 由于监听的操作属于是副作用, 并且使用自定义Hook的组件如果重新渲染, 我们监听的操作是不需要重新执行的, 因此我们编写在Effect Hook中

import React, { memo } from 'react'
import useUserToken from './hooks/useUserToken'

// Home组件
const Home = memo(() => {
  const [user, token] = useUserToken()

  return (
    <h2>{user.user}-{user.password}-{token}</h2>
  )
})

// About组件
const About = memo(() => {
  const [user, token] = useUserToken()

  return (
    <h2>{user.user}-{user.password}-{token}</h2>
  )
})

// App根组件
const App = memo(() => {
  const [user, token] = useUserToken()

  return (
    <div>
      <h2>{user.user}-{user.password}-{token}</h2>
      <Home/>
      <About/>
    </div>
  )
})

export default App

在需要监听的组件中调用自定义Hook, 就可以拿到滚动的数据

import "./style.css"
import React, { memo } from 'react'
import useScrollPosition from './hooks/useScrollPosition'

// App根组件
const App = memo(() => {
  // 获取自定义Hook中监听滚动的数据
  const [scrollX, scrollY] = useScrollPosition()
  console.log(scrollX, scrollY)

  return (
    <div className="app">
      <h2>App</h2>
    </div>
  )
})

export default App

到此这篇关于React Hook - 自定义Hook的基本使用和案例练习的文章就介绍到这了,更多相关React自定义Hook内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • React-Hook中使用useEffect清除定时器的实现方法

    目录 useEffect useEffect清除定时器 最后 useEffect 之前我们学习了class组件的声明周期,那么我们想在函数式组件中做一些声明周期有关操作能否实现呢?函数式组件中是没有生命周期的,所以就可以使用useEffect来替代.我们可以把useEffect看作组件加载.组件更新.组件卸载的三个生命周期方法的组合. 下面我们一起来通过案例学习useEffect的使用:1.这里需求是写一个点击事件让state累加,并且吧state展示在title上2.首先要导入React, {

  • React Hooks - useContetx和useReducer的使用实例详解

    目录 useContetx的使用 useReducer的使用 useContetx的使用 在之前的开发中,我们要在组件中使用共享的Context有两种方式: 类组件可以通过 类名.contextType = MyContext 的方式,在类中获取context; 多个Context或者在函数式组件中通过 MyContext.Consumer 方式共享context; 但是多个Context共享时的方式会存在大量的嵌套(会导致代码阅读性非常差): Context Hook允许我们通过Hook来直接

  • React Hooks核心原理深入分析讲解

    目录 Hooks 闭包 开始动手实现 将useState应用到组件中 过期闭包 模块模式 实现useEffect 支持多个Hooks Custom Hooks 重新理解Hooks规则 React Hooks已经推出一段时间,大家应该比较熟悉,或者多多少少在项目中用过.写这篇文章简单分析一下Hooks的原理,并带大家实现一个简易版的Hooks. 这篇写的比较细,相关的知识点都会解释,给大家刷新一下记忆. Hooks Hooks是React 16.8推出的新功能.以这种更简单的方式进行逻辑复用.之前

  • React中常用的Hook有哪些

    目录 一.简介 二.使用 1.State Hook 2.Effect Hook 3.Ref Hook 一.简介 Hook是React 16.8.0版本增加的新特性/新语法 可以在函数组件中使用 state 以及其他的 React 特性 二.使用 1.State Hook (1)State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作 (2)语法: const [xxx, setXxx] = React.useState(initValue) (3)useState()说明

  • React Hook - 自定义Hook的基本使用和案例讲解

    目录 自定义Hook 自定义Hook基本使用 自定义Hook案例练习 获取Context数据 获取窗口滚轮数据 自定义Hook 自定义Hook基本使用 自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上来说,它本身并不算React的特性. 例如有这样一个需求: 所有的组件在创建和销毁时都进行打印 组件被创建: 打印组件被创建了; 组件被销毁: 打印组件被销毁了; 如果每个组件我们都单独编写是非常繁琐的, 并且有许多重复代码; 我们可以将实现这样逻辑相同的代码抽离为一个自定义的Hook i

  • React自定义hook的方法

    目录 什么是hook 常用的有哪些hook 自定义hook 什么是hook Hook是 React 16.8 的新增特性.它通常与函数式组件同时使用.可以使函数式组件在不编写 class 的情况下,可以拥有class组件的状态.生命周期.引用等功能. 常用的有哪些hook React中常用的hooks有: useState 状态管理 useEffect 生命周期 useContext 跨组件数据传递 useRef 组件引用 .... 自定义hook 自定义hook其实就是自定义函数,与我们写函数

  • react实现自定义拖拽hook

    前沿 最近发现公司的产品好几个模块用到了拖拽功能,之前拖拽组件是通过Html5 drag Api 实现的但体验并不是很好,顺便将原来的拖拽组建稍做修改,写一个自定义hook,方便大家使用拖拽功能. 正文 拖拽功能原理: 1.拖拽元素通过addEventListener监听器添加鼠标按下,鼠标移动,以及鼠标抬起事件.2.再通过getBoundingClientRect() 得到拖拽元素四周相对于可拖拽区域边界的距离.3.鼠标移动时计算x轴和y轴的移动偏移量.4.通过element.style.tr

  • react中常见hook的使用方式

    1.什么是hook? react hook是react 16.8推出的方法,能够让函数式组件像类式组件一样拥有state.ref.生命周期等属性. 2.为什么要出现hook? 函数式组件是全局当中一个普通函数,在非严格模式下this指向window,但是react内部开启了严格模式,此时this指向undefined,无法像类式组件一样使用state.ref,函数式组件定义的变量都是局部的,当组件进行更新时会重新定义,也无法存储,所以在hook出现之前,函数式组件有很大的局限性,通常情况下都会使

  • 30行代码实现React双向绑定hook的示例代码

    目录 使用Proxy代理数据 使用useRef创建同一份数据引用 添加更新handler 去除多次Proxy 添加缓存完善代码 总结 Sandbox 示例 Vue和MobX中的数据可响应给我们留下了深刻的印象,在React函数组件中我们也可以依赖hooks来实现一个简易好用的useReactive. 看一下我们的目标 const CountDemo = () => { const reactive = useReactive({ count: 0, }); return ( <div onCl

  • React项目中hook实现展示对话框功能

    目录 思路:使用全局状态管理所有对话框 尝试设计一个API去做对话框的全局管理 实现:创建NiceModal组件和相关API 处理对话框的返回值 总结 React中使用对话框并不容易,主要因为: 对话框需要在父组件中声明,才能在子组件中控制其是否显示 给对话框传递参数只能由props传入,这意味着所有状态管理都必须在更高阶的组件中.而实际上这个对话框的参数只在子组件中才会维护.这时就需要我们使用自定义事件将参数传回 这些问题的本质就是:如何用一个统一的方式去管理对话框,从而让对话框相关的业务逻辑

  • vue3的自定义hook函数使用

    目录 自定义hook函数使用 vue3 hooks函数示例 官方示例代码---封装前 使用hooks函数封装后 hooks函数 自定义hook函数使用 使用Vue3的组合API封装的可复用的功能函数 自定义hook的作用类似于vue2中的mixin技术 自定义Hook的优势: 很清楚复用功能代码的来源, 更清楚易懂 需求1: 收集用户鼠标点击的页面坐标 这里先看一下大体项目结构: 这里的hooks下的文件是示例代码,public内的是测试数据 在启动项目后,测试public的data文件内的数据

  • 详解Vue 自定义hook 函数

    目录 定义 使用 封装发ajax请求的hook函数(ts版本) 定义 什么是hook? 本质是一个函数,把 setup 函数中使用的 Composition API (组合API)进行了封装 类似于 vue2.x 中的 mixin 自定义 hook 的优势: 复用代码,让 setup 中的逻辑更清楚易懂 使用 首先我们做一个功能,鼠标点击屏幕,获取坐标: <template> <h2>当前鼠标的坐标是:x:{{ point.x }},y:{{ point.y }}</h2&g

  • React函数组件hook原理及构建hook链表算法详情

    目录 写在前面的小结 Demo fiber hook 链表 hook 对象及其属性介绍 useState Hook 对象 useRef Hook useEffect.useLayoutEffect 以及 useImperativeHandle useMemo useCallback 构建 Hook 链表的源码 renderWithHooks 函数组件执行 构建 hook 链表的算法 mountWorkInProgressHook 构建 hook 链表算法 updateWorkInProgress

  • React函数式组件Hook中的useEffect函数的详细解析

    目录 前言 useEffect的作用 useEffect的使用? 1.class组件 2.函数式组件 总结 前言 React函数式编程没有生命周期,因此需要借助useEffect来实现. useEffect的作用 发ajax请求获取数据 设置订阅/获取定时器 手动更改真实DOM useEffect的使用? 1.class组件 在class组件中可以使用生命周期函数,知道组件触发的过程. 代码如下(示例): import React, { Component } from 'react' expo

随机推荐