react相关hooks(二)

不写性能优化的时候

const Child = (props) => {console.log(child function is recalled)// count1改变时多次执行return (<div><h1>{ props.count2}</h1></div>)
}
function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child count2={count2}/><button onClick={()=> setCount2(count2+1)}>+</button></div>)
}
root.render(<App />)

memo

const Child = memo((props) => {console.log(child function is recalled)// count1改变时不会多次执行return (<div><h1>{ props.count2}</h1></div>)
})
/*** * 函数组件最大的弱点:渲染执行* 当一个组建的状态发生了改变的时候 相关视图是必然要更新的* 函数组件在视图更新的需求来临的时候 函数是必然要执行的*/
function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child count2={count2}/><button onClick={()=> setCount2(count2+1)}>+</button></div>)
}
root.render(<App />)

useMemo

/***  memo会对引用进行比较,这种比较时浅比较,* 	如果更新了一个新的引用,那么child就会被执行*  count1更新 app重新执行 child 必然要重新赋值一个新引用*/
const Child = memo((props) => {console.log(child function is recalled)// count1改变时会多次执行return (<div><h1>{ props.childData.count2}</h1></div>)
})
function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)const childData = {count2}return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child childData={childData}/><button onClick={()=> setCount2(count2+1)}>+</button></div>)
}
const Child = memo(props) => {console.log(child function is recalled)// count1改变时不会多次执行return (<div><h1>{ props.childData.count2}</h1></div>)
}
function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)// const childData = {// 	count2// }// 只有依赖变了才会返回新的引用// 不是为了子组件/返回常量的时候,不需要使用useMemoconst childData = useMemo(() => ({count2}),[count2])/*** const newCount1 = useMemo(()=>count1*2,[count1])* 类似vue计算属性 可以使用useMemo*/return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child childData={childData}/><button onClick={()=> setCount2(count2+1)}>+</button></div>)
}

useCallback

const Child = memo(props) => {console.log(child function is recalled)// count1改变时会多次执行return (<div><h1>{props.childData.count2}</h1><button onClick={props.setCount2}>+</button></div>)
}function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)const cbSetCount2 = () => {() => setCount2(count2 + 1);}return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child childData={childData} setCount2={cbSetCount2 } /></div>)
}
const Child = memo(props) => {console.log(child function is recalled)// count1改变时不会多次执行return (<div><h1>{props.childData.count2}</h1><button onClick={props.setCount2}>+</button></div>)
}function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)// 函数是静态的 一般情况下是不会增加依赖的 除非是用户配置 比如面向对象 在this上增加函数 prototype上增加函数const cbSetCount2 = useCallback(() => {() => setCount2(count2 + 1);},[])return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child childData={childData} setCount2={cbSetCount2 } /></div>)
}

memo手写

const { component } = React;
export default class PureComponent extends Component {// 如果你需要自定义shouldComponentUpdate 那么就不能继承pureComponent(pureComponent字段该函数)// 该函数无法鉴定动态的变化shouldComponentUpdate (nextProps, nextState) { return !shallowEqual(this.props,nextProps) ||!shallowEqual(this.state,nextState)}
}function shallowEqual (o1, o2) {// 组件不能调用render函数if (o1 === o2) return true;if (typeof o1 !== 'object' || o1 === null || typeof o2 !== 'object' || o2 === null) {return false;}const k1 = Object.keys(o1);const k2 = Object.keys(o2);if (k1.length !== k2.length) return false;for (const k of k1) {if (!o2.hasOwnProperty(k) || o1[k] !== o2[k]) {return false;}}return true;
}
export function memo (Fc) {return class extends PureComponent{return () {return Fc(this.props)}}
}
useMemo
function useMemo(cb,depArr){if (memoArr[memoIndex]) {const [_memo, _dep] = memoArr[memoIndex]const isFullySame = depArr.every((dep, index) => dep === _dep[index]);if (isFullySame) { memoIndex++;return _memo;} else {return setNewMemo(cb,depArr)}} else {return setNewMemo(cb,depArr)}function setNewMemo (cb, depArr) {const memo = cb();memoArr[memoIndex++] = [memo, depArr]return memo;}
}useCallback
function useCallback(cb,depArr){if (callbackArr[callbackIndex]) {const [_callback, _dep] = callbackArr[callbackIndex]const isFullySame = depArr.every((dep, index) => dep === _dep[index]);if (isFullySame) { callbackIndex++;return _callback;} else {return setNewCallback(cb,depArr)}} else {return setNewCallback(cb,depArr)}function setNewCallback (cb, depArr) {callbackArr[callbackIndex++] = [cb,depArr]}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP8266模块(CH340)零基础实战

USB数据线连接ESP8266模块到电脑 先按住FLASH键,再按一下RST键,然后松开 此时电脑可识别出CH340 COM接口 CH340芯片厂商网址: wch.cn 传输比特率9600 win11自带驱动 下载Arduino IDE

一文了解什么是Selenium自动化测试?

一、Selenium是什么&#xff1f; 用官网的一句话来讲&#xff1a;Selenium automates browsers. Thats it&#xff01;简单来讲&#xff0c;Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作浏览器一样。支持的浏…

【美赛指南】新手小白必备参赛指南

美赛指南 一、2024美赛安排二、题目类型三、选题建议四、美赛前期准备五、常用算法 一、2024美赛安排 报名截至时间&#xff1a;2024年 2月2日 00&#xff1a;00 比赛时间&#xff1a;2024年 2月2日 6&#xff1a;00- 2月6日 9&#xff1a;00 提交截至日期&#xff1a;2024年2…

嵌入式系统复习--概述

文章目录 基本概念嵌入式系统的组成结构嵌入式操作系统嵌入式软件开发环境硬件基础简介下一篇 基本概念 嵌入式计算机&#xff1a;把嵌入到对象体系中、实现对象体系智能化控制的带有微控制器的计算机&#xff0c;称作嵌入式计算机 嵌入式系统&#xff1a;以应用为中心&#…

harmonyOS学习笔记之@Provide装饰器和@Consume装饰器

Provide和Consume&#xff0c;应用于与后代组件的双向数据同步&#xff0c;应用于状态数据在多个层级之间传递的场景。不同于State/Link装饰器修饰的 父子组件之间通过命名参数机制传递&#xff0c;Provide和Consume摆脱参数传递机制的束缚&#xff0c;实现跨层级传递。 其中Pr…

基于Java的招聘系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

OWASP Web 安全测试指南 WSTG

Eoin Keary的前言 软件不安全的问题可能是我们这个时代最重要的技术挑战。支持业务、社交网络等的 Web 应用程序的急剧兴起只会加剧建立一种强大的方法来编写和保护我们的 Internet、Web 应用程序和数据的要求。 在开放 Web 应用程序安全项目 &#xff08;OWASP&#xff09; 中…

HarmonyOS应用开发-手写板

这是一个基于HarmonyOS做的一个手写板应用&#xff0c;只需要简单的几十行代码&#xff0c;就可以实现如下手写功能以及清空画布功能。 一、先上效果图&#xff1a; 二、上代码 Entry Component struct Index {//手写路径State pathCommands: string ;build() {Column() {//…

4-二分-索引二分-搜索旋转排序数组 II

这是索引二分的第四篇算法&#xff0c;力扣链接 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数…

RocketMQ-源码架构

源码环境搭建 1、主要功能模块 RocketMQ官方Git仓库地址&#xff1a;GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. RocketMQ的官方网站下载&#xff1a;下载 | R…

现在多种数据库的读写模型对比

目录 mongDB read write ES read write MySql write 总结 mongDB 3.0 版本后的WiredTiger存储引擎 read 1. 应用通过driver 发起Buffer I/O读操作&#xff0c;由操作系统将磁盘数据页加载到文件系统的页缓存区 2. 引擎层读取页缓冲区的数据&#xff0c;进行解压后放…

C++STL算法库中谓词的使用

什么是c的谓词 谓词概念&#xff1a; 谓词函数是一个判断式&#xff0c;一个返回bool值的函数或者仿函数&#xff0c;有几个入参就是几元谓词。一般做一个函数的参数使用【引用自百度百科】。 常见的可以作为谓词的东西&#xff1a;函数、函数指针、函数对象、lambda表达式&am…

2023 年浙江省职业院校技能大赛信息安全管理与评估赛项规程

*2023 年浙江省职业院校技能大赛“高职组”* *“信息安全管理与评估”赛项规程* *一、赛项名称* 赛项名称&#xff1a;信息安全管理与评估 英文名称&#xff1a;Information Security Management and Evaluation 赛项组别&#xff1a;高职 赛项归属产业&#xff1a;电子信…

热电厂发电机组常见故障及预测性维护方法

热电厂的发电机组是关键的能源生产设备&#xff0c;在电力供应中扮演着关键角色。但经过长期运行和高负荷工作&#xff0c;一旦发生故障&#xff0c;可能导致停机、设备损坏甚至引发严重事故。因此&#xff0c;实施有效的预测性维护方法对于确保发电机组的稳定运行至关重要。本…

Linux(17):认识与分析登录档

什么是登录档 【详细而确实的分析以及备份系统的登录文件】是一个系统管理员应该要进行的任务之一。 登录档 就是记录系统活动信息的几个文件&#xff0c;例如&#xff1a;何时、何地(来源IP)、何人(什么服务名称)、做了什么动作(讯息登录啰)。 换句话说就是&#xff1a;记录系…

【MySQL】:表的操作

表的操作 一.创建表二.查看表结构三.修改表四.删除表 一.创建表 field 表示列名。 datatype 表示列的类型。 character set 字符集&#xff0c;如果没有指定字符集&#xff0c;则以所在数据库的字符集为准。 collate 校验规则&#xff0c;如果没有指定校验规则&#xff0c;则以…

MySQL系列(二)——日志篇

MySQL日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中&#xff0c;比较重要的还要属二进制日志binlog&#xff08;归档日志&#xff09;和事务日志redo log&#xff08;重做日志&#xff09;和undo log&#xff08;回滚日志&#xff09;。 今…

windows批处理脚本(.bat)如何激活Anconda Prompt虚拟环境

通过call 来调用激活脚本&#xff0c; activate myenv指的是要激活的环境&#xff0c;若省略&#xff0c;则激活的是base环境。 call : 从另一个批处理程序调用一个批处理程序&#xff0c;而不停止父批处理程序。 call C:\ProgramData\Anaconda3\Scripts\activate.bat activate…

fastdds共享内存实现原理

fastdds 共享内存分两个部分&#xff0c;一部分用于保存数据&#xff0c;一部分用于通信。 fastrtps_“UUID”:共享内存包括又两部分数据&#xff0c;BufferNode和segment_size, 用配置文件port_queue_capacity_指定BufferNode的数量&#xff0c;segment_size用于保存实际传输的…

imp导入数据发现的

迁移历史数据到历史库&#xff0c;因为灾备数据中心使用的DG&#xff0c;无法使用数据泵&#xff0c;只能通过exp导出&#xff0c;然后再通过imp导入 为防止undo表空间压力过大&#xff0c;在导入时imp使用了commit参数及buffer参数 这次导入数据量达到1TB&#xff0c;刚到了1/…