首页 > 其他分享 >#yyds干货盘点#react之useEffect

#yyds干货盘点#react之useEffect

时间:2023-11-12 14:37:05浏览次数:36  
标签:count yyds React 函数 react deps 副作用 useEffect

React的Hooks API为我们提供了一种新的处理副作用的方式 ——useEffectuseEffect函数接受两个参数:一个是_副作用函数_和一个_依赖数组_。副作用函数是在组件render之后运行,而依赖数组告诉React何时应该执行或跳过该副作用。如果没有提供依赖数组,`useEffect`将在每次渲染后运行。如果提供了空的依赖数组,副作用将只在第一次渲染后及在卸载时运行。

jsx
useEffect(() => {
   console.log('component did mount');
   return () => {
     console.log('component will unmount');
   }
}, []);

实现原理

useEffect是如何完成这些工作的呢?核心在于React如何决定何时调用副作用函数。这涉及到React对组件生命周期的管理。React使用一个队列存储所有的state和side-effect,以保证他们的正确执行顺序。在每一个render周期,React都会迭代这个队列,并比较当前的依赖数组和上一次的依赖数组。如果有任何更改,React就会运行新的副作用函数。在运行新副作用函数前,React会首先调用先前副作用的cleanup函数。

假设我们有一个计数器应用。每当计数器的数值改变时,我们希望能够显示更新的数值。

function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `Count: ${count}`;
  }, [count]);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  );
}

在这个例子中,useEffect接收了一个副作用函数,该函数会更新文档的title为当前的计数器的数值。另一个参数[count]是一个依赖数组,告诉React仅当count变化时才应运行该效应。为实现这个功能,React内部维护了队列来跟踪stateside-effect。首次渲染(或count更新时),React会调用副作用函数,创建新的副作用并将其添加到队列中。由于这个副作用依赖于count,React还会将当前的count值与副作用一同存储。在下一次渲染时,如果count的值已经发生变化,React会比较新旧count值。由于这两者不同,React首先会清理旧的副作用,然后再调用新的副作用函数。这样就确保了每次count值改变时,useEffect都能正确地工作。这个例子应该能帮助您理解useEffect工作原理的主要部分:如何跟踪副作用,如何比较新旧依赖值,如何根据依赖值的变化决定是否执行副作用函数,以及如何清理旧的副作用。

手写简易版useEffect

那么如果要自己实现一个简易版的`useEffect`,应该怎么做呢?这需要保持`deps`的跟踪,再根据`deps`是否改变来决定是否调用`effect`。我们可以采用以下方式实现:

let _deps; // 全局存储依赖

function useEffect(callback, deps) {
  const hasNoDeps = !deps;
  const depsChanged = _deps ? 
      !deps.every((el, i) => el === _deps[i]) 
      : true;

  if (hasNoDeps || depsChanged) {
    callback();
    _deps = deps;
  }
}

这样,我们就实现了一个简易版的`useEffect`。这个版本的`useEffect`仅适用于理解`useEffect`的基本工作原理,它并没有实现如何处理cleanup函数,以及如何管理多个`useEffect`等更复杂的情况。


标签:count,yyds,React,函数,react,deps,副作用,useEffect
From: https://blog.51cto.com/u_11365839/8328547

相关文章

  • # yyds干货盘点 # 对5亿行数据去重,各位有没有啥方法。。。内存直接爆了
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【巭孬......
  • ReactNative进阶(十):WebView 应用详解
    (文章目录)一、WebView组件介绍使用WebView组件可通过url来加载显示一个网页,也可以传入一段html代码来显示。下面对其主要属性和方法进行介绍。1.主要属性source:在WebView中载入一段静态的html代码或是一个url(还可以附带一些header选项);automaticallyAdjustCon......
  • #yyds干货盘点#react的useState源码分析
    简单说下为什么React选择函数式组件,主要是class组件比较冗余、生命周期函数写法不友好,骚写法多,functional组件更符合React编程思想等等等。更具体的可以拜读dan大神的blog。其中Functioncomponentscapturetherenderedvalues这句十分精辟的道出函数式组件的优势。但是在16.8之......
  • useEffect依赖项使用
    用于在react组件中创建不是由事件引起的而是由渲染本身引起的,比如发送Ajax请求、更改dom等等 import{useEffect,useState}from'react';functionApp(){const[count,setcount]=useState(0)const[msg,setmsg]=useState('你好')//1.没有依赖项,在组件渲染......
  • react组件间通信
    1.父组件向子组件通信import{useState}from'react';functionButton(props){return(<div>{props.name}</div>)}functionApp(){constmsg=useState('神雕侠侣')return(<divclassName="App">&l......
  • 打工笔记-------------------------.NET Reactor使用方法
    .NETReactor是一个用于保护.NET应用程序的代码混淆器和加密器。它可以防止应用程序被反编译和篡改使用步骤下载和安装.NETReactor:从DongleSoftware的官方网站下载.NETReactor5.9.8.0的安装程序,并按照提示进行安装。创建或导入项目:在.NETReactor中,创建一个新的......
  • 界面控件DevExtreme图表和仪表(v23.1) - 新功能(Angular,React,Vue,jQuery)
    本文将为大家总结下DevExtreme在v23.1版本中发布的一些与图表和仪表盘相关的功能。DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序。获取DevExtremev23.1正式版下载Dev......
  • #yyds干货盘点# LeetCode程序员面试金典:累加数
    题目累加数是一个字符串,组成它的数字可以形成累加序列。一个有效的累加序列必须至少包含3个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。给你一个只包含数字'0'-'9'的字符串,编写一个算法来判断给定输入是否是累加数。如果是,返回true......
  • #yyds干货盘点# LeetCode程序员面试金典:供暖器
    题目冬季已经来临。你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。在加热器的加热半径范围内的每个房屋都可以获得供暖。现在,给出位于一条水平线上的房屋houses和供暖器heaters的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。注意:所有供暖器heaters......
  • # yyds干货盘点 # Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公处理的问题,一起来看看吧。上一篇文章中,我们已经看到了四种解决办法了,这一篇文章我们一起来看看另外一种方法。二、实现过程这里【论草莓如何成为冻干莓】给了unstack()操作的方法,代码如下......