首页 > 其他分享 >[React] useEffect

[React] useEffect

时间:2023-05-21 20:34:42浏览次数:36  
标签:函数 渲染 DOM React 组件 useEffect id

pure function:单纯返回jsx元素的组件

在使用react函数组件时,理论上函数组件只会进行不改变内部状态值的计算,以及返回html代码。一个pure函数就是如此,例如一个函数组件接受一个id作为传入属性,注意这里传入的id并没有发生变化,我们只是简单进行了输出和数学计算:

// this is a pure function!
export default function person({ id }) {
  return (
    <>
    <p>Nice to meet you! #{id}</p>
	<p>Change your id to #{id*3}</p>
	</>
  )
}

impure function:不仅仅只是返回jsx元素

然而实际运用中,一个组件绝不止单纯返回jsx代码,在最后返回渲染代码之前可能还需要更多操作,例如修改DOM,获取数据,修改表单输入,提交表单甚至是重定向一个新页面。react doc将这些情况归纳为事件处理器(event handler)。因为组件内部的状态值被修改了,因此会发生副作用(side effects),这时候useEffect就发挥作用了。

// this is not a pure function!
export default function person({ id }) {
  let cnt = 0;
  return (
    <>
    <p>Nice to meet you! #{id}</p>
	<p>Change your id to #{id*3}</p>
	<p>Let's change the count number: {cnt++}</p>
	</>
  )
}

useEffect在执行什么:一个函数

useEffect本身就是一个函数,它的第一个参数也是函数,而且这个函数会改变组建的状态,所以我们将这个函数放入useEffect中

useEffect(() => {
  if (welcome) {
    document.querySelector("p").innerHTML = 'welcome, user!';
  }
})

这个函数改变了p标签下的文本,也就是修改了DOM,属于副作用的范围。

注意:使用useEffect的情况应该是组件中被用于渲染的状态发生了改变,而组件中有些状态值是不参与渲染的,这个时候就不需要使用useEffect了。

useEffect的第二个参数:什么时候运行这个函数?

第二个参数就是一个包含了所有依赖项的列表,说明当这个列表中的任意对象的状态发生改变时,useEffect就会激活。

// 依赖不为空:当welcome发生改变时,输出不同的文本
useEffect(() => {
  if (welcome) {
    document.querySelector("p").innerHTML = 'welcome, user!';
  }
  else {
    document.querySelector("p").innerHTML = 'Hola! como easta?';
  }
}, [welcome])

依赖可以为空或没有

// 依赖为空:只在组件第一次渲染时运行,重新渲染就不会再跑一次了
useEffect(() => {
  conn = getConnection()
  setMessages(conn.getMessages(id))
}, [])
// 没有依赖:无上限地渲染,不建议因为不停重复渲染会导致性能下降,很多时候也没必要
useEffect(() => {
  conn = getConnection()
  setMessages(conn.getMessages(id))
})

useEffect运行的时机:在网页更新之后

根据react docs,useEffect会在建立网页的最后一步commit中触发,准确来说是在DOM被渲染/更新之后,然后由useEffect中的函数来更新部分有变化的DOM。

但是在某些情况下,有些状态值不会导致DOM变化,且函数也没有直接修改DOM的代码,因此即便使用useEffect也没用,数据不会被更新甚至渲染,这时候就要使用useMemo在渲染/更新之前来控制这些状态。

总结

  • 大部分组件会有修改DOM和jsx元素的代码,因此不是pure function
  • useEffect是针对那些有副作用的组件,并通过依赖来控制触发的条件
  • useEffect运行的时候网页已经渲染完毕了,要注意其在react渲染全过程中的时间点

标签:函数,渲染,DOM,React,组件,useEffect,id
From: https://www.cnblogs.com/Akira300000/p/17346898.html

相关文章

  • 苹果爸爸发飙,封杀 React Native?
    今天早上一上班,就收到了苹果发来的一封警告邮件,一看内容,就知道这是个大事啊,还赶紧发了个微博,然后,今天一整天,iOS界都被这个消息炸裂了!这封警告邮件大概意思就是说,苹果将不再允许使用动态下发代码的机制,如果App内部使用了动态下发代码的框架,将有被拒的风险。所谓的动态下发代码,就......
  • React闭包陷阱
    React闭包陷阱ReactHooks是React16.8引入的一个新特性,其出现让React的函数组件也能够拥有状态和生命周期方法,其优势在于可以让我们在不编写类组件的情况下,更细粒度地复用状态逻辑和副作用代码,但是同时也带来了额外的心智负担,闭包陷阱就是其中之一。闭包从React闭包陷阱的名字......
  • react面试题汇总1
    请介绍一下React的生命周期函数及其调用顺序。答:React的生命周期函数分为三个阶段:挂载、更新和卸载。以下是各个生命周期函数的名称及调用顺序:挂载阶段constructor():组件构造函数,在最开始时调用。staticgetDerivedStateFromProps():从props中派生出state,返回新的state值,会在render......
  • React 源码调试 (react版本17.0.2)
    环境准备//create-react-a匹配版本$create-react-app-V5.0.1//node版本$node-Vv16.16.0  1、第一步通过create-react-app快速创建环境,然后运行yarneject释放webpack配置  npxcreate-react-appreact-debugyarneject 2、第二步降级reac......
  • 实现 React 简易版 createElement 和 render 方法
    前言在React中,我们都知道可以写jsx代码会被编译成真正的DOM插入到要显示的页面上。这具体是怎么实现的,今天我们就自己动手做一下。实现createElement方法这个方法平时开发我们并不会用到,因为它是经babel编译后的代码,我们新建一个React项目,index.js最简单的代码结构如......
  • 1. react项目【前端】+C#【后端】从0到1
    1、创建前端基础框架 1.1前端创建软件: 1.1.1npxcreate-react-apppcps:pc是文件名; 1.1.2npmstart启动项目 2、创建后端基础框架软件: 2.1创建webapi项目  Program.cs是启动文件;  ......
  • 社招前端二面必会react面试题及答案
    高阶组件的应用场景权限控制利用高阶组件的条件渲染特性可以对页面进行权限控制,权限控制一般分为两个维度:页面级别和页面元素级别//HOC.jsfunctionwithAdminAuth(WrappedComponent){returnclassextendsReact.Component{state={......
  • 面试官:React怎么做性能优化
    前言最近一直在学习关于React方面的知识,并有幸正好得到一个机会将其用在了实际的项目中。所以我打算以博客的形式,将我在学习和开发(React)过程中遇到的问题记录下来。这两天遇到了关于组件不必要的重复渲染问题,看了很多遍官方文档以及网上各位大大们的介绍,下面我会通过一些demo结......
  • 面试官让你说说react状态管理?
    开发者普遍认为状态是组件的一部分,但是同时却又在剥离状态上不停的造轮子,这不是很矛盾么?对于一个最简单的文本组件而言functionText(){const[text,setText]=useState('载入')return(){<p>{text}</p>}}你觉得应该把text从Text组件中剥离么?如果......
  • 高级前端常考react面试题指南
    pureComponent和FunctionComponent区别PureComponent和Component完全相同,但是在shouldComponentUpdate实现中,PureComponent使用了props和state的浅比较。主要作用是用来提高某些特定场景的性能为什么虚拟DOM会提高性能虚拟DOM相当于在js和真实DOM中间加了一个缓存,利用DOM......