首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

React 为什么重新渲染

更新(重新渲染)是 React 的重要特性 —— 当用户与应用交互的时候,React 需要重新渲染、更新 UI,以响应用户的输入。但是,React 为什么会重新渲染呢?...如果不知道 React 为什么会重新渲染,我们如何才能避免额外的重新渲染呢? TL; DR 状态改变是 React 树内部发生更新的唯二原因之一。 这句话是 React 更新的公理,不存在任何例外。...为了避免有人抬杠,这句话引入了一些限制定语和关键词: 名词解释 「更新」和「重新渲染」 在 React 中,「更新」和「重新渲染」是关系紧密,但是含义完全不同的两个词。...本文接下来的部分中,「重新渲染」一律指代 React 组件在「更新」时的「渲染」阶段,而「更新」则一律指代(重新)渲染、Reconcilation 和 Commit 整个过程。...如果你去问一些使用 React 的开发者「为什么 React 会更新/重新渲染」,大概会得到这个答案。这句话不无道理,但是并不能反应真实的 React 更新机制。

1.7K30

基础 | React怎么判断什么时候该重新渲染组件?

不是重新渲染DOM节点,只是调用render方法来改变虚拟DOM。我们可以通过告诉React什么时候需要渲染什么时候不需要渲染来帮助React。让我们依次来看看这些。 1....组件获得新的状态然后React决定是否应该重新渲染组件。不幸的是,React难以置信简单地将默认行为设计为每次都重新渲染。 组件改变?重新渲染。父组件改变?重新渲染。...但是重新渲染的时间成本看起来非常昂贵(例子里非常夸张地表现了出来)。 是的,在不必要的时候重新渲染会浪费循环并且不是一个好的想好。...但是,React不能知道什么时候可以安全的跳过重新渲染,所以React无论是否重要每次都重新渲染。 我们如何告诉React跳过重新渲染? 那就是第二点要说的内容。...但是你可以在需要优化性能时重写这个方法来让React更智能。比起让React每次都重新渲染,你可以告诉React你什么时候不像触发重新渲染。

2.9K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    React Memo不是你优化的第一选择

    当color变化时,ColorPicker会重新渲染。但是它仍然保存着上一次从App中拿到的相同的children属性,所以React并不会访问那棵子树。...即使颜色发生变化,ExpensiveComponent也不会随之重新渲染。 上面两种解法,都是利用「组件组合」,从而避免重复渲染。下面,我们采用React.memo的语法,看看会发生啥。...❝当一个组件被Memo处理后,React将使用Object.is比较「每个prop」。如果它们没有发生变化,就可以跳过重新渲染。...替代方案 因此,使用React.memo有一些潜在问题,但有时,似乎我们无法避免对一个组件进行记忆化处理。那是否又一个折中的方案来解决这种问题呢?有!!...它们将状态存储在React之外,并「有针对性地触发需要更改的组件树部分的重新渲染」。像React Query /zustand/Recoil都是这么做的。

    46630

    React 19 差点拖慢整个互联网!核心团队紧急叫停

    但除了种种闪亮新功能与开发体验改进之外,另有一处小变化直到上周才引起大家的关注和重视,这个小变化有可能显著降低不少依赖 React 的网站的性能表现。...从评论来看,客户端组件似乎确实出了这个问题,但并行获取在 RSC 中仍然有效。这毁掉了 react-query,让人没法好好用 React 管理数据。我希望大家能尽量理性讨论,但估计不太现实。”...Dominik 说道,“除了 React 核心团队之外,我还没见过任何人支持这项调整。目前 19.0.0 版本尚未正式发布,也许还有一丝希望能让他们重新考虑此事。”...“如果我理解正确,现在大家似乎不能再轻松地组合数据需求了,除非使用复杂的预取技巧。否则就必须将所有数据获取提升到公共父组件。...理想的解决方案应该是进行一次重构,以便能够追踪多个正在加载的组件而无需额外的重新执行,这样可以同时获得这两种方式的优势。

    48310

    你真的应该使用useMemo 吗? 让我们一起来看看

    useMemo 是 React 提供的一个hook 函数。这个钩子允许开发人员缓存变量的值和依赖列表。如果此依赖项列表中的任何变量发生更改,React 将重新运行此数据的处理并重新缓存它。...如果依赖项列表中的变量值之前已经缓存过,则 React 将从缓存中获取值。 这主要是对组件的重新呈现有影响。一旦组件重新呈现,它将从缓存中提取值,而不必一次又一次地循环数组或处理数据。...复杂度 n = 100的结果 在复杂度为100的情况下,使用 useMemo 的初始渲染变慢了62% ,这是一个相当大的数量。后续的重新投票似乎平均要稍微快一点或者差不多。...总之,复杂度为100的初始渲染显著地慢,而随后的重新渲染相当类似,最多只是稍微快一点。在这一点上,useMemo 似乎还没有什么意思。...是否应该使用 useMemo 将在很大程度上取决于您的用例,但是由于复杂度小于100,useMemo 似乎没什么意思。 值得注意的是,useMemo 最初的渲染在性能方面遭受了相当大的挫折。

    1.2K30

    Flutter系列(一)——详细介绍

    富有表现力和灵活的UI 快速发布聚焦于原生体验的功能。分层的架构允许您完全自定义,从而实现难以置信的快速渲染和富有表现力、灵活的设计。...所以您可以在应用程序中各个页面快速迭代开发,而无需在每次重新加载后都要从主屏幕重新开始。...UI跨平台稳定 Google直接在两个平台上在底层重写了UIKit,不依赖于Css等外部解释器,几乎不存在UI表达不理想,渲染不正常的情况,可以获得非常稳定的UI表达效果。...Css换个浏览器就有不同的表现,基于Css的跨平台框架很难获得稳定的UI表现。 可选静态的语言,语言特性优秀 Dart是一个静态语言,这也是相对于js的一个优势。...最后 当然,Flutter也有一些不足,还有和React Native的比较我会在下一篇文档当中详细介绍介绍。

    1.1K30

    Flutter系列(一)——详细介绍

    富有表现力和灵活的UI 快速发布聚焦于原生体验的功能。分层的架构允许您完全自定义,从而实现难以置信的快速渲染和富有表现力、灵活的设计。...所以您可以在应用程序中各个页面快速迭代开发,而无需在每次重新加载后都要从主屏幕重新开始。...UI跨平台稳定 Google直接在两个平台上在底层重写了UIKit,不依赖于Css等外部解释器,几乎不存在UI表达不理想,渲染不正常的情况,可以获得非常稳定的UI表达效果。...Css换个浏览器就有不同的表现,基于Css的跨平台框架很难获得稳定的UI表现。 可选静态的语言,语言特性优秀 Dart是一个静态语言,这也是相对于js的一个优势。...最后 当然,Flutter也有一些不足,还有和React Native的比较我会在下一篇文档当中详细介绍介绍。

    1.4K10

    【译】你真的应该使用useMemo吗? 让我们一起来看看

    useMemo 是 React 提供的一个 hook 函数。这个钩子允许开发人员缓存变量的值和依赖列表。如果此依赖项列表中的任何变量发生更改,React 将重新运行此函数去处理并重新缓存它。...如果依赖项列表中的变量值没有改版,则 React 将从缓存中获取值。 useMemo 主要是对组件的重新渲染有影响。一旦组件重新渲染,它将从缓存中提取值,而不必一次又一次地循环数组或着处理数据。...重新渲染触发机制 为了保持结果的清晰,我们总是在开始测试之前从一个新的浏览器页面开始(除了重新渲染) ,来排除任何可能浏览器缓存。...在这一点上,useMemo 似乎还没有起到作用。 复杂度 n = 1000 的结果 由于复杂度为 1000,使用 useMemo 的初始渲染变慢了 183% ,后续渲染大约快 37% !...总结 是否应该使用 useMemo 将在很大程度上取决于您的用例,如果复杂度小于 100,useMemo 似乎没什么意思。 值得注意的是,useMemo 最初的渲染在性能方面遭受了相当大的开销。

    2.1K10

    告别 React,拥抱 Svelte:21天重写应用,开发速度翻倍代码量减半!

    通过对比 Svelte 与 React 在性能、开发速度及开发者满意度等方面的表现,作者认为 Svelte 具有成为新项目首选框架的潜力,并分享了自己对 Svelte 的独特见解与热切期待。...我们本以为自己很喜欢 React,但事实是,Jen 和我经常在午餐时抱怨 React 生态系统的各个方面。并不是说 React 不好,它真的很棒!只是相较于它的潜力,使用它的乐趣似乎没有那么大。...它给人的感觉就像是充分利用了标准技术,而不是像许多框架那样重新实现它们。 事实上,学习起来如此轻松,以至于我经常觉得我是在“回忆”如何使用 Svelte,而不是重新学习。我会感叹:“噢!...然而,Sveltekit 在支持服务器端渲染、预渲染(静态站点)以及客户端渲染方面表现出色,它甚至允许我们在站点的不同部分混合使用这些渲染方式。...然而,对于搜索引擎无法索引的登录保护数据,我认为服务器端渲染并不具备太多优势。它似乎是在优化错误的方向。 鉴于 Svelte 无论采用哪种渲染模式都表现得非常迅速,我并不打算在此问题上过多纠结。

    31511

    【调试】ChromeDevTool高级调式

    我们来看看内涵图: 网页动画能够做到每秒60帧,就会跟显示器同步进行刷新,一秒之内进行60次重新渲染,每次重新渲染的时间不能超过16.66毫秒(1s/1000=16.66毫秒)。...: window.requestAnimationFrame()下一次重新渲染时, 以及window.requestIdleCallback()下几次重新渲染时。...用户访问的过程总还会不断重新渲染。...以下三种情况,会导致网页重新渲染: (1)修改DOM (2)修改样式表 (3)用户事件 注释: 重新渲染,就需要重新生成布局(俗称“重排”reflow)和重新绘制(俗称“重绘”repaint)...好处:外部缓存软件有着良好的缓存过期淘汰策略以及自有的内存管理,不影响Node主进程的性能。减少内部常驻内存的对象数量垃圾回收更高效率,进程间共享缓存。

    24020

    React + Express实现极简SSR的原理

    更新部署更新可能需要重新部署服务器端代码。更新通常只需要替换静态文件。可维护性需要维护服务器和客户端两套代码,可能增加维护成本。只需维护客户端代码,维护相对简单。...> `);});但是,我们似乎忽略了一个问题...,一个网页是需要有交互的,比如onClick等时间,服务端直出dom似乎会”忘掉”这些,那么怎么办呢?...其大致的流程如下,其目的就是让页面重新变的可交互。当然, 在 hydration 过程中,React 会对比服务器渲染的 HTML 和 React 组件树。...然而,React 假设服务器端和客户端渲染的输出是一致的,如果不一致,可能会导致 hydration 错误。这就是实现 React SSR 的基本步骤。

    67340

    IM跨平台技术学习(十三):从理论到实践,详细对比Electron和Tauri的优劣

    类似于 NW.js,表面上,它们似乎非常相似,但是这两个项目有本质上的区别,使得 Electron 和 NW.js 成为两个完全独立的产品。...多进程架构:Electron 也是如此,作为应用开发者,控制着两种类型的进程,主进程和渲染进程:1)主进程负责应用程序窗口管理,应用程序的生命周期,原生API等;2)渲染进程负责UI的展示,这部分可以选择任意前端框架...大多数现代 Web 浏览器都为多进程架构,主要有浏览器主进程、渲染进程、插件进程、网络进程、GPU 进程,Chromium 也是如此。...Election 注册快捷键:在 Tauri 中,得益于 JS API 的便利性,在渲染进程中就可以注册,因此只需要在 React 生命周期中执行注册。...Tauri 表现不错,前景较好。

    38310

    2024年虚拟DOM技术将何去何从?

    不同框架的应对策略 Uber:例如Uber,通过广泛且手动使用shouldComponentUpdate来最小化渲染调用。 React Fiber:React 16引入了React Fiber。...这种响应式并非指React中的虚拟DOM基于状态变化进行修改和重新渲染,而是指Solidjs和Svelte在数据层面上具有更细粒度的响应。相比之下,React是在组件层面上进行响应的。...这种方法减少了不必要的组件更新和重新渲染,从而提高了性能。 例如,在Solidjs中,当一个状态值改变时,只有依赖于这个状态的部分会重新计算和渲染,而不会影响其他不相关的组件或状态。...在DOM操作时间方面,Solid似乎表现更佳,而Svelte在内存使用和启动时间方面有更好的数据。...国外大佬 Ryan Carniato在他的研究《DOM渲染的最快方法》一文中,使用标签模板和HyperScript作为Solid的渲染模板,并将其与其他在js-framework-benchmark上表现良好的

    54610

    React Hooks 底层解析

    一想到 hooks 时它们似乎是某种魔法,React 以某种甚至不用暴露其实例(起码没有用到这个关键词)的手段管理了你的组件。那么 React 究竟捣了什么鬼呢?...马上为你介绍一个新概念: hooks 队列 在帷幕之后,hooks 表现为以其调用顺序被链接在一起的节点(nodes)。它们之所以表现成这样是因为 hooks 并非被简单的创建后就独自行事了。...我想请你在深入其实现之前记住一个 hook 的若干属性: 其初始状态是在初次渲染中被创建的 其状态可以被动态更新 React 会在之后的渲染中记住 hook 的状态 React 会按照调用顺序提供给你正确的状态...React 知道该 hook 是属于哪个 fiber 的 相应的,我们需要重新思考我们看待一个组件的状态的方式了。...hooks 时应将其视作一个队列,其每个节点都表现为一个单个的状态模型: //react-state-new.js { memoizedState: 'foo', next: { memoizedState

    77610

    web前端学习:React是什么,为什么要使用它?

    React发源自Facebook的PHP框架XHP的一个分支。XHP作为一个PHP框架,旨在每次有请求进来时渲染整个页面。...react的产生就是为了把这种重新渲染整个页面的PHP式工作流带到客户端应用中来。 React本质上只关心两件事:     1.更新DOM;     2.响应事件。   ...React的精简允许你将它集成到各种各样的系统中 。   每次状态改变时,使用JavaScript重新渲染整个页面会非常慢,这应该归咎于读取和更新DOM的性能问题。...React运用一个虚拟的DOM实现了一个非常强大的渲染系统,在React中对DOM只更新不读取。 工作状态:  React以渲染函数为基础。这些函数读入当前的状态,将其转换为目标页面上的一个虚拟表现。...只要React被告知状态有变化,他就会重新运行这些函数,计算出页面的一个新的虚拟表现,接着自动把结果转换成必要的DOM更新来反映新的表现。

    61620

    Immutable.js 到底值不值得用?

    我们准备利用这个库来实现数据的表现方式,加强数据的不可变性(immutability),以此为开始,建立起面向功能的编程模式。这篇帖子就是要对其进行一次审视。...要将程序状态(app state)渲染成网页,我们得把状态数据从Redux的存储对象(store)中转移到React组件里去。...不可变数据类型取而代之,能始终精确表现当前存储对象(store)中存储的程序状态(app state)。 有了这个库,我们就能发挥上述不可变数据类型的优点,似乎没什么不好的。...数据有更新,组件才会通过React生命周期触发重渲染。这使Redux库能选择性地渲染React框架组件,提升性能。...换句话说,任何行为(action)发动时,每个用connect()函数修饰的元素以及子元素都会被重新渲染过。

    2K50

    React入门学习(四)-- diffing 算法

    大家好,我是小丞同学,一名大二的前端爱好者 这篇文章将尽力说明白 diff 算法 愿你忠于自己,热爱生活 前言 diff 算法是 React 提升渲染性能的一种优化算法,在 React...中有着很重要的地位,也不止于 React ,在 Vue 中也有 diff 算法,似乎没有差别。...它是一种编程概念,在这个概念里,以一种虚拟的表现形式被保存在内存中。...当节点在同一层级时,diff 提供了 3个节点操作方法:插入,移动,删除 当我们要完成如图所示操作转化时,会有很大的困难,因为在新老节点比较的过程中,发现每个节点都要删除再重新创建,但是这只是重新排序了而已...首先在 React 中只允许节点右移 因此对于上图中的转化,只会进行 A,C 的移动 则只需要对移动的节点进行更新渲染,不移动的则不需要更新渲染 为什么不能用 index 作为 key 值呢?

    94310
    领券