react面试之context的value变化时,内部所有子组件是否变化
上测试代码
// context
const state = {a: 1,b: 1,
}
const context = createContext(state);export default context;
// A组件
const A = () => {const { a } = useContext(context);return (<div>{a}</div>)
}
export default A;// B组件
const B = () => {const { b } = useContext(context);return (<div>{b}</div>)
}
export default B;// C组件, 不引用context
const C = () => {return (<div>cccc</div>)
}
export default C;// APP.js
function App() {const [a, setA] = useState(-1);return (<div><Context.Provider value={{a,b}}><A /><B /><C /></Context.Provider><button onClick={() => setA(a+1)}>+++</button></div>);
问,点击按钮时,ABC三个组件中谁会刷新?
答案是三个都会刷新,因为App组件中state改变了,导致所有组件都刷新了。所以并不能知道context有没有作用给B和C组件。
为了解决父组件state更新,而导致子组件更新,我们需要给ABC三个组件的export default加上memo方法,第二个参数为PropsAreEqual,直接让他返回true。
改造后为:
// A组件
// ...
export default memo(A, () => true);// B组件
// ...
export default memo(B, () => true);// C组件, 不引用context
// ...
export default memo(C, () => true);
此时,再次点击按钮,谁会触发更新。
答案是AB会触发更新,C不更新。
但是我们只更新了a的值,为什么没有使用a的B组件却也更新了呢?
是因为他们共同使用了一个context,而他的value是一个对象,每次都会重新生成一个新的对象,所以导致B组件以为context更新了,所以他就会触发渲染了。
所以可知,只要context的value发生改变,所有用到useContext(context)的都会更新。
如果我们在C组件里增加一个D组件,让D组件引用该context,会怎么样呢?
// C组件, 不引用context
const C = () => {return (<div>cccc<D/></div>)
}
export default memo(C, () => true);
// D组件
const D = () => {const { b } = useContext(context);return (<div>{b}</div>)
}
export default memo(D, () => true);
点击按钮,C会触发更新么?
答案是不会,ABD都更新了,C没有更新。进一步验证了自己的猜想。
如果不想让BD因为a的改变而改变,该怎么办?
那就把b从state中拆解出来,重新创建一个bContext!
// App组件改为:
function App() {
const [a, setA] = useState(-1);
const [b, setB] = useState(-1);return (<div><Context.Provider value={{a}}><BContext.Provider value={{b}}><A /><B /><C /></BContext.Provider></Context.Provider><button onClick={() => setA(a+1)}>++a</button><button onClick={() => setA(b+1)}>++b</button></div>)
}
// B组件和D组件都更新为引用bContext
import bContext from "./context/b"
// ...
const { b } = useContext(bContext);
// ...
此时,你认为点击a按钮,BD会更新么?
答案是会更新,为什么?
因为BContext的value每次都是一个新对象,所以他认为一直在更改,所以如果想要传递对象,最好的办法就是在外层用useMemo重新定义一个。{a}同理。
// App改为const aVal = useMemo(() => ({ a }), [a])const bVal = useMemo(() => ({ b }), [b])<Context.Provider value={aVal}><BContext.Provider value={bVal}><A /><B /><C /></BContext.Provider>
</Context.Provider>
此时更新a的值,并不会影响BD组件,只有A组件会更新。同时,更新b的值,也不会触发A组件的更新,只有BD更新。C则不会收到a,b两个值更新的影响。
至此,可以得出结论,context的值更新时,只会影响使用该context的组件,不会影响其他组件(前提是在memo中做好控制。)
相关文章:
react面试之context的value变化时,内部所有子组件是否变化
上测试代码 // context const state {a: 1,b: 1, } const context createContext(state);export default context; // A组件 const A () > {const { a } useContext(context);return (<div>{a}</div>) } export default A;// B组件 const B () > {cons…...
使用okHttp不走代理问题
背景 某日使用okhttp设置代理并发送爬虫请求时,发现部分url请求没有走代理直接和目标url建立了连接,伪代码如下。初始化okhttpClient时设置了proxySelecter代理,但是调用okhttpClient.newCall请求时并没用调用proxySelecter.select函数获取代…...
python moviepy 自动化音视频处理实践
MoviePy是一个用于视频编辑的Python库。它提供了一种简单且直观的方式来处理视频文件,包括剪辑、合并、裁剪、添加文本、添加音频等操作。使用MoviePy,你可以通过编写Python代码来创建和编辑视频,而无需使用复杂的视频编辑软件。 MoviePy建立…...
聊聊混合动力汽车和纯电骑车的优势和劣势
混合动力汽车和纯电动骑车是两种不同的交通工具,它们都有各自的优势和劣势。本文将分别探讨混合动力汽车和纯电动骑车的优势和劣势,并为文章提供三个备选的好听的标题。 混合动力汽车是一种结合了内燃机和电动机的汽车,它可以同时利用燃油和电…...
算法训练Day39|62.不同路径 ● 63. 不同路径 II
LeetCode:62.不同路径 62. 不同路径 - 力扣(LeetCode) 1.思路 想象成矩阵填格子,两个关键点,初始化和递推公式。 初始化除点(0,0)第一行第一列均为1,递推公式推导dp[i][j] dp[i …...
react中hooks分享
一. HOOKS是什么 在计算机程序设计中,钩子一词涵盖了一系列技术,这些技术用来通过拦截函数调用、消息或在软件组件之间传递的事件来改变或增加操作系统、应用程序或其他软件组件的行为。处理这些被截获的函数调用、事件或消息的代码称为“hook”。 在r…...
LeetCode1207. 独一无二的出现次数
题干 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 示例1: 输入:arr [1,2,2,1,1,3] 输出:true 解释:在该…...
【maven】构建项目前clean和不clean的区别
其实很简单,但是百度搜了一下,还是没人能简单说明白。 搬用之前做C项目时总结结论: 所以自己在IDE里一遍遍测试程序能否跑通的时候,不需要clean,因为反正还要改嘛。 但是这个项目测试好了,你要打成jar包给…...
Stable Diffusion 硬核生存指南:WebUI 中的 CodeFormer
本篇文章聊聊 Stable Diffusion WebUI 中的核心组件,强壮的人脸图像面部画面修复模型 CodeFormer 相关的事情。 写在前面 在 Stable Diffusion WebUI 项目中,源码 modules 目录中,有一个有趣的目录叫做 CodeFormer,它就是本文的…...
从零开始理解Linux中断架构(24)软中断核心函数__do_softirq
1)概要 __do_softirq函数处理是总是尽可能的执行所有未决软中断。 (1)关闭软中断:在preempt_count设置软中断标志:SOFTIRQ_OFFSET 让in_interrupt检查条件为真,进入软中断处理临界区,后面进来的处理请求,需要检查in_interrupt(),从而达到禁止本cpu上的软中断嵌套的目…...
【云原生】Kubernetes中deployment是什么?
目录 Deployments 更新 Deployment 回滚 Deployment 缩放 Deployment Deployment 状态 清理策略 金丝雀部署 编写 Deployment 规约 Deployments 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。 你负责描述 Deployment 中的 目标状态,而 De…...
sk_buff操作函数学习
一. 前言 内核提供了大量实用的操作sk_buff的函数,在开发网络设备驱动程序和修改网络协议栈代码时需要用到。这些函数从功能上可以分为三类:创建,释放和复制socket buffer;操作sk_buff结构中的参数和指针;管理socket b…...
conda create时候出现JSONDecoderError解决方法
起因是我的conda出现了JSONDecoderError,这个我搜了一下是因为某些配置文件错误,所以让我update conda,于是我先用了下面的指令: conda update conda 但是在执行过程中依然会出现 JSONDecoderError的问题,后来参考了这…...
Electron 工具进程utilityProcess 使用中遇到的坑点汇集
简介 这是基于 node.js 中的子进程的概念推出来的,可参考链接:utilityProcess | Electron 官网有一句话非常重要,它提供一个相当于 Node.js 的 child_process.fork API,但使用 Chromium 的 Services API 代替来执行子进程。这句话…...
JdbcTemplate
目录 1、简介 2、开发步骤 2.1、导入坐标 2.2、创建表和类 2.3、创建JdbcTemplate对象 2.4、执行数据库操作 3、解耦 4、增删改查 ⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹…...
PROFINET转TCP/IP网关profinet网线接头接法
大家好,今天要和大家分享一款自主研发的通讯网关,捷米JM-PN-TCPIP。这款网关可是集多种功能于一身,PROFINET从站功能,让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗?一起来看看吧&…...
【FPGA IP系列】FIFO的通俗理解
FPGA厂商提供了丰富的IP核,基础性IP核都是可以直接免费调用的,比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识,帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out,即先进先出。 FIFO是一个数…...
Kylin v10基于cephadm工具离线部署ceph分布式存储
1. 环境: ceph:octopus OS:Kylin-Server-V10_U1-Release-Build02-20210824-GFB-x86_64、CentOS Linux release 7.9.2009 2. ceph和cephadm 2.1 ceph简介 Ceph可用于向云平台提供对象存储、块设备服务和文件系统。所有Ceph存储集群部署都从…...
框架的前置学习-反射
运行java代码要经历的三个阶段 反射,程序框架设计的灵魂,将类的各个组成部分封装成其他对象,这就是反射机制。 框架:半成品的软件,在框架的基础上进行开发,可以简化编码 反射的好处: 可以在…...
【使用bat脚本实现批量创建文件夹、批量复制文件至对应文件夹中】
使用bat脚本实现批量创建文件夹、批量复制文件至对应文件夹中 常用cmd命令 场景一:在指定位置批量创建文件夹 在桌面创建一个txt文件编写创建目录代码 //在桌面"五保户结算单"的文件夹下创建名称为"1张三"的文件夹 md E:\桌面\五保户结算单\…...
UE5 碰撞体组件与导航网格结果存在偏移的问题
问题是在大量使用球形collision发现的,最初以为是偏离但是方形的collision是正确的胶囊体的Collision也是有偏移的然后经过一系列的尝试,最终发觉如下现象。在对胶囊体做测试时,我并不需要一个坐标000的躺着的胶囊体,我为它设置了…...
穿透式监管是什么?终于有人把穿透式监管落地讲明白了!
最近,各位老板有没有发现各种审计、检查多起来了?国资委、集团总部的发文一个接一个,问题也越来越细致。最近大家都被穿透式监管这个词弄得有点紧张,害怕自己的企业那天也被点名。其实,穿透式监管对企业来说࿰…...
终极视频编码神器StaxRip:Windows平台最强大GUI工具完全指南
终极视频编码神器StaxRip:Windows平台最强大GUI工具完全指南 【免费下载链接】staxrip 🎞 Video encoding GUI for Windows. 项目地址: https://gitcode.com/gh_mirrors/st/staxrip 🎞️ 你是否正在寻找一款功能强大、灵活高效的视频编…...
Elasticsearch RTF安全配置终极指南:X-Pack安装与免费License申请教程
Elasticsearch RTF安全配置终极指南:X-Pack安装与免费License申请教程 【免费下载链接】elasticsearch-rtf elasticsearch中文发行版,针对中文集成了相关插件,方便新手学习测试. 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearc…...
PX4+Gazebo仿真:从键盘指令到无人机轨迹的Offboard控制实践
1. 环境搭建与基础配置 在开始PX4Gazebo仿真之前,我们需要先搭建好开发环境。我推荐使用Ubuntu 20.04 LTS系统,这是目前最稳定的ROS Noetic支持版本。记得第一次配置环境时,我花了整整一天时间解决各种依赖问题,现在把这些经验都总…...
深入芯片布线底层:聊聊ICC II里那些容易被忽略的“小”设置,比如Secondary PG、Via Ladder和天线效应
深入芯片布线底层:ICC II中那些影响性能与良率的隐藏配置 在芯片物理实现的最后阶段,布线工程师往往将注意力集中在时序收敛和DRC修复上,却容易忽略工具中那些看似次要却实际影响深远的配置项。本文将聚焦ICC II布线流程中四个关键但常被低估…...
【新手必看】鼎利测试软件Pilot Pioneer-② 工具栏与菜单栏功能详解
1. Pilot Pioneer工具栏全解析 刚接触鼎利测试软件Pilot Pioneer时,最让我头疼的就是密密麻麻的工具栏图标。但用久了才发现,这些看似复杂的按钮其实是提升效率的"快捷键"。先说说最上方的自定义快速访问工具栏,这个区域就像手机桌…...
Qwen3-ForcedAligner在嵌入式设备上的轻量化部署
Qwen3-ForcedAligner在嵌入式设备上的轻量化部署 1. 引言 语音识别技术正在从云端走向边缘,越来越多的应用场景需要在资源受限的嵌入式设备上实现实时语音处理。传统的强制对齐方案往往需要强大的计算资源,这在嵌入式环境中成为了一个巨大的挑战。 Qw…...
CUDA中Shared Memory的Bank Conflict
1. 核心概念引入 (What & Why)笔记的开头需要明确 Shared Memory 的物理结构,这是理解冲突的前提。Shared Memory 的组织方式: CUDA 的共享内存被划分为 32 个大小相等的内存块,称为 Banks(存储体)。Bank 的宽度&a…...
科学发表的组学多面板图组装
摘要 高效的图件能清晰传达研究数据与结果,而组装用于科学发表的组学多面板图是项耗时且易出错的工作,往往需要专业的软件和操作技能,目前尚无1款可快速高效组装复杂组学多面板图的专用工具。本研究开发了1款操作友好…...
