React Hooks ——性能优化Hooks
什么是Hooks
Hooks从语法上来说是一些函数。这些函数可以用于在函数组件中引入状态管理和生命周期方法。
React Hooks的优点
- 简洁
从语法上来说,写的代码少了 - 上手非常简单
- 基于函数式编程理念,只需要掌握一些JavaScript基础知识
- 与生命周期相关的知识不用学,react Hooks使用全新的理念来管理组件的运作过程
- 与HOC相关的知识不用学,React Hooks能够完美解决HOC想要解决的问题,并且更可靠
- Mobx取代了Redux做状态管理
- 代码复用性更好
- 与Typescript结合更简单
React Hooks的缺点
- 状态不同步
在异步操作的函数中访问的状态还是原来的状态的值 - useEffect依赖问题
当useEffect依赖的数据变多后会导致频繁触发
React Hooks的注意事项
- 命名规范
自定义Hooks的命名一律使用use作为前缀,形如:useXXX - 仅在最外层调用React Hooks
- 仅从react函数中调用react Hooks
在自定义Hooks或者组件中调用Hooks
useMemo
useMemo主要是用来实现性能优化的目的。
useMemo(callback,array):
- callback:回调函数,用于处理逻辑
- array:array中包含需要监听的依赖,当依赖值发生变化时,重新执行callback。
useMemo()会返回一个函数称之为memoized。
import React,{useMemo,useState} from 'react'const TestCom = React.memo(()=>{return <></>
});function App(){const [user,setUser] = useState({name:'hello',userSex;1})const filterSex = useMemo(()=>{return user.userSex === 1 ? '男' : '女'},[user]);return <><span>{filterSex}</span><TestCom></TestCom></>
}
只有当user触发更新的时候,才会重新触发filterSex内部的计算,这样就到达缓存性能优化的目的了。
注意事项
- useMemo应该用于缓存函数组件中计算资源消耗较大的场景,因为useMemo本身就占用一定的缓存,在飞必要的场景下使用反而不利于性能的优化
- 在处理量很小的情况下使用useMemo,可能会有额外的使用开销
useCallback
useCallback用于缓存一个函数,无论渲染多少次,函数都是同一个函数,这样可以减小不断创建新函数带来的性能和内存开销问题。
useCallback(callback,array):
- callback:函数,用于处理逻辑
- array:控制useCallback重新执行的数组,array内state改变时才会重新执行useCallback
import {useCallback,useState} from 'react'
function App(){const [state,setState] = useState('');const input = useCallback((e)=>{setState(e.target.value); },[]);return <><input onInput={(e)=>input(e)} /></>
}
注意事项
- useCallback需要配合useMemo使用。这是因为React.memo方法会对props做浅层比较。如果props没有发生改变,则不会重新渲染。
自定义Hooks
自定义Hooks最重要的作用是逻辑复用,并非数据的复用,也不是UI的复用。
自定义Hooks就是声明一个函数,函数名根据命名规范以use作为开头,在函数内部可以使用任意内置Hooks。
import {useEffect}from 'react'
export default function useDomTitle(title){useEffect(()=>{document.title = title; },[]);return;
}
使用自定义Hooks时,在需要使用的组件中导入Hooks
import useDomTitle from './hooks/useDomTitle'
function APP(){useDomTitle('hello');return <></>
}
注意事项
- 减少useState的数量,使用较少的useState可以是Hooks的返回更容易,在组件中的实现更简单。
- 有限考虑可读性
- 合理拆分state对象中的内容
- 合理使用Hooks的返回值
- 合理拆分Hooks,不0
相关文章:
React Hooks ——性能优化Hooks
什么是Hooks Hooks从语法上来说是一些函数。这些函数可以用于在函数组件中引入状态管理和生命周期方法。 React Hooks的优点 简洁 从语法上来说,写的代码少了上手非常简单 基于函数式编程理念,只需要掌握一些JavaScript基础知识与生命周期相关的知识不…...
C#学习系列相关之多线程(一)----常用多线程方法总结
一、多线程的用途 在介绍多线程的方法之前首先应当知道什么是多线程, 在一个进程内部可以执行多个任务,而这每一个任务我们就可以看成是一个线程。是程序使用CPU的基本单位。进程是拥有资源的基本单位, 线程是CPU调度的基本单位。多线程的作用…...
Vscode爆红Delete `␍`eslintprettier/prettier
一、先看报错 文件中爆红,提示 Delete ␍eslintprettier/prettier 二、解决方案 项目根目录下,.prettierrc.js 文件中: endOfLine: auto,三、重启VsCode 此时不在爆红,问题完美解决...
Mac安装Ecplise产品报错:dose not contain the JNI_CreateJavaVM symbol
1. 絮絮叨叨 工作中需要借助Ecplise Memory Analyzer (MAT)分析dump文件,直接下载、安装、运行MAT报错 询问同事后,同事说可以先安装Ecplise,再以插件的形式安装MAT下载、安装好Eclipse,点击运行仍然报错,且错误信息一…...
如何使用大语言模型来绘制图画
请创作一张科技感十足的图片,包含siri和iphone两个元素,请帮我挑选合适的style和background 好的,我会为你创作一张科技感十足的图片,包含siri和iphone两个元素。我会根据你的要求,选择一种适合的风格和背景。请稍等一…...
代码随想录算法训练营第23期day11 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式求值
目录 一、(leetcode 20)有效的括号 二、(leetcode 1047)删除字符串中的所有相邻重复项 用栈存放 将字符串直接当成栈 三、(leetcode 150)逆波兰表达式求值 一、(leetcode 20)…...
数据结构-优先级队列(堆)
文章目录 目录 文章目录 前言 一 . 堆 二 . 堆的创建(以大根堆为例) 堆的向下调整(重难点) 堆的创建 堆的删除 向上调整 堆的插入 三 . 优先级队列 总结 前言 大家好,今天给大家讲解一下堆这个数据结构和它的实现 - 优先级队列 一 . 堆 堆(Heap࿰…...
C++11新特性(语法糖,新容器)
距离C11版本发布已经过去那么多年了,为什么还称为新特性呢?因为笔者前面探讨的内容,除了auto,范围for这些常用的,基本上是用着C98的内容,虽说C11已经发布很多年,却是目前被使用最广泛的版本。因…...
开机可用内存分析Tip
一、开机内存简介 开机内存指的是开机一段时间稳定后的可用内存。一般项目都会挑选同平台其他优秀竞品内存数据,这个也是衡量性能的一个重要标准。所以要进行开机内存检测,同时优化非法内存进程占用。 二、测试前期核查任务 开机内存测试前要进行测试机…...
【Python基础】4. 基本语句
文章目录 注释(Comment)解释伴随行文本编码问题 输入输出语句(Input & Output)输出语句普通输出格式化输出(3种)format 格式总结 输入语句 基本语句if 语句match 语句(Python3.10 新增&…...
兼顾友好与安全,隐私协议 Unijoin 助推新一轮 Web3 浪潮
区块链本身不仅崇尚去中心化,同时也崇尚公开透明,虽然这正在让 DAO 治理等变得更加公平,但它同时也是一把双刃剑,个人交易者尤其是一些巨鲸交易者的所以链上交易都被公之于众,这似乎并不是他们想要的结果。 所以从加密…...
TCP端口崩溃,msg:socket(): Too many open files
一、现象 linux系统中运行了一个TCP服务器,该服务器监听的TCP端口为10000。但是长时间运行时发现该端口会崩溃,TCP客户端连接该端口会失败: 可以看到进行三次握手时,TCP客户端向该TCP服务器的10000端口发送了SYN报文,…...
基于Laravel 5.6的运动健身类小程序前后端源码
基于Laravel 5.6的运动健身、健康类小程序前后端源码,一套比较基础的运动健康、健身类小程序源码。朋友自己无聊写的,比较基础,有需要的可以拿去修修改改升级开发一下。 使用宝塔安装,比较省事,PHP相关的扩展需要启用…...
NodeMCU ESP8266硬件开发板的熟悉
文章目录 硬件开发环境的熟悉基础介绍什么是 ESP8266 NodeMCU?NodeMCU芯片ESP12-E 模组开发板 ESP8266 版本引脚图Power GND I2CGPIOADCUARTSPIPWMControl 总结 硬件开发环境的熟悉 基础介绍 什么是 ESP8266 NodeMCU? ESP8266是乐鑫开发的一款低成本 …...
计算机毕业设计 基于SSM的在线预约导游系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
Mac 挂载 Alist网盘
挂载服务器的Alist 网盘到 Mac mac,使用的是 CloundMounter 这个软件进行挂载 http://ip:port/dav/ 需要在末尾加上 /dav/ 在一些服务器上,为了提供WebDAV服务,需要在URL地址的末尾添加"/dav/“。这是因为WebDAV协议规定了一些标准的URL路径&#x…...
【多模态融合】TransFusion学习笔记(1)
工作上主要还是以纯lidar的算法开发,部署以及系统架构设计为主。对于多模态融合(这里主要是只指Lidar和Camer的融合)这方面研究甚少。最近借助和朋友们讨论论文的契机接触了一下这方面的知识,起步是晚了一点,但好歹是开了个头。下面就借助TransFusion论文…...
(二)正点原子STM32MP135移植——TF-A移植
目录 一、TF-A概述 二、编译官方代码 2.1 解压源码 2.2 打补丁 2.3 编译准备 (1)修改Makfile.sdk (2)设置环境变量 (3)编译 三、移植 3.1 复制官方文件 3.2 修改电源 3.3 修改TF卡和emmc 3.4 添…...
将二叉搜索树转化为排序的双向链表
链接: LCR 155. 将二叉搜索树转化为排序的双向链表 题解: /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node() {}Node(int _val) {val _val;left NULL;right NULL;}Node(int _val, Node* _left…...
电脑dll丢失应该怎么解决,dll文件丢失怎么恢复方法分享
DLL(Dynamic Link Library,动态链接库)是一种可执行文件,它包含了在程序运行时需要调用的代码和资源。DLL 文件的主要作用是实现代码和资源的共享,这样在多个程序之间就可以避免重复的代码和资源,从而节省系…...
告别付费电话!手把手教你用Linphone+SIP搭建免费语音视频通话系统(附服务器配置)
零成本构建企业级音视频通信系统:LinphoneSIP全栈实战指南 在远程协作成为主流的今天,企业每年为商业通信软件支付的订阅费用往往高达数万元。我曾为一家20人团队优化通信成本时发现,仅视频会议一项的年支出就超过3万元——而这一切完全可以通…...
无线充电技术解析:从Qi标准到射频远距充电的现状与未来
1. 无线充电的现状与用户困境作为一名长期关注消费电子与网络通信设备的技术博主,我每天打交道最多的就是各种“电老虎”和“充电宝”。Rebecca Day在文章里描述的那个圣诞场景,我简直不能再熟悉了——在一堆新设备的包装盒里翻找线缆,在抽屉…...
Go语言规则同步器airulesync:自动化聚合与更新网络过滤规则
1. 项目概述:一个自动同步上游规则的“规则同步器”如果你和我一样,长期在维护自己的网络过滤规则集,无论是用于广告屏蔽、隐私保护还是内容过滤,那么你一定对“规则更新”这件事深有体会。手动去各个开源项目的主页查看更新、下载…...
【UWB-IMU、UWB定位】【UWB-IMU】融合仅具有测距和6轴IMU传感器数据的位置信息研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
3分钟学会Xbox Game Pass存档提取:免费工具实现跨平台游戏进度迁移
3分钟学会Xbox Game Pass存档提取:免费工具实现跨平台游戏进度迁移 【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor 作为游戏…...
终极开源语音AI工具包:Sherpa-Onnx一站式解决方案
终极开源语音AI工具包:Sherpa-Onnx一站式解决方案 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Sup…...
Tiny AI Client:零依赖、轻量化的AI API调用库设计与实战
1. 项目概述与核心价值最近在折腾AI应用本地化部署和轻量化客户端时,发现了一个挺有意思的项目——piEsposito/tiny-ai-client。这名字起得就很直白,“tiny”意味着小巧,“ai-client”点明了它是一个AI客户端。乍一看,你可能会觉得…...
保姆级教程:在Google Colab上用TensorFlow 2.0快速搭建你的第一个ACGAN图像生成器
零门槛实战:用ColabTensorFlow打造你的首个ACGAN数字生成器 想象一下,只需点击几次就能让AI学会生成逼真的手写数字——这不再是实验室里的黑科技。我们将利用Google Colab的免费GPU资源,带你用TensorFlow 2.0快速搭建一个能按需求生成特定数…...
写论文软件哪个好?2026 实测:真文献 + 实证图表 + 全流程,虎贲等考 AI 才是毕业论文通关王
每到毕业季,“写论文软件哪个好” 就成为本硕生最纠结的问题。市面上工具看似繁多,却大多藏着隐患:通用 AI 编造文献、无实证支撑;小众工具功能碎片化、格式混乱;传统软件效率低、无智能辅助…… 选错软件,…...
HTML5 教程
HTML5 教程 引言 HTML5,作为现代网页开发的核心技术之一,自从推出以来就受到了广泛的关注和认可。它不仅改进了原有的HTML特性,还引入了新的元素和API,使得网页设计和开发更加高效、强大。本教程旨在为您提供一个全面的HTML5学习路径,帮助您快速掌握HTML5的基础知识和高…...
