广告
返回顶部
首页 > 资讯 > 精选 >ahooks控制时机的hook如何实现
  • 826
分享到

ahooks控制时机的hook如何实现

2023-07-02 17:07:36 826人浏览 安东尼
摘要

本篇内容主要讲解“ahooks控制时机的hook如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ahooks控制时机的hook如何实现”吧!Function Component VS Cl

本篇内容主要讲解“ahooks控制时机的hook如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ahooks控制时机的hook如何实现”吧!

Function Component VS Class Component

学习类似 ReactVue 这种框架,对它们生命周期的掌握都是必须的,我们需要清楚的知道我们代码的执行顺序,并且在不同的阶段执行不同操作的代码,比如需要挂载完成之后才去获取 dom 的值,否则可能会获取不到相应的值。

Class Component

使用过 React 的 Class Component 的同学,就会知道其组件生命周期会分成三个状态:

  • Mounting(挂载):已插入真实 DOM

  • Updating(更新):正在被重新渲染

  • Unmounting(卸载):已移出真实 DOM

简单版如下所示:

ahooks控制时机的hook如何实现

其中每个状态中还会按顺序调用不同的方法,对应的详细如下(这里不展开说):

ahooks控制时机的hook如何实现

可以通过官方提供这个网站查看详情

可以看到,会有非常多的生命周期方法,而且在不同的版本,生命周期方法还不同。

Function Component

到了 Function Component ,会发现没有直接提及生命周期的概念,它是更彻底的状态驱动,它只有一个状态,React 负责将状态渲染到视图中。

对于 Function Component 来说由状态到页面渲染只有三步:

  • 输入状态(prop、state)

  • 执行组件的逻辑,并在 useEffect/useLayoutEffect 中订阅副作用

  • 输出UI(Dom节点)

重点是第二步,React 通过 useEffect/useLayoutEffect 订阅副作用。Class Component 中的生命周期都可以通过 useEffect/useLayoutEffect 来实现。它们两个的功能非常相似,我们这里看下 useEffect。

使用 useEffect 相当于告诉 React 组件需要在渲染后执行某些操作,React 将在执行 DOM 更新之后调用它。React 保证了每次运行 useEffect 的时候,DOM 已经更新完毕。这就实现了 Class Component 中的 Mounting(挂载阶段)。

当状态发生变化的时候,它能够执行对应的逻辑、更行状态并将结果渲染到视图中,这就完成了 Class Component 中的 Updating(更新阶段)。

最后通过在 useEffect 中返回一个函数,它便可以清理副作用。它的规则是:

  • 首次渲染不会进行清理,会在下一次渲染,清除上一次的副作用。

  • 卸载阶段也会执行清除操作。

通过返回一个函数,我们就能实现 Class Component 中的 Unmounting(卸载阶段)。

基于 useEffect/useLayoutEffect,ahooks 做了一些封装,能够让你更加清晰的知道你的代码执行时机。

LifeCycle - 生命周期

useMount

只在组件初始化时执行的 Hook。 useEffect 依赖假如为空,只会在组件初始化的时候执行。

// 省略部分代码const useMount = (fn: () => void) => {  // 省略部分代码  // 单纯就在 useEffect 基础上封装了一层  useEffect(() => {    fn?.();  }, []);};export default useMount;

useUnmount

useUnmount,组件卸载(unmount)时执行的 Hook。

useEffect 可以在组件渲染后实现各种不同的副作用。有些副作用可能需要清除,所以需要返回一个函数,这个函数会在组件卸载的时候执行。

const useUnmount = (fn: () => void) => {  const fnRef = useLatest(fn);  useEffect(    // 在组件卸载(unmount)时执行的 Hook。    // useEffect 的返回值中执行函数    () => () => {      fnRef.current();    },    [],  );};export default useUnmount;

useUnmountedRef

获取当前组件是否已经卸载的 Hook。

通过判断有没有执行 useEffect 中的返回值判断当前组件是否已经卸载。

// 获取当前组件是否已经卸载的 Hook。const useUnmountedRef = () => {  const unmountedRef = useRef(false);  useEffect(() => {    unmountedRef.current = false;    // 如果已经卸载,则会执行 return 中的逻辑    return () => {      unmountedRef.current = true;    };  }, []);  return unmountedRef;};export default useUnmountedRef;

Effect

这里只会讲官方文档 Effect 下面的几个,有部分是定时器、防抖节流等,咱们后面的系列具体分析。

useUpdateEffect 和 useUpdateLayoutEffect

useUpdateEffect 和 useUpdateLayoutEffect 的用法跟 useEffect 和 useLayoutEffect 一样,只是会忽略首次执行,只在依赖更新时执行。

实现思路:初始化一个标识符,刚开始为 false。当首次执行完的时候,置为 true。只有标识符为 true 的时候,才执行回调函数。

// 忽略首次执行export const createUpdateEffect: (hook: effectHookType) => effectHookType =  (hook) => (effect, deps) => {    const isMounted = useRef(false);    // for react-refresh    hook(() => {      return () => {        isMounted.current = false;      };    }, []);    hook(() => {      // 首次执行完时候,设置为 true,从而下次依赖更新的时候可以执行逻辑      if (!isMounted.current) {        isMounted.current = true;      } else {        return effect();      }    }, deps);  };

useDeepCompareEffect和useDeepCompareLayoutEffect

用法与 useEffect 一致,但 deps 通过 lodash isEqual 进行深比较。

通过 useRef 保存上一次的依赖的值,跟当前的依赖对比(使用 lodash 的 isEqual),并将对比结果作为 useEffect 的依赖项,从而决定回调函数是否执行。

const depsEqual = (aDeps: DependencyList, bDeps: DependencyList = []) => {  return isEqual(aDeps, bDeps);};const useDeepCompareEffect = (effect: EffectCallback, deps: DependencyList) => {  // 通过 useRef 保存上一次的依赖的值  const ref = useRef<DependencyList>();  const signalRef = useRef<number>(0);  // 判断最新的依赖和旧的区别  // 如果相等,则变更 signalRef.current,从而触发 useEffect 中的回调  if (!depsEqual(deps, ref.current)) {    ref.current = deps;    signalRef.current += 1;  }  useEffect(effect, [signalRef.current]);};

useUpdate

useUpdate 会返回一个函数,调用该函数会强制组件重新渲染。

返回的函数通过变更 useState 返回的 state,从而促使组件进行更新。

import { useCallback, useState } from 'react';const useUpdate = () => {  const [, setState] = useState({});  // 通过设置一个全新的状态,促使 function 组件更新  return useCallback(() => setState({}), []);};export default useUpdate;

到此,相信大家对“ahooks控制时机的hook如何实现”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: ahooks控制时机的hook如何实现

本文链接: https://www.lsjlt.com/news/343222.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ahooks控制时机的hook如何实现
    本篇内容主要讲解“ahooks控制时机的hook如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ahooks控制时机的hook如何实现”吧!Function Component VS Cl...
    99+
    2023-07-02
  • ahooks控制时机的hook实现方法
    目录引言Function Component VS Class ComponentClass ComponentFunction ComponentLifeCycle - 生命周期u...
    99+
    2022-11-13
  • Java 如何实现时间控制
    目录一、间控制的几种方案1.1 从线程方面解决1.2使用Timer1.3redis延时二、redis2.1maven中引入redis2.2 在springboot中配置redis2....
    99+
    2022-11-12
  • 如何实现Go超时控制
    这篇文章主要介绍如何实现Go超时控制,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!为什么需要超时控制?请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义过长时间的服务端处理会占用过多...
    99+
    2023-06-14
  • Go 协程超时控制的实现
    目录Go 协程超时控制Select 超时控制 go timer 计时器 go context Go 协程超时控制 Select 阻塞方式 Context 方式 先...
    99+
    2022-11-12
  • 如何在Python中实现实时接口和文件的监控和报警机制?
    Python作为一门高级编程语言,广泛应用于数据处理、科学计算、机器学习等领域。在实际项目中,我们经常需要对接口和文件进行实时监控,并及时发出报警通知,以保障系统的稳定性和可靠性。本篇文章将介绍如何在Python中实现实时接口和文件的监控和...
    99+
    2023-08-20
    文件 实时 接口
  • 一文搞懂如何实现Go 超时控制
    为什么需要超时控制? 请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义 过长时间的服务端处理会占用过多资源,导致并发能力下降,甚至...
    99+
    2022-06-07
    GO
  • Go 中实现超时控制的方案
    前言 日常开发中我们大概率会遇到超时控制的场景,比如一个批量耗时任务、网络请求等;一个良好的超时控制可以有效的避免一些问题(比如 goroutine 泄露、资源不释放等)。 Tim...
    99+
    2022-11-12
  • 如何使用JS时间控制实现动态效果
    这篇文章主要介绍了如何使用JS时间控制实现动态效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如下所示:<script> &n...
    99+
    2022-10-19
  • ASP 响应实时 shell,如何实现远程控制服务器?
    在日常的工作中,我们经常需要远程控制服务器。这时候,如何实现远程控制服务器就成了一项非常重要的技能。本文将介绍如何使用 ASP 响应实时 shell 实现远程控制服务器的方法。 ASP(Active Server Pages)是一种用于创...
    99+
    2023-08-12
    响应 实时 shell
  • layui如何实现多iframe页面控制定时器运行
    这篇文章主要为大家展示了“layui如何实现多iframe页面控制定时器运行”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“layui如何实现多iframe页面控...
    99+
    2022-10-19
  • C#如何实现选择控制
    这篇文章主要介绍C#如何实现选择控制,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!关于C#的流程控制,与其它语言基本相同,包括:◆选择控制:if、else、switch、case◆循环控制:while、do、for、...
    99+
    2023-06-17
  • JavaScript如何实现控制视频
    这篇文章将为大家详细讲解有关JavaScript如何实现控制视频,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体代码如下所示:<html lang=&q...
    99+
    2022-10-19
  • Linux如何实现远程控制
    小编给大家分享一下Linux如何实现远程控制,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linux一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你...
    99+
    2023-06-28
  • JavaScript如何控制Session的实现原理
    本篇内容主要讲解“JavaScript如何控制Session的实现原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript如何控制Session的...
    99+
    2022-10-19
  • 如何利用Git的版本控制功能,实现Java项目的实时加载?
    Git是目前最流行的版本控制工具之一,它被广泛应用于开发团队中,以管理和跟踪代码的版本。除此之外,Git还可以帮助开发人员实现Java项目的实时加载。本文将介绍如何利用Git的版本控制功能,实现Java项目的实时加载。 一、Git的版本控制...
    99+
    2023-09-21
    git 实时 load
  • Python实现用手机监控远程控制电脑的方法
    一、前言 很多时候,我们都有远程控制电脑的需求。比如正在下载某样东西,需要让电脑在下载完后关机。或者你需要监控一个程序的运行状况等。 今天我们就来用Python实现一个远程监控并控制电脑的小程序。 二、实现原理 ...
    99+
    2022-06-02
    Python 远程控制电脑 Python 手机远程控制电脑
  • 如何使用手机控制云服务器使用时间
    1. 了解云服务器的使用时间控制 在开始之前,我们需要了解云服务器的使用时间控制。云服务器通常按照使用时间计费,因此控制使用时间可以帮助我们节省成本。一些云服务提供商提供了手机应用程序,可以方便地管理和控制云服务器的使用时间。 2. 下载...
    99+
    2023-10-27
    如何使用 服务器 时间
  • 手机如何控制腾讯云服务器使用时间
    首先,我们需要在手机上下载安装腾讯云服务APP,并注册账号。然后,我们可以在手机的主屏幕上找到“我的”应用,点击进入后,找到“云服务器”选项,然后点击进入。在腾讯云服务APP中,我们可以看到当前云服务器的使用情况,包括使用时间、使用量等信息...
    99+
    2023-10-28
    腾讯 服务器 时间
  • 手机如何控制腾讯云服务器使用时长
    注册和登录 注册和登录腾讯云服务器是使用手机控制腾讯云服务器的第一步。用户可以使用微信、QQ或其他社交软件进行注册,然后在登录时输入账号和密码进行登录。此外,用户还可以使用腾讯云服务器提供的APP SDK或Web SDK进行登录,这种...
    99+
    2023-10-28
    腾讯 时长 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作