爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      React-Hooks这一篇就够了

      首页 知识中心 其他 文章详情页

      React-Hooks这一篇就够了

      2025-02-26 07:23:02 阅读次数:13

      hook,React,使用,函数,渲染,组件

      1、简介

      React中组件由函数组件与类组件,在 React Hooks 出现之前,我们可以使用函数和类组件来进行项目开发,但是如果组件中需要进行状态管理,函数组件就显得无能为力。React在v16.8 的版本中推出了 React Hooks 新特性,Hook是一套工具函数的集合,它增强了函数组件的功能,hook不等于函数组件,所有的hook函数都是以use开头。【以use开头的特殊的函数集合,就称之为Hooks】

      Hook的定义:是react函数组件中使用的一些以“use”开头的特殊函数。

      使用 React Hooks 相比于从前的类组件有以下几点好处:

      • 代码可读性更强,原本同一块功能的代码逻辑被拆分在了不同的生命周期函数中,容易使开发者不利于维护和迭代,通过 React Hooks 可以将功能代码聚合,方便阅读维护

      • 组件树层级变浅,代码的跳跃性会变小,在原本的代码中,我们经常使用 HOC/render/Props 等方式来复用组件的状态,增强功能等,无疑增加了组件树层数及渲染,而在 React Hooks 中,这些功能都可以通过强大的自定义的 Hooks 来实现

      • hook使用比使用类组件简单许多(仁者见仁智者见智,但是Redux使用时 ,绝对是函数组件简单)

       

      2、hook的使用限制

      • hook只能用在函数组件中(被导出的函数里面),class组件不行

      • 普通(非组件导出函数,且不以use开头的函数)函数不能使用hook(hook不能在组件函数外去使用)

      • hook不能被有条件的调用,因此不能放在if/for中(如果真有有条件调用的需求,请把条件写在hook函数内)

       

      3、常用的hook函数

      官网文档:Hooks API Reference – React

      hook的使用步骤:

      • 自定义hook(自己用自己写的)

      • 导入hook成员

      • 使用hook成员

      3.1、useState

      作用:保存组件的状态(用于解决函数组件无状态问题)

      语法:

      const [state, setstate] = useState(initialState);

      案例:

      /**
       * hook:useState
       * 作用:实现函数组件中的所谓的“状态”
       * 提供方:react
       * 语法:const [访问变量名,设置数据方法名] = useState(初始默认值)
       * 参数含义:
       *      访问变量名:可以通过该变量名获取state的值
       *      设置数据方法名:该方法可以用于修改state的值,其只接受一个参数,参数要么是直接表示其值,要么以函数返回形式表示其值。如果前面的变量名叫a,那么此处的函数名一般叫做setA
       *      初始默认值:给state的初始值,支持字面量,也支持数组和对象等复杂数据类型
       * 注意点:
       *      a. 在修改字面量时,直接将最终的字面量的值给到修改函数即可
       *      b. 在修改对象或数组的时候,如果只是修改其中的一部分数据,记得最后返回的数据需要携带没有被修改的数据,如果不携带则丢失
       */
      ​
      import React, { useState } from 'react';
      ​
      const Index = () => {
      ​
          // 基础的字面量
          const [count, setCount] = useState(0)
          // 对象类型
          const [user, setUser] = useState({ uname: "张三", age: 22 })
      ​
          // 修改用户的信息的事件处理程序
          const modUser = () => {
              setUser({ ...user, age: 33 })
          }
          return (
              <div>
                  <div>计数器的值是:{count}</div>
                  <div><button onClick={() => setCount(count + 1)}>+1</button></div>
                  <hr />
                  <div>
                      <div>用户信息是:</div>
                      <div>
                          用户名是:{user.uname}
                      </div>
                      <div>
                          年龄是:{user.age}
                      </div>
                      <button onClick={() => modUser()}>修改用户年龄为33</button>
                  </div>
              </div>
          );
      }
      ​
      export default Index;
      ​

       

      3.2、useEffect

      作用:模拟类组件中的生命周期的

      函数组件对于在一些生命周期中操作还是无能为力,所以 React提供了 useEffect 来帮助开发者处理函数组件,来帮助模拟完成一部份的开发中非常常用的生命周期方法(并不是全部的生命周期)。常被称为:副作用处理函数。此函数的操作是异步的。

      useEffect 相当类组件中的3个生命周期 (但含义上不完全等同)

      • componentDidMount

      • componentDidUpdate

      • componetWillUnMount

      语法:

       useEffect(() => {
           effect... 副作用的操作,(类似于组件挂载完毕后、更新完毕后的操作)
           return () => {
               cleanup... 清理副作用
               (类似于组件的解除挂载的周期,可选)
           }
       },[INPUT,....])

      案例:

      /**
       * hook:useEffect
       * 作用:用于操作作用及副作用代码的(用于控制函数组件生命周期的)
       * 语法:
       *      useEffect(callback[,array])
       * 提供方:react
       * 细致语法:
       *      a. 在首次渲染及后续每次更新之后会执行callback的代码(模拟首次componentDidMount及componentDidUpdate)
       *          useEffect(没有返回值的callback)
       *      b. 被返回的函数是用于清理副作用的,会在执行下一次副作用前执行
       *          useEffect(带有返回值的cakkbacl)     // 返回值必须是一个函数
       *      c. 有第二个参数,并且第二参数为空数组(仅仅会让副作用代码在首次挂载完毕后执行一次)
       *          useEffect(callback,[])
       *      d. 有第二个参数,且第二个参数中有具体的元素,元素个数不限,元素为useState的访问变量名。关注指定元素的更新,当被指定的元素更新后,将会再去执行副作用代码,及清理副作用的代码(如有)。
       *          useEffect(callback,[el1,el2,....])
       * 
       * 清理副作用很有意义:
       * 假设给页面绑定了点击事件,如果不清理事件,可能会导致事件越绑越多
       */
      import React, { useEffect, useState } from 'react';
      ​
      const Index = () => {
          const [state, setState] = useState(0)
          const [state1, setState1] = useState(100)
          const [pos,setPos] = useState({x:0,y:0})
      ​
          const handler = (e) => {
              console.log('点了页面');
              // console.log(e);
              setPos({x: e.clientX,y: e.clientY})
          }
      ​
          //  * 清理副作用很有意义:
          //  * 假设给页面绑定了点击事件,如果不清理事件,可能会导致事件越绑越多
          useEffect(() => {
              document.addEventListener("click",handler)//1
              return () => {
                  document.removeEventListener("click",handler)//2
              }
          })
      ​
          // 情况1:没有返回值的callback
          // useEffect(() => {
          //     console.log('1');
          // })
      ​
          // 情况2:带有函数返回值的callback
          // useEffect(() => {
          //     console.log(1);     // 副作用代码
          //     return () => {
          //         console.log(2); // 清理副作用
          //     }
          // })
      ​
          // 情况3:第二参数为空数组
          // useEffect(() => {
          //     console.log(1);     // 副作用代码
          //     // return () => {   // 如果第二参数给了空数组,则return的函数将无意义
          //     //     console.log(2); // 清理副作用
          //     // }
          // }, [])
      ​
          // 情况4:第二参数有元素
          // useEffect(() => {
          //     console.log(1);     // 副作用代码
          //     return () => {
          //         console.log(2); // 清理副作用
          //     }
          // }, [state])
      ​
      ​
          return (
              <div>
                  <div>当前state是:{state}</div>
                  <div><button onClick={() => setState(state + 1)}>+1</button></div>
                  <hr />
                  <div>当前state1是:{state1}</div>
                  <div><button onClick={() => setState1(state1 + 1)}>+1</button></div>
              </div>
          );
      }
      ​
      export default Index;

       

      3.3、useRef

      作用:用来生成对 DOM 对象的引用(类似于类组件中的createRef方法)

      案例:

      • 父组件Index.jsx

      /**
       * useRef的注意点:
       * 1. 使用肯定得导入useRef
       * 2. 通过执行该useRef函数获取ref对象
       * 3. 将ref对象挂载到需要获取对象的标签上面,例如:ref={ref}
       * 4. 后续我们可以通过ref对象获取对应的标签的对象
       * 5. 特别需要注意:默认情况下,普通的html标签是可以直接使用ref对象的(获取到的是dom对象),而组件标签默认不能使用ref对象!
       * 6. 如果需要解决函数组件标签使用ref的问题,需要借助React.forwardRef()【让子具备转发ref的能力,子去给父ref】,该方法不是hook函数,而是hoc强化函数;还需要借助一个hook函数:useImperativeHandle来告诉父可以从子这里获取哪些数据或者方法(向外暴露成员)。
       * 7. useImperativeHandle函数的语法:useImperativeHandle(ref对象,callback),callback必须返回一个对象,对象即为向外暴露的成员。其中ref对象为函数组件函数的第二形参
      ​
      • 子组件Child.jsx

      import React, { useState, forwardRef, useImperativeHandle } from "react"
      ​
      const Child = (props, ref) => {
          const [state, setState] = useState(66666)
      ​
          const showMsg = () => {
              console.log(state)
          }
          // 向外暴露成员方法、变量
          useImperativeHandle(ref, () => ({ showMsg }))
      ​
          return (
              <div>
                  <div>这是子组件</div>
              </div>
          )
      }
      ​
      // 通过forwardRef强化当前的函数组件,使其具备转发ref的能力
      export default forwardRef(Child)
      ​

      面试题:

      • useRef能否用createRef替换?【可以】

      • useRef与之前学习的createRef有何区别?【useRef在多次渲染页面的时候始终是同一个ref对象的引用;而createRef在每次更新后都会产生新的ref引用】

       

      3.4、useContext

      • 与类组件相比,实现同等效果,函数组件比较简单

      作用:createContext实现数据的共享,只是消费数据的方式不一样

      案例:

      • context对象产生的文件createContext.js

      import { createContext } from "react"
      // createContext函数是可以传递参数的。
      // 参数的意义可以理解成是待消费的数据的默认值
      // 默认值一般在项目做单元(组件)测试(unit test)的时候可能会被用上
      export default createContext({ a: 11, b: 22, c: 33 })
      • 售卖方组件

      /**
       * 1. 售卖方提供需要需要借助context对象的Provider组件
       * 2. 通过售卖方Provider组件的value属性将需要共享的数据传递给子组件
       * 3. 消费方通过useContext函数进行消费,语法:const data = useContext(context对象)
       */
      ​
      import React from "react"
      import Consumer from "./Consumer"
      import Obj from "./createContext"
      ​
      // 获取售卖方的身份
      const { Provider } = Obj
      const ProviderCmp = () => {
          const data = { a: 1111, b: 2222, c: 3333 }
          return (
              <div>
                  <Provider value={data}>
                      <Consumer />
                  </Provider>
              </div>
          )
      }
      ​
      export default ProviderCmp
      ​
      • 消费方的组件

      import React, { useContext } from "react"
      import Obj from "./createContext"
      const Consumer = () => {
          // 通过useContext消费数据
          const data = useContext(Obj)
          return (
              <div>
                  <div>a的值是:{data.a}</div>
                  <div>b的值是:{data.b}</div>
                  <div>c的值是:{data.c}</div>
              </div>
          )
      }
      ​
      export default Consumer
      ​

      3.5、useReducer

      在组件内添加一个reducer方法,管理组件的状态

      import React, { useState, useReducer } from 'react'
      export default function More() {
        const [count, setCount] = useState(1)
        const initialState = {
          count: 100
        }
        const reducer = (state, action) => {
          switch (action.type) {
            case 'add':
              return { count: state.count + action.payload }
            default:
              return state
          }
        }
        // state对应initailState dipatch派发方法  reducer定义纯函数修改state
        const [state, dispatch] = useReducer(reducer, initialState)
        return (
          <div>
            More
            <div>
              <button onClick={() => setCount(count + 1)}>{count}</button>
            </div>
            <div>
              <button onClick={() => dispatch({ type: 'add', payload: 100 })}>
                {state.count}
              </button>
            </div>
          </div>
        )
      }

      3.6、useMemo

      React.memo 为高阶组件。如果你的组件在相同 props 的情况下渲染相同的结果,那么你可以通过将其包装在 React.memo 中调用,以此通过记忆组件渲染结果的方式来提高组件的性能表现。这意味着在这种情况下,React 将跳过渲染组件的操作并直接复用最近一次渲染的结果。

      如果组件在props相同的情况下,渲染结果相同,那么就可以使用memo来进行优化

      import React, { useState, memo } from 'react'
      /***
       * memo react中提供的高阶组件
       * 高阶组件  参数为组件 返回一个新组件
       */
      export default function App() {
        const [num, setNum] = useState(100)
        return (
          <div>
            App
            <div>
              <button onClick={() => setNum(num + 1)}>{num}</button>
            </div>
            {/* <Child></Child> */}
            {/* 注意如果通过memo缓存的组件 它的状态[state,props]发生改变 也会重新渲染 */}
            <Child data={num}></Child>
          </div>
        )
      }
      ​
      // 父组件更新导致子组件也进行渲染  实际子组件没有发生变化  造成渲染的性能浪费
      // memo(函数组件,回到函数[返回值bool])
      const Child = memo(
        (props) => {
          console.log('子组件被渲染了')
          return <div>Child</div>
        },
        (prevProps, nextProps) => {
          // true不渲染
          // false渲染
          // console.log(nextProps);
          if (nextProps.data % 2 === 0) {
            return false
          } else {
            return true
          }
        }
      )
      // 使用memo缓存组件
      // Child = memo(Child)
      ​

      useMemo 是 React 中的一个钩子,它可以帮助你避免在不必要的情况下重新渲染组件。它通过对比当前状态和前一个状态,决定是否重新计算或记忆一个值。 接收两个参数,第一个参数是个函数,第二个是依赖项。返回一个memoized值,只有当它的某个依赖项改变时才重新计算 memoized 值,初始化的时候也会调用一次,这种优化有助于避免在每次渲染时都进行高开销的计算

      import React, { useState } from 'react'
      import { useMemo } from 'react'
      export default function App() {
        const [num, setNum] = useState(10)
        const [count, setCount] = useState(10)
        const doubleNum = useMemo(()=>{
          console.log('计算num的双倍');
          return num*2
        },[num])
        return (
          <div>App
            <button onClick={()=>setNum(num+1)}>{num}</button>
            <div>double:{doubleNum}</div>
            <div>
              <button onClick={()=>setCount(count-1)}>{count}</button>
            </div>
          </div>
        )
      }

      3.7、useCallback

      React 的 useCallback 是一个 Hook,用于优化性能,在组件的更新过程中避免不必要的函数重新定义。 在 React 中,当组件重新渲染时,它会重新执行所有的函数,因此在频繁更新的组件中使用多个函数会导致不必要的性能开销。useCallback 可以解决这个问题,它接受两个参数:一个回调函数和一个依赖项列表。当依赖项列表中的任意一项改变时,useCallback 会重新定义回调函数,否则它会返回一个缓存的函数引用,从而避免不必要的函数重新定义。 使用 useCallback 可以显著提高组件的性能,特别是在处理高频率的更新或大量的交互操作时。但是,请注意,如果使用不当,它也可能导致代码变得难以理解和维护。因此,在使用 useCallback 时,需要谨慎考虑其影响,并确保代码可读性和可维护性

      import React, { useState, useCallback } from 'react'
      ​
      export default function App() {
        const [num, setNum] = useState(10)
        const [count, setCount] = useState(100)
        // 每次组件渲染时,add方法会被重新定义  造成不必要的开销
        // const add = () => {
        // }
        // 使用useCallback缓存函数 函数的引用
        const add = useCallback(() => {
          setCount(count + 1)
        }, [count])
        return (
          <div>
            <div>
              <button onClick={() => setNum(num + 1)}>{num}</button>
            </div>
            <div>
              <button onClick={add}>{count}</button>
            </div>
          </div>
        )
      }

       

      3.8、redux相关

      • 与类组件相比,函数组件的redux使用非常简单(只是简化了组件中的使用包括获取数据与action的派发)

      import { useDispatch, useSelector } from "react-redux";

      注意点:官方自带的useReducerhook也可以实现针对reudx的操作,但是企业一般不直接用它。而是使用react-redux中提供的封装过的hook(useSelector,useDispatch)。如果企业项目有自己封装redux相关的hook的时候才会使用useReducer。其实react-redux提供的自定义的hook底层也是基于useReducer实现的。

      作用:

      • useSelector:帮助我们获取仓库中的数据,参数是callback,函数有一形参state(默认数据源)

      • useDispatch:帮助我们派发用于修改的action

      案例:通过useSelector,useDispatch实现对于redux中数据的读写(计数器案例)

      /**
       * 1. 关于redux的hooks分为两派:官方的useReducer、react-redux提供的useSelector/useDispatch。【建议用后者】
       * 2. useSelector作用:获取仓库中的数据,语法:const state = useSelector(callback),函数接收形参,形参为仓库中的全部的数据,函数返回的为处理好的数据
       * 3. useDispatch作用:返回一个dispatch方法
       */
      ​
      import React from "react"
      import { useSelector, useDispatch } from "react-redux"
      const Index = () => {
          // 获取数据
          const state = useSelector(state => state)
          // 产生dispatch方法
          const dispatch = useDispatch()
          // 事件处理程序
          const add = () => {
              // 派发action
              dispatch({ type: "add", payload: 1 })
          }
          return (
              <div>
                  <div>计数器的值:{state.count}</div>
                  <button onClick={add}>+1</button>
              </div>
          )
      }
      ​
      export default Index
      ​

       

      3.9、react-route-dom相关

      版本:v5.3

      import { useHistory, useParams, useLocation } from "react-router-dom";

      作用:快速获取路由信息的

      • useHistory:获取history路由信息对象

      • useParams:获取路由中动态路由参数对象

      • useLocation:获取路由中的location对象信息

      案例:

      /**
       * hook:路由包提供
       *      useLocation/useHistory/useParams
       * 作用:操作路由信息
       */
      ​
      import React from 'react';
      import { useHistory, useLocation, useParams } from "react-router-dom"
      ​
      const Index = () => {
          // 等同于类中: const his = this.props.history
          const his = useHistory()
          // 等同于类中: const loc = this.props.location
          const loc = useLocation()
          // 等同于类中: const par = this.props.macth.params
          const par = useParams()
          console.log(his, loc, par);
          return (
              <div>
                  <button onClick={() => his.push("/news")}>去往“/news”</button>
              </div>
          );
      }
      ​
      // 此处不需要withRouter
      export default Index;
      ​

      注意点:用了这个三个hook,组件在导出的时候就不用再withRouter。

      3.10、ahooks

      一套高质量可靠的 React Hooks 库

      安装

      npm install --save ahooks

      根据文档示例,调用对应hook实现其功能

      import React, { useRef } from 'react'
      import { useFullscreen } from 'ahooks'
      ​
      export default () => {
        const ref = useRef(null)
        // isFullscreen检测当前是否为全屏状态
        // enterFullscreen进入全屏
        const [isFullscreen, { enterFullscreen, exitFullscreen, toggleFullscreen }] =
          useFullscreen(ref)
        console.log(isFullscreen)
      ​
        return (
          <div ref={ref} style={{ background: 'white' }}>
            <button onClick={enterFullscreen}>全屏</button>
            <button onClick={exitFullscreen}>退出全屏</button>
            <button onClick={toggleFullscreen}>切换屏幕</button>
          </div>
        )
      }
      ​
      import React from 'react'
      import { useNetwork } from 'ahooks'
      export default function App() {
        const networkInfo = useNetwork()
        console.log(networkInfo)
        const { online } = networkInfo
        return (
          <div>
            App
            {online ? (
              <div style={{ color: 'green', fontSize: 30 }}>●</div>
            ) : (
              <div style={{ color: 'red', fontSize: 30 }}>●</div>
            )}
          </div>
        )
      }

       

      3.11、自定义hook

      案例:自定义在线状态hook,要求使用了这个hook可以

      自动判断当前网络连接的情况

      应用场景:可以用这个hook动态判断当前用户的网络连接状态

      React-Hooks这一篇就够了

      实现代码:

      /**
       * 自定义hook = 自定义函数
       * 1. 名称必须以use开头
       * 2. 细节:
       *      a. 得有返回值,返回当前用户的网络状态
       *      b. 是否在线的状态通过navigator.onLine进行判断
       *      c. 由于需要持续获取用户的状态,得用到事件监听,监听事件是什么?
       *              - online
       *              - offline
       *      d. 刚进入到这个函数的时候需要初始化一个变量去存储当前的网络状态
       *
       */
      ​
      import { useState, useEffect } from "react"
      ​
      function useOnline() {
          // 立马获取当前的状态
          const [online, setOnline] = useState(navigator.onLine)
          // .....
          const on = () => setOnline(true)
          const off = () => setOnline(false)
          useEffect(() => {
              // 执行副作用
              window.addEventListener("online", on)
              window.addEventListener("offline", off)
              return () => {
                  // 清理副作用
                  window.removeEventListener("online", on)
                  window.removeEventListener("offline", off)
              }
          })
          // 返回
          return online
      }
      ​
      export default useOnline
      ​
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://qingshan09.blog.csdn.net/article/details/137715953,作者:前端青山,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:【网络】新华三H3C交换机 抓包|H3C交换机文档

      下一篇:【linux】显示文件夹大小|包含隐藏的文件|文件排序

      相关文章

      2025-05-19 09:04:44

      js小题2:构造函数介绍与普通函数对比

      js小题2:构造函数介绍与普通函数对比

      2025-05-19 09:04:44
      new , 关键字 , 函数 , 对象 , 构造函数
      2025-05-19 09:04:30

      【Canvas技法】辐射式多道光影的实现

      【Canvas技法】辐射式多道光影的实现

      2025-05-19 09:04:30
      代码 , 函数 , 实现
      2025-05-19 09:04:22

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      2025-05-19 09:04:22
      使用 , 函数 , 初始化 , 定义 , 对象
      2025-05-19 09:04:14

      C语言字符函数和字符串函数--(超全超详细)

      C语言字符函数和字符串函数--(超全超详细)

      2025-05-19 09:04:14
      函数 , 字符 , 字符串
      2025-05-16 09:15:24

      如何将一串数字用函数的方法倒过来(C语言)

      如何将一串数字用函数的方法倒过来(C语言)

      2025-05-16 09:15:24
      函数 , 数字 , 数组
      2025-05-14 10:33:31

      【数据结构】第一章——绪论(2)

      【数据结构】第一章——绪论(2)

      2025-05-14 10:33:31
      函数 , 实现 , 打印 , 理解 , 算法 , 输入 , 输出
      2025-05-14 10:33:31

      计算机小白的成长历程——习题演练(函数篇)

      计算机小白的成长历程——习题演练(函数篇)

      2025-05-14 10:33:31
      函数 , 字符串 , 数组 , 知识点 , 编写 , 迭代 , 递归
      2025-05-14 10:33:25

      30天拿下Rust之高级类型

      Rust作为一门系统编程语言,以其独特的内存管理方式和强大的类型系统著称。其中,高级类型的应用,为Rust的开发者提供了丰富的编程工具和手段,使得开发者可以更加灵活和高效地进行编程。

      2025-05-14 10:33:25
      Rust , type , 代码 , 函数 , 类型 , 返回
      2025-05-14 10:33:25

      30天拿下Rust之网络编程

      在现代软件开发中,网络编程无处不在。无论是构建高性能的服务器、实时通信应用,还是实现复杂的分布式系统,对网络编程技术的掌握都至关重要。Rust语言以其卓越的安全性、高性能和优秀的并发模型,为网络编程提供了坚实的基础。

      2025-05-14 10:33:25
      Rust , TCP , 使用 , 客户端 , 异步 , 编程
      2025-05-14 10:33:16

      30天拿下Rust之字符串

      在Rust中,字符串是一种非常重要的数据类型,用于处理文本数据。Rust的字符串是以UTF-8编码的字节序列,主要有两种类型:&str和String。其中,&str是一个对字符数据的不可变引用,更像是对现有字符串数据的“视图”,而String则是一个独立、可变更的字符串实体。

      2025-05-14 10:33:16
      amp , Rust , str , String , 使用 , 字符串 , 方法
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5245081

      查看更多

      最新文章

      js小题2:构造函数介绍与普通函数对比

      2025-05-19 09:04:44

      30天拿下Rust之HashMap

      2025-05-14 10:03:05

      30天拿下Rust之函数详解

      2025-05-14 10:02:58

      java检测当前CPU负载状态

      2025-05-13 09:53:23

      DS高阶:LRU Cache

      2025-05-12 10:19:12

      一文快速掌握 YAML 文件

      2025-05-12 08:40:18

      查看更多

      热门文章

      Neon Intrinsics各函数介绍

      2023-04-10 08:53:07

      自定义函数基础(内有实操)

      2023-03-15 09:28:04

      python学习——函数的参数

      2023-04-04 08:09:07

      【DockerImage】修复Docker镜像的组件安全漏洞(原创)

      2024-07-01 01:32:37

      React工作17:ant design form格式化日期

      2023-05-12 06:47:28

      React-Redux-实现原理

      2023-04-23 09:44:14

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 节点 容器 示例
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      React DOM 和 Virtual DOM 的区别?优缺点?

      Vue中mixins(混入)的介绍和使用

      Jenkins笔记:凭证

      高频方法及参数总结

      构建高效可复用的 Vue.js 渲染无关组件

      javascript-函数

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号