位置: IT常识 - 正文

React Hook - useEffecfa函数的使用细节详解

编辑:rootadmin
React Hook - useEffecfa函数的使用细节详解 文章目录useEffect的详细解析useEffecf基本使用清除副作用(Effect)使用多个useEffectuseEffect性能优化useEffect的详细解析useEffecf基本使用

推荐整理分享React Hook - useEffecfa函数的使用细节详解,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

书接上文, 上一篇文章我们讲解了State Hook, 我们已经可以通过这个hook在函数式组件中定义state

我们知道在类组件中是可以有生命周期函数的, 那么如何在函数组件中定义类似于生命周期这些函数呢?

Effect Hook 可以让你来完成一些类似于class中生命周期的功能;

事实上,类似于网络请求、手动更新DOM、一些事件的监听,都是React更新DOM的一些副作用(Side Effects);

所以对于完成这些功能的Hook被称之为 Effect Hook;

假如我们现在有一个需求:页面中的title总是显示counter的数字,分别使用class组件和Hook实现:

类组件实现

import React, { PureComponent } from 'react'export class App extends PureComponent { constructor() { super() this.state = { counter: 100 } } // 进入页面时, 标题显示counter componentDidMount() { document.title = this.state.counter } // 数据发生变化时, 让标题一起变化 componentDidUpdate() { document.title = this.state.counter } render() { const { counter } = this.state return ( <div> <h2>{counter}</h2> <button onClick={() => this.setState({counter: counter+1})}>+1</button> </div> ) }}export default App

函数组件加Hook的实现:

通过useEffect这个Hook,可以告诉React需要在渲染后执行某些操作;useEffect要求我们传入一个回调函数,在React执行完更新DOM操作之后(也就是组件被渲染完成后),就会回调这个函数;默认情况下,无论是第一次渲染之后,还是每次更新之后,都会执行这个回调函数; 一般情况下我们在该回调函数中都是编写副作用的操作(例如网络请求, 操作DOM, 事件监听)

因此需要注意的是, 有许多说法说useEffect就是用来模拟生命周期的, 其实并不是; useEffect可以做到模拟生命周期, 但是他主要的作用是用来执行副作用的

import React, { memo, useEffect, useState } from 'react'const App = memo(() => { const [counter, setCounter] = useState(200) // useEffect传入一个回调函数, 在页面渲染完成后自动执行 useEffect(() => { // 一般在该回调函数在编写副作用的代码(网络请求, 操作DOM, 事件监听) document.title = counter }) return ( <div> <h2>{counter}</h2> <button onClick={() => setCounter(counter+1)}>+1</button> </div> )})export default App清除副作用(Effect)

在class组件的编写过程中,某些副作用的代码,我们需要在componentWillUnmount中进行清除:

比如我们之前的事件总线或Redux中手动调用subscribe;

React Hook - useEffecfa函数的使用细节详解

都需要在componentWillUnmount有对应的取消订阅;

Effect Hook通过什么方式来模拟componentWillUnmount呢?

useEffect传入的回调函数A本身可以有一个返回值,这个返回值是另外一个回调函数B:

type EffectCallback = () => (void | (() => void | undefined));

为什么要在 effect 中返回一个函数?

这是 effect 可选的清除机制。每个 effect 都可以返回一个清除函数;

如此可以将添加和移除订阅的逻辑放在一起;

它们都属于 effect 的一部分;

React 何时清除 effect?

React 会在组件更新和卸载的时候执行清除操作, 将上一次的监听取消掉, 只留下当前的监听 ;

正如之前学到的,effect 在每次渲染的时候都会执行;

import React, { memo, useEffect } from 'react'const App = memo(() => { useEffect(() => { // 监听store数据发生改变 const unsubscribe = store.subscribe(() => { }) // 返回值是一个回调函数, 该回调函数在组件重新渲染或者要卸载时执行 return () => { // 取消监听操作 unsubscribe() } }) return ( <div> <h2>App</h2> </div> )})export default App使用多个useEffect

使用Hook的其中一个目的就是解决class中生命周期经常将很多的逻辑放在一起的问题:

比如网络请求、事件监听、手动修改DOM,这些往往都会放在componentDidMount中;

一个函数组件中可以使用多个Effect Hook,我们可以将逻辑分离到不同的useEffect中:

import React, { memo, useEffect } from 'react'const App = memo(() => { // 监听的useEffect useEffect(() => { console.log("监听的代码逻辑") return () => { console.log("取消的监听代码逻辑") } }) // 发送网络请求的useEffect useEffect(() => { console.log("网络请求的代码逻辑") }) // 操作DOM的useEffect useEffect(() => { console.log("操作DOM的代码逻辑") }) return ( <div> App </div> )})export default App

Hook允许我们按照代码的用途分离它们, 而不是像生命周期函数那样, 将很多逻辑放在一起:

React将按照 effect

本文链接地址:https://www.jiuchutong.com/zhishi/300856.html 转载请保留说明!

上一篇:vue导入处理Excel表格详解(导入vue.js)

下一篇:nmap命令 网络探测及端口扫描工具(nmap的命令)

  • 探探需要花钱才能聊天吗(探探需要花钱才能直播吗)

    探探需要花钱才能聊天吗(探探需要花钱才能直播吗)

  • 淘宝确认收货后怎么换货(淘宝确认收货后怎么申请退款)

    淘宝确认收货后怎么换货(淘宝确认收货后怎么申请退款)

  • ipad每次充电充到100吗(ipad每次充电充到90好还是100好?)

    ipad每次充电充到100吗(ipad每次充电充到90好还是100好?)

  • 微视的粉丝能删除吗(微视如何删粉丝?)

    微视的粉丝能删除吗(微视如何删粉丝?)

  • 表格的表头是指哪里(表头算不算表格)

    表格的表头是指哪里(表头算不算表格)

  • ipad air2支持pencil吗(ipad air2支持pencil 2磁吸充电吗)

    ipad air2支持pencil吗(ipad air2支持pencil 2磁吸充电吗)

  • 该用户通过群向你发起临时会话什么意思(qq里该用户通过群向你)

    该用户通过群向你发起临时会话什么意思(qq里该用户通过群向你)

  • qq邮箱再次编辑会覆盖原邮件吗(qq邮箱再次编辑发送后之前的原邮件还会在吗)

    qq邮箱再次编辑会覆盖原邮件吗(qq邮箱再次编辑发送后之前的原邮件还会在吗)

  • qldownload是什么文件夹(qmdownload什么意思)

    qldownload是什么文件夹(qmdownload什么意思)

  • 开免打扰模式别人打电话是什么状态(开免打扰模式别人打电话会影响)

    开免打扰模式别人打电话是什么状态(开免打扰模式别人打电话会影响)

  • led两根线随便接吗(led灯怎么接)

    led两根线随便接吗(led灯怎么接)

  • 天猫退货关税由谁承担(天猫进口商品退货要交税吗)

    天猫退货关税由谁承担(天猫进口商品退货要交税吗)

  • 华为mate30和p30对比(华为mate30对比p30)

    华为mate30和p30对比(华为mate30对比p30)

  • 手机微信背景色变成黑色了怎么办(手机微信背景颜色)

    手机微信背景色变成黑色了怎么办(手机微信背景颜色)

  • 账号注销是否还保留数据(账号注销是否还能登录)

    账号注销是否还保留数据(账号注销是否还能登录)

  • 显示屏包括tp吗(显示屏包括内外屏幕么)

    显示屏包括tp吗(显示屏包括内外屏幕么)

  • iphone7home键怎么用(iphone7home键怎么拆)

    iphone7home键怎么用(iphone7home键怎么拆)

  • 电脑1t 256g是什么意思(电脑256g什么意思)

    电脑1t 256g是什么意思(电脑256g什么意思)

  • 小爱ai音响和play版的区别(小爱ai音响和小爱音响区别)

    小爱ai音响和play版的区别(小爱ai音响和小爱音响区别)

  • word ppt excel统称什么

    word ppt excel统称什么

  • word文档怎么画线条(word文档怎么画下划线横线)

    word文档怎么画线条(word文档怎么画下划线横线)

  • 苹果x云盘满了怎么删除(iphone云盘满了怎么办)

    苹果x云盘满了怎么删除(iphone云盘满了怎么办)

  • 瓷砖型提要栏又叫什么(word2016瓷砖型提要栏在哪)

    瓷砖型提要栏又叫什么(word2016瓷砖型提要栏在哪)

  • wifisd卡怎么导出照片(wi-fi sd卡)

    wifisd卡怎么导出照片(wi-fi sd卡)

  • 怎么对Word进行加密(怎么对word进行批注)

    怎么对Word进行加密(怎么对word进行批注)

  • 如何进行网络测试速度呢?(测测网络)

    如何进行网络测试速度呢?(测测网络)

  • 报销差旅费的进项税怎么申报
  • 联营企业属于企业吗
  • 厨房酒店用品
  • 新会计准则开办费分摊
  • 投资性房地产房产税应按从价还是从租
  • 销售退回 账务处理
  • 企业之间现金换承兑合法吗
  • 财务费用利息收入的账务处理
  • 无票收入应附什么单据
  • 贸易行业要计提什么费用
  • 免征企业所得税的有哪些行业
  • 公司网站费用计入什么科目
  • 职工向公司借款计入什么科目
  • 股东垫资需要偿还吗
  • 企业残疾人保障金
  • 税法种类及税率
  • 什么情况增值税专用发票不能抵扣
  • 工资个人所得税标准表
  • 成本费用总额包括所得税费用吗
  • 预付的货款可以计入应付账款吗
  • 什么情况下征收车船税
  • 税务罚款计入哪个会计科目
  • m1 mac 恢复出厂
  • 期货和远期
  • 出差的住宿费较高的原因
  • 爱尔兰新手岛
  • 退货的会计分录怎么做
  • php数组函数题目
  • 工业企业采购部工作职责
  • wordpress建网站详细教程
  • 个人销售非住宅无法提供原值怎么计算增值税
  • 海峡群岛属于哪个洲
  • php文件上传用什么请求方法
  • 社保申报已扣款还能作废吗
  • 2023前端面试题pdf
  • vue组件用法
  • 模型训练的过程是什么过程
  • 叮咚你有一份好运请查收图片
  • javascript 高级教程
  • php中常量
  • lsmod命令结果详解
  • 为什么电子章打印出是黑色的
  • 房地产企业汇算清缴资料
  • 销售商品的折扣
  • 一笔购入多项固定资产
  • 支付宝提取到公积金账户
  • 其他应收款增加现金流量表怎么填
  • sqlserver2008sa用户不能登录
  • sql2012附加数据库方法
  • 自产产品用于业务招待费
  • 再保险责任的承担
  • 投资性房地产抵债怎么做账务处理
  • 公司开业前期费用谁出
  • 收到承兑的账务处理
  • 一般纳税人进项票是普票可以抵扣吗
  • 账上的进项税额比申报多了怎么调账
  • 结转公允价值变动
  • 普通发票的开具办法是?
  • 建立备查账簿登记的有哪些
  • centos6.2安装
  • linux 查看numa
  • mysql表中数据
  • mysql数据库主键怎么设置
  • 关闭antivirus
  • win8.1快捷键
  • linux用户相关命令
  • win10更新补丁后键盘失灵
  • jquery获取本地ip
  • 示例代码
  • python的日志
  • jQuery同步提交示例代码
  • 骨骼动画spine
  • javascript零基础入门
  • jquery示例
  • libgdx robovm admob IOS SDK的绑定
  • 山东省国家税务局总局官网
  • 小规模纳税人怎么申报纳税
  • 电池涂料消费税问题
  • 广东省电子税务局电话
  • 国税局内设机构
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设