React面试经验2

1.执行顺序题

onClick = () => {//athis.setState({num: this.state.num + 1,})console.log('1:',this.state.num);//bthis.setState({num: this.state.num + 1,})console.log('2:',this.state.num);setTimeout(() => {//cthis.setState({num: this.state.num + 1,});console.log('3:',this.state.num);}, 0);//dthis.setState(preState => ({num: preState.num + 1,}),() => {console.log('4:',this.state.num);})//ethis.setState(preState => ({num: preState.num + 1,}))console.log('5:',this.state.num);
}

此处注意点:1.同步与异步更新
2.setState传递参数为函数时不会被合并

1.console.执行顺序
1,2,5,4,3
(4,3是什么原因)
值的更新
a,b合并,并且都是异步,所以打印更新前的值
de不合并,都能获取到

题2

async function async1(){console.log('async1 start');let res = await async2();console.log(res);console.log('async1 end');
}async function async2(){console.log('async2 start');return 'async2 end'
}console.log('script start');
setTimeout(() => {console.log('setTimeout');
}, 0);
async1();
new Promise((resolve,reject) => {console.log('Promise start');resolve();
}).then(() => {console.log('Promise end');
})
console.log('script end');

注意,async函数的return内容会被Promise.resolve包装

diff算法的区别

区别:

策略不同: React 使用双端比较策略,而 Vue 使用双指针或同层比较策略。

节点复用: Vue 更注重节点的复用,尽可能地复用相同类型的节点,而 React 则更倾向于替换整个节点。

性能差异: 由于实现策略不同,React 和 Vue 的 diff 算法在性能上可能会有所不同,但具体的性能差异会受到多种因素的影响,如虚拟 DOM 树的大小、节点的层级结构等。

总的来说,React 和 Vue 的 diff 算法都是为了实现高效的页面更新,它们在实现上有一些差异,但都能够很好地满足前端开发的需求

相比于 class 类组件,hooks 到底解决了什么问题?

1.较好地解决了class组件中逻辑复用的问题
2.实现生命周期管理
3.useMemo和useCallback等提供了性能优化

useState 的原理是什么,背后怎么执行的,它怎么保证一个组件中写多个 useState 不会串

useState 是 React 用于在函数组件中添加状态的 Hook。在 React 16.8 版本中首次引入 Hooks 后,useState 成为了在函数组件中管理局部状态的首选方法。下面我们来详细了解 useState 的原理和执行机制:

原理

  1. 声明式编程:React Hooks 允许你在函数组件中以声明的方式使用状态和其他 React 特性,而不是通过类组件和生命周期方法。

  2. 状态存储:当你在一个函数组件中调用 useState,React 会为这个组件创建一个状态变量。这个状态变量被存储在组件的内部状态环境中。

  3. 状态更新useState 返回一个数组,包含当前的状态值和一个更新该状态的函数。当你调用这个函数并传递一个新的状态值时,React 会计划一个状态更新,并在下一个渲染周期重新渲染组件。

执行机制

  1. 首次渲染:在函数组件的首次渲染中,useState 被调用,React 创建对应的状态变量,并将其初始化为传递给 useState 的参数值。

  2. 后续渲染:在后续的渲染中,当组件需要重新渲染时(可能是因为状态更新、条件变化、props 更改等),useState 返回的状态变量和更新函数会保持不变。

  3. 状态更新:当更新函数被调用时,React 会将新的更新加入一个队列。在当前渲染周期结束后,React 会处理这个队列中的所有更新,并决定哪些组件需要重新渲染。

多个 useState 的管理

  1. 独立状态:在同一个组件中使用多个 useState 调用,每个调用都会创建一个独立的、完全分离的状态变量。这些状态变量互不影响。

  2. 状态标识:React 通过内部机制为每个 useState 调用生成一个唯一的标识,即使它们在同一个组件中,也能确保不会混淆。

  3. 渲染顺序:React 保证了组件内部 useState 调用的顺序与它们在代码中的声明顺序相匹配。这意味着,即使有多个状态变量,它们也会按照你在代码中声明的顺序被初始化和更新。

sessionStorage 不能在多个窗口或标签页之间共享数据,但是当通过 window.open 或链接打开新页面时(不能是新窗口),新页面会复制前一页的 sessionStorage。

fiber

React 和 Vue 是两个流行的前端 JavaScript 库,它们都用于构建用户界面,并且都采用了虚拟 DOM(Virtual DOM)的概念来提高性能。不过,React 16 引入了 Fiber 架构,这是一种重新实现的虚拟 DOM 算法,它为 React 带来了一些显著的改进。以下是 React 的 Fiber 与 Vue 的虚拟 DOM 之间的一些关键区别:

异步更新(Async Updates)

React Fiber:

  • React 的 Fiber 架构允许组件更新变得可中断和可恢复。这意味着 React 可以将更新过程分成小块,允许浏览器在每个小段之间进行渲染,从而提高性能并避免长时间的阻塞。
  • 这种异步更新机制使得 React 能够实现时间切片(time slicing),从而更好地控制更新的执行时机,提供更平滑的用户体验。

Vue Virtual DOM:

  • Vue 的虚拟 DOM 更新通常是同步的。当数据变化时,Vue 会立即触发相应的视图更新。
  • 虽然 Vue 2.0 引入了异步批处理来提高性能,但它并不像 React Fiber 那样在算法层面支持更新的中断和恢复。

性能优化

React Fiber:

  • Fiber 架构的主要目标是提高大型应用的性能,尤其是在处理大量组件和复杂更新时。
  • React 的时间切片功能允许应用在高负载时仍能保持响应,例如在滚动或动画过程中。

Vue Virtual DOM:

  • Vue 的虚拟 DOM 优化主要侧重于减少不必要的 DOM 操作,通过高效的差异比较算法来更新实际的 DOM。
  • Vue 也提供了一些性能优化手段,如 key 的使用、计算属性、懒加载等,但它们与 React Fiber 的异步更新机制不同。

组件生命周期

React Fiber:

  • React 的 Fiber 架构引入了新的生命周期方法,如 getSnapshotBeforeUpdategetDerivedStateFromError,以及对现有生命周期方法的一些更改。
  • 由于更新的异步性,React 的生命周期方法的行为可能与之前的版本有所不同。

Vue Virtual DOM:

  • Vue 提供了明确定义的组件生命周期钩子,如 createdmountedupdateddestroyed
  • Vue 的生命周期钩子通常在虚拟 DOM 的更新过程中的不同阶段被调用,且这些钩子的执行是同步的。

源码实现

React Fiber:

  • Fiber 的实现相对复杂,它使用了一个循环的数据结构来表示组件的更新过程,这使得 React 能够更精细地控制组件的渲染和副作用处理。

Vue Virtual DOM:

  • Vue 的虚拟 DOM 实现较为简洁,它使用了一个递归的树状结构来表示组件和元素。

总结

React 的 Fiber 架构和 Vue 的虚拟 DOM 都是为提高性能而设计的,但它们在实现细节和提供的优化机制上存在一些差异。React Fiber 通过异步更新和时间切片来优化大型应用的性能,而 Vue 则侧重于减少不必要的 DOM 操作和提供一系列生命周期钩子来进行性能优化。开发者可以根据项目需求和个人偏好选择合适的库。

在react15及之前是没有fiber的,react执行一次更新操作都是同步的,他是通过递归去进行更新,一旦开始就不会中断直到结束。这也就造成了页面性能的低下,体验非常差。
而fiber的出现,他将更新渲染耗时长的大任务变成很多小切片,小切片执行完后就去执行高优先级的任务,比如:用户点击输入等等,将不可中断的渲染变成可中断的渲染,提高了页面的流畅度和性能。
有了fiber,React 渲染的过程可以被中断,可以将控制权交回浏览器,让位给高优先级的任务,浏览器空闲后再恢复渲染。它采用的是一种主动让出机制。(可以由游览器给我们分配执行时间片,通过requestIdleCallback实现

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

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

相关文章

将矩阵按对角线排序(Lc1329)——排序

矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线,沿右下方向一直到矩阵末尾的元素。例如,矩阵 mat 有 6 行 3 列,从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]、mat[3][1] 和 mat[4][2] 。 给你一个 m * n 的整…

DevEco:智能、灵活、实时的集成开发环境

引言 前端性能是一个老生常谈的话题了,它不单单是一个技术概念,而是用户体验中非常重要的一环。通常在一些面向用户的产品中它直接影响了用户转化率、粘性等重要指标。 那么是不是不在乎转化率的中后台产品就可以不在乎性能了?显然不是&…

API接口开发实现一键智能化自动抓取电商平台商品评论数据支持高并发免费接入示例

为了实现一键智能化自动抓取电商平台商品评论数据可支持高并发免费接入,你可以使用Python编程语言和相关库(如requests、BeautifulSoup等)来开发一个API接口,也可以使用封装好的api接口获取,注册一个api账号获取key和s…

超详细的胎教级Stable Diffusion使用教程(一)

这套课程分为五节课,会系统性的介绍sd的全部功能和实操案例,让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion,它究竟有多强大? 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

星途重启:244亿公里外的「旅行者1号」,修好了

2024年4月20日,旅行者1号工程团队时隔5个月,终于重新收到了来自47年前所发射的探测器传回的有效数据。 ▲收到数据当天,工程团队成员在NASA喷气动力实验室的会议室中欢呼。 01.关于旅行者1号 在当下5G和WIFI已经普及的时代,NASA喷…

【QT教程】QT6硬件数据库编程 QT硬件数据库

QT6硬件数据库编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免…

Oracle中blob和clob的区别和例子

在Oracle数据库中,BLOB(Binary Large Object)和CLOB(Character Large Object)是用于存储大量数据的两种大型对象(LOB)类型,但它们之间存在一些关键的区别。 数据存储方式&#xff1…

FFmpeg常用API与示例学习(二)

封装层 封装格式(container format)可以看作是编码流(音频流、视频流等)数据的一层外壳,将编码后的数据存储于此封装格式的文件之内。 封装又称容器,容器的称法更为形象,所谓容器,就是存放内容的器具,饮料是内容&…

vue3速览

在您的Vue.js 3应用中,createApp 是用于创建一个Vue应用实例的函数。您已经正确地引入了它并开始创建应用,但目前根组件内部是空的。下面我将为您展示一个更完整的例子,说明如何设置根组件的模板、数据、方法等选项,并挂载到DOM上…

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用(7)

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用(7) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力&a…

Python | Leetcode Python题解之第71题简化路径

题目: 题解: class Solution:def simplifyPath(self, path: str) -> str:names path.split("/")stack list()for name in names:if name "..":if stack:stack.pop()elif name and name ! ".":stack.append(name)re…

W801学习笔记二十四:NES模拟器游戏

之前已经实现了NES模拟器玩游戏。W801学习笔记九:HLK-W801制作学习机/NES游戏机(模拟器) 现在要在新版本掌机中移植过来。 1、把NES文件都拷贝到SD卡中。 这回不会受内存大小限制了。我这里拷贝了4个,还可以拷贝更多。 2、应用初始化中,加载…

React 学习-7-组件API

设置状态:setState setState(object nextState[, function callback]) nextState,将要设置的新状态,该状态会和当前的state合并 callback,可选参数,回调函数。该函数会在setState设置成功,且组件重新渲染后调用。 替…

FFmpeg常用API与示例学习(一)

工具层 1.av_log 可以设置日志的级别,这个看看名字就明白了,也不用过多的解释。 AV_LOG_PANICAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUG void test_log() {/ av_register_all();AVFormatContext *pAVFmtCtx NU…

如何使用 await-to-js 库优雅的处理 async await 错误

通过阅读优秀的源码并从中学习如何写出让人觉得赏心悦目的代码最后再写文章进行总结对整个学习的过程进行一个梳理同时分享给其他人。 JS 异步编程进化之路 回调地狱阶段 在正式介绍 await-to-js 这个库之前,让我们先简单的回顾一下有关于在 JavaScript 这门语言…

ctfshow web入门 php反序列化 web275--web278(无web276)

web275 这道题和序列化一点关系都没有 整个代码并没有说filename(f)怎么传参只有fn并且屏蔽了flag highlight_file(__FILE__);class filter{public $filename;public $filecontent;public $evilfilefalse;public function __construct($f,$fn){$this->filename$f;$this-&g…

bash: docker-compose: 未找到命令

bash: docker-compose: 未找到命令 在一台新的服务器上使用 docker-compose 命令时,报错说 docker-compose 命令找不到,在网上试了一些安装方法,良莠不齐,所以在这块整理一下,如何正确快速的安装 docker-compose cd…

STM32入门周边知识(为什么要装MDK,启动文件是什么,为什么要配置时钟等等)

目录 MDKMDK与C51共存为什么要安装MDK 启动文件是什么,为什么要添加许多文件为什么要添加头文件路径为什么是寄存器配置魔术棒中的define为什么必须先配置时钟杂例 MDK MDK与C51共存 在最开始学习51单片机的时候,当时安装keil的时候,认为就是…

Web实时通信的学习之旅:WebSocket入门指南及示例演示

文章目录 WebSocket的特点1、工作原理2、特点3、WebSocket 协议介绍4、安全性 WebSocket的使用一、服务端1、创建实例:创建一个webScoket实例对象1.1、WebSocket.Server(options[,callback])方法中options对象所支持的参数1.2、同样也有一个加密的 wss:/…

C++ NetworkToHostOrder、HostToNetworkOrder 模板函数

其作用类型&#xff1a;ntohl、htonl、ntohs、htons 函数的作用&#xff0c;因为要考虑兼容 int128、int64 等数据类型。 IPV6 肯定是 int128 了&#xff0c;使用这两个函数可以帮助人们计算IPV6的地址范围等。 template <class T> static T …