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

 更新时间:2022年11月23日 10:20:44   作者:蓝桉cyq  
自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上来说,它本身并不算React的特性,这篇文章主要介绍了React类组件和函数组件对比-Hooks的介绍及初体验,需要的朋友可以参考下

自定义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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入掌握 react的 setState的工作机制

    深入掌握 react的 setState的工作机制

    本篇文章主要介绍了深入掌握 react的 setState的工作机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • react实现阻止父容器滚动

    react实现阻止父容器滚动

    这篇文章主要介绍了react实现阻止父容器滚动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • react中关于Context/Provider/Consumer传参的使用

    react中关于Context/Provider/Consumer传参的使用

    这篇文章主要介绍了react中关于Context/Provider/Consumer传参的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • React实现浮层组件的思路与方法详解

    React实现浮层组件的思路与方法详解

    React 浮层组件(也称为弹出组件或弹窗组件)通常是指在用户界面上浮动显示的组件,本文主要介绍了浮层组件的实现方法,感兴趣的小伙伴可以了解下
    2024-02-02
  • React中使用外部样式的3种方式(小结)

    React中使用外部样式的3种方式(小结)

    这篇文章主要介绍了React中使用外部样式的3种方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • react生命周期(类组件/函数组件)操作代码

    react生命周期(类组件/函数组件)操作代码

    react代码模式分为两种类组件和函数组件(生命周期也有所不同),这篇文章主要介绍了react生命周期(类组件/函数组件),需要的朋友可以参考下
    2023-01-01
  • 基于antd的autocomplete的二次封装查询示例

    基于antd的autocomplete的二次封装查询示例

    这篇文章主要为大家介绍了基于antd的autocomplete的二次封装查询示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • React中引用CSS方式及写法大全(三种方式)

    React中引用CSS方式及写法大全(三种方式)

    在React中引用CSS的方法有多种,可以根据个人的喜好和项目的需求来选择,本文主要介绍了React中引用CSS方式及写法大全,感兴趣的可以了解一下
    2023-10-10
  • JavaScript中React 面向组件编程(下)

    JavaScript中React 面向组件编程(下)

    在React面向组件编程中,除了上一章节的组件实例的三大核心属性以外,还有很多重要的内容比如:React 的生命周期,受控组件与非受控组件,高阶函数和函数柯里化的理解等,在本文中会给大家继续讲解React 面向组件编程中剩余的内容
    2023-03-03
  • react redux及redux持久化示例详解

    react redux及redux持久化示例详解

    这篇文章主要为大家介绍了react redux及redux持久化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论