当前位置: 首页 > news >正文

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设置代理并发送爬虫请求时&#xff0c;发现部分url请求没有走代理直接和目标url建立了连接&#xff0c;伪代码如下。初始化okhttpClient时设置了proxySelecter代理&#xff0c;但是调用okhttpClient.newCall请求时并没用调用proxySelecter.select函数获取代…...

python moviepy 自动化音视频处理实践

MoviePy是一个用于视频编辑的Python库。它提供了一种简单且直观的方式来处理视频文件&#xff0c;包括剪辑、合并、裁剪、添加文本、添加音频等操作。使用MoviePy&#xff0c;你可以通过编写Python代码来创建和编辑视频&#xff0c;而无需使用复杂的视频编辑软件。 MoviePy建立…...

聊聊混合动力汽车和纯电骑车的优势和劣势

混合动力汽车和纯电动骑车是两种不同的交通工具&#xff0c;它们都有各自的优势和劣势。本文将分别探讨混合动力汽车和纯电动骑车的优势和劣势&#xff0c;并为文章提供三个备选的好听的标题。 混合动力汽车是一种结合了内燃机和电动机的汽车&#xff0c;它可以同时利用燃油和电…...

算法训练Day39|62.不同路径 ● 63. 不同路径 II

LeetCode:62.不同路径 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 1.思路 想象成矩阵填格子&#xff0c;两个关键点&#xff0c;初始化和递推公式。 初始化除点&#xff08;0&#xff0c;0&#xff09;第一行第一列均为1&#xff0c;递推公式推导dp[i][j] dp[i …...

react中hooks分享

一. HOOKS是什么 在计算机程序设计中&#xff0c;钩子一词涵盖了一系列技术&#xff0c;这些技术用来通过拦截函数调用、消息或在软件组件之间传递的事件来改变或增加操作系统、应用程序或其他软件组件的行为。处理这些被截获的函数调用、事件或消息的代码称为“hook”。 在r…...

LeetCode1207. 独一无二的出现次数

题干 给你一个整数数组 arr&#xff0c;请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的&#xff0c;就返回 true&#xff1b;否则返回 false。 示例1&#xff1a; 输入&#xff1a;arr [1,2,2,1,1,3] 输出&#xff1a;true 解释&#xff1a;在该…...

【maven】构建项目前clean和不clean的区别

其实很简单&#xff0c;但是百度搜了一下&#xff0c;还是没人能简单说明白。 搬用之前做C项目时总结结论&#xff1a; 所以自己在IDE里一遍遍测试程序能否跑通的时候&#xff0c;不需要clean&#xff0c;因为反正还要改嘛。 但是这个项目测试好了&#xff0c;你要打成jar包给…...

Stable Diffusion 硬核生存指南:WebUI 中的 CodeFormer

本篇文章聊聊 Stable Diffusion WebUI 中的核心组件&#xff0c;强壮的人脸图像面部画面修复模型 CodeFormer 相关的事情。 写在前面 在 Stable Diffusion WebUI 项目中&#xff0c;源码 modules 目录中&#xff0c;有一个有趣的目录叫做 CodeFormer&#xff0c;它就是本文的…...

从零开始理解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 中的 目标状态&#xff0c;而 De…...

sk_buff操作函数学习

一. 前言 内核提供了大量实用的操作sk_buff的函数&#xff0c;在开发网络设备驱动程序和修改网络协议栈代码时需要用到。这些函数从功能上可以分为三类&#xff1a;创建&#xff0c;释放和复制socket buffer&#xff1b;操作sk_buff结构中的参数和指针&#xff1b;管理socket b…...

conda create时候出现JSONDecoderError解决方法

起因是我的conda出现了JSONDecoderError&#xff0c;这个我搜了一下是因为某些配置文件错误&#xff0c;所以让我update conda&#xff0c;于是我先用了下面的指令&#xff1a; conda update conda 但是在执行过程中依然会出现 JSONDecoderError的问题&#xff0c;后来参考了这…...

Electron 工具进程utilityProcess 使用中遇到的坑点汇集

简介 这是基于 node.js 中的子进程的概念推出来的&#xff0c;可参考链接&#xff1a;utilityProcess | Electron 官网有一句话非常重要&#xff0c;它提供一个相当于 Node.js 的 child_process.fork API&#xff0c;但使用 Chromium 的 Services API 代替来执行子进程。这句话…...

JdbcTemplate

目录 1、简介 2、开发步骤 2.1、导入坐标 2.2、创建表和类 2.3、创建JdbcTemplate对象 2.4、执行数据库操作 3、解耦 4、增删改查 ⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹…...

PROFINET转TCP/IP网关profinet网线接头接法

大家好&#xff0c;今天要和大家分享一款自主研发的通讯网关&#xff0c;捷米JM-PN-TCPIP。这款网关可是集多种功能于一身&#xff0c;PROFINET从站功能&#xff0c;让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗&#xff1f;一起来看看吧&…...

【FPGA IP系列】FIFO的通俗理解

FPGA厂商提供了丰富的IP核&#xff0c;基础性IP核都是可以直接免费调用的&#xff0c;比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识&#xff0c;帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out&#xff0c;即先进先出。 FIFO是一个数…...

Kylin v10基于cephadm工具离线部署ceph分布式存储

1. 环境&#xff1a; ceph&#xff1a;octopus OS&#xff1a;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代码要经历的三个阶段 反射&#xff0c;程序框架设计的灵魂&#xff0c;将类的各个组成部分封装成其他对象&#xff0c;这就是反射机制。 框架&#xff1a;半成品的软件&#xff0c;在框架的基础上进行开发&#xff0c;可以简化编码 反射的好处&#xff1a; 可以在…...

【使用bat脚本实现批量创建文件夹、批量复制文件至对应文件夹中】

使用bat脚本实现批量创建文件夹、批量复制文件至对应文件夹中 常用cmd命令 场景一&#xff1a;在指定位置批量创建文件夹 在桌面创建一个txt文件编写创建目录代码 //在桌面"五保户结算单"的文件夹下创建名称为"1张三"的文件夹 md E:\桌面\五保户结算单\…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...