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

为什么useState让组件渲染两次?

useState是React中的一个Hook,用于在函数组件中添加状态。当使用useState时,组件会在初始渲染时和每次状态更新时重新渲染两次的原因是由于React的工作机制。

首先,useState返回一个包含状态值和更新状态值的数组。当调用更新状态值的函数时,React会将新的状态值存储起来,并且触发组件的重新渲染。

其次,React使用一种称为"调和"的机制来更新组件。当组件重新渲染时,React会比较前后两次渲染的虚拟DOM树,找出变化的部分,并将其更新到实际的DOM中。这个过程称为"调和"。

在使用useState时,每次调用更新状态值的函数,React会将新的状态值与之前的状态值进行比较,如果两者不相等,React会认为状态发生了变化,触发组件的重新渲染。因此,当调用更新状态值的函数时,组件会重新渲染一次。

需要注意的是,由于React的调和机制,即使状态值没有发生变化,组件也可能会重新渲染。这是因为在组件树中的其他部分发生了变化,导致整个组件树需要重新渲染。

总结起来,useState让组件渲染两次的原因是因为:

  1. 初始渲染:组件首次渲染时,useState会返回初始状态值,并触发一次渲染。
  2. 状态更新:每次调用更新状态值的函数时,useState会返回新的状态值,并触发一次渲染。

这种行为是React的设计决策,旨在保证组件的可预测性和一致性。如果希望避免组件渲染两次,可以使用React的性能优化技术,如使用useMemo和useCallback来避免不必要的重新计算和函数创建。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

问:React的useState和setState到底是同步还是异步呢?

,连续执行两次同一个 useState 示例function Component() { const [a, setA] = useState(1) console.log('a', a) function...setState 合并,只执行了最后一次,打印 2当点击异步执行按钮时,两次 setState 各自 render 一次,分别打印 2,3这里跟useState不同,同步执行时useState也会对state...进行逐个处理,而setState则只会处理最后一次为什么会有同步执行和异步执行结果不同呢?...首先,为什么需要合并更新呢?如果没有合并更新,在每次执行 useState 的时候,组件都要重新 render 一次,会造成无效渲染,浪费时间(因为最后一次渲染会覆盖掉前面所有的渲染效果)。...是异步执行的(不会立即更新state的结果)多次执行setState和useState,只会调用一次重新渲染render不同的是,setState会进行state的合并,而useState则不会在setTimeout

2.1K10
  • React的useState和setState到底是同步还是异步呢?

    ,连续执行两次同一个 useState 示例function Component() { const [a, setA] = useState(1) console.log('a', a) function...setState 合并,只执行了最后一次,打印 2当点击异步执行按钮时,两次 setState 各自 render 一次,分别打印 2,3这里跟useState不同,同步执行时useState也会对state...进行逐个处理,而setState则只会处理最后一次 为什么会有同步执行和异步执行结果不同呢?...首先,为什么需要合并更新呢?如果没有合并更新,在每次执行 useState 的时候,组件都要重新 render 一次,会造成无效渲染,浪费时间(因为最后一次渲染会覆盖掉前面所有的渲染效果)。...是异步执行的(不会立即更新state的结果)多次执行setState和useState,只会调用一次重新渲染render不同的是,setState会进行state的合并,而useState则不会在setTimeout

    1.1K30

    问:React的useState和setState到底是同步还是异步呢?_2023-03-13

    ,连续执行两次同一个 useState 示例function Component() { const [a, setA] = useState(1) console.log('a', a) function...setState 合并,只执行了最后一次,打印 2当点击异步执行按钮时,两次 setState 各自 render 一次,分别打印 2,3这里跟useState不同,同步执行时useState也会对state...进行逐个处理,而setState则只会处理最后一次 为什么会有同步执行和异步执行结果不同呢?...首先,为什么需要合并更新呢?如果没有合并更新,在每次执行 useState 的时候,组件都要重新 render 一次,会造成无效渲染,浪费时间(因为最后一次渲染会覆盖掉前面所有的渲染效果)。...是异步执行的(不会立即更新state的结果)多次执行setState和useState,只会调用一次重新渲染render不同的是,setState会进行state的合并,而useState则不会在setTimeout

    83120

    【React】946- 一文吃透 React Hooks 原理

    为什么不能条件语句中,声明hooks? hooks声明为什么组件的最顶部? 3 function函数组件中的useState,和 class类组件 setState有什么区别?...7 为什么两次传入useState的值相同,函数组件不更新? ... ? 如果你认真读完这篇文章,这些问题全会迎刃而解。...renderWithHooks函数主要作用: 首先先置空即将调和渲染的workInProgress树的memoizedState和updateQueue,为什么这么做,因为在接下来的函数组件执行过程中,...那么通过调用lastRenderedReducer获取最新的state,和上一次的currentState,进行浅比较,如果相等,那么就退出,这就证实了为什么useState两次值相等的时候,组件渲染的原因了...如果两次state不相等,那么调用scheduleUpdateOnFiber调度渲染当前fiber,scheduleUpdateOnFiber是react渲染更新的主要函数。

    2.4K40

    Hooks概览(译)

    在函数组件中调用useState来向它添加一些本地state。React将在重新渲染之间保留此状态。useState返回一对值:当前 state 值和一个用于更新这个值的函数。...这些名称不是useState API的一部分。相反,React假定如果多次调用useState,则在每次渲染时以相同的顺序执行。 我们稍后将讨论为什么这种方法可行以及何时有用。 Hook是什么?...我们将这些操作称为“副作用”(或简称为“影响”)(side effects),因为它们会影响其他组件,并且在渲染过程中无法完成。...Effects函数在组件内被声明,因此可以访问其props和state。默认情况下,React在每次渲染后都运行effects函数——包括第一次渲染。...实际上,每次调用Hook都是一个完全隔离的状态,所以你甚至可以在一个组件两次调用相同的自定义Hook。 自定义Hooks更像是一种约定而非功能。

    1.8K90

    探究React的渲染

    第二次点击按钮时,用户界面将显示2,4,控制台将显示{linear:1,exponential:2 },并且应用程序组件将重新渲染两次。...毕竟如果React真的只有在绝对必要的时候才会重新渲染为什么Wave会重新渲染,因为它不接受任何props,也没有任何state。...第三,如果你确实有一个昂贵的组件,并且你想这个组件选择脱离这个默认行为,只在其props改变时重新渲染,你可以使用React的React.memo高阶组件。...任何时候一个React组件渲染,不管它为什么或位于组件树的什么位置,React都会创建一个组件的快照,它捕捉到React在那个特定时刻更新视图所需要的一切。...注意,每次点击按钮时,应用程序就会渲染两次。 这可能看起来很奇怪,但StrictMode确保应用程序对重新渲染有弹性,而且组件是纯净的。如果不是这样,当React第二次渲染的时候就会变得很明显。

    16830

    记一次React的渲染死循环

    由于该代码经过多人接手,组件嵌套比较深,且内部业务逻辑比较复杂,这我一顿好找。 最后经过抽丝剥茧,一段一段断点调试终于找到了问题的原因。 确实是代码陷入死循环了。...这里仅单纯的分析一下,为什么这样写就会陷入死循环? 二、代码段分析 从代码段不难看出,这段代码的初衷以及期望运行逻辑为: 0)父组件 App 将 value 和 onChange 方法传入子组件。...第1步:初次渲染组件被挂载到 DOM 之后,会触发两个 useEffect。...第2步:合并渲染 经过第一步之后,会合并前面的两次 setState 触发的 UI 更新计划,进行一轮新的综合性的组件 UI 更新。...组件只安心做渲染的事情,当 value 的值发生变化的时候,直接调用 onChange 将数据传出去,在外部统一处理。

    1.4K20

    快速上手 React Hook

    Hook 是一个特殊的函数,它可以你“钩入” React 的特性。例如,useState 是允许你在 React 函数组件中添加 state 的 Hook。稍后我们将学习其他 Hook。...(如果我们想要在 state 中存储两个不同的变量,只需调用 useState() 两次即可。) 「useState方法的返回值是什么?」 返回值为:当前 state 以及更新 state 的函数。...React 会在组件卸载的时候执行清除操作。正如之前学到的,effect 在每次渲染的时候都会执行。这就是为什么 React 会在执行当前 effect 之前对上一个 effect 进行清除。...遵守这条规则,你就能确保 Hook 在每一次渲染中都按照同样的顺序被调用。这 React 能够在多次的 useState 和 useEffect 调用之间保持 hook 状态的正确。...目前为止,在 React 中有两种流行的方式来共享组件之间的状态逻辑: render props 和高阶组件,现在让我们来看看 Hook 是如何在你不增加组件的情况下解决相同问题的。

    5K20

    超实用的 React Hooks 常用场景总结

    ;(componentDidMount 或 componentDidUpdate 会阻塞浏览器更新屏幕) 4、性能优化 默认情况下,React 会每次等待浏览器完成画面渲染之后延迟调用 effect;但是如果某些特定值在两次渲染之间没有发生变化...,你可以通知 React 跳过对 effect 的调用,只要传递数组作为 useEffect 的第二个可选参数即可:如下所示,如果 count 值两次渲染之间没有发生变化,那么第二次渲染后就会跳过 effect...,子组件也会重新渲染,即使子组件的 props 和 state 都没有改变 import React, { memo, useState } from 'react'; // 子组件 const ChildComp...,触发父组件重新渲染;父组件渲染,const info = { name, age } 一行会重新生成一个新对象,导致传递给子组件的 info 属性值变化,进而导致子组件重新渲染。...,如下所示,当点击父组件按钮时,发现控制台会打印出子组件渲染的信息,说明子组件又被重新渲染了。

    4.7K30

    一文总结 React Hooks 常用场景

    ;(componentDidMount 或 componentDidUpdate 会阻塞浏览器更新屏幕) 4、性能优化 默认情况下,React 会每次等待浏览器完成画面渲染之后延迟调用 effect;但是如果某些特定值在两次渲染之间没有发生变化...,你可以通知 React 跳过对 effect 的调用,只要传递数组作为 useEffect 的第二个可选参数即可:如下所示,如果 count 值两次渲染之间没有发生变化,那么第二次渲染后就会跳过 effect...,子组件也会重新渲染,即使子组件的 props 和 state 都没有改变 import React, { memo, useState } from 'react'; // 子组件 const ChildComp...,触发父组件重新渲染;父组件渲染,const info = { name, age } 一行会重新生成一个新对象,导致传递给子组件的 info 属性值变化,进而导致子组件重新渲染。...,如下所示,当点击父组件按钮时,发现控制台会打印出子组件渲染的信息,说明子组件又被重新渲染了。

    3.5K20

    你真的了解React Hooks吗?

    并且选择是 创建 还是 更新 的hook方法, 再使用这一行去执行渲染更新我们的组件 children=Component(props,secondArg)....ReactCurrentDispatcher.current=ContextOnlyDispatcher 这一句写在组件渲染之后, 也就是组件之外执行....简而言之就是, 在组件外执行hooks就会报错. export const ContextOnlyDispatcher: Dispatcher = {  readContext,  useState:...返回. function函数组件中的useState,和 class类组件 setState有什么区别? class组件, 它是一个实例. 实例化了以后, 内部会有它自己的状态....为什么 useState 的返回值是 数组? 而不是一个对象? 如果你猜猜看, 你觉得这样做是为什么? 好处又是什么呢? ? END ▼ 更多精彩推荐,请关注我们 ▼ 你的每个赞和在看,我都喜欢!

    82920

    一文看懂:Vue3 和React Hook对比,到底哪里好?

    遵守这条规则,你就能确保 Hook 在每一次渲染中都按照同样顺序被调用。这 React 能够在多次 useState 和 useEffect 调用之间保持 hook 状态的正确。...这个例子里的 useState 在初次执行的时候,由于执行了两次 useState,会在 Fiber 上保存一个 { value, setValue } -> { value2, setValue2 }...而下一次渲染又会执行 count 的 useState、 count2 的 useState,那么 React 如何从 Fiber 节点上找出上次渲染保留下来的值呢?当然是只能按顺序找啦。...第一次执行的 useState 就拿到第一个 { value, setValue },第二个执行的就拿到第二个 { value2, setValue2 },这也就是为什么 React 严格限制 Hook...假如第一次渲染执行两次 useState,而第二次渲染时第一个 useState 被 if 条件判断给取消掉了,那么第二个 count2 的 useState 就会拿到链表中第一条的值,完全混乱了。

    6K21

    阿里前端二面必会react面试题总结1

    中使用useState,React 会报错提示;类组件不会被替换或废弃,不需要强制改造类组件,两种方式能并存;重要钩子状态钩子 (useState): 用于定义组件的 State,其到类定义中this.state...为什么它很重要?组件状态数据或者属性数据发生更新的时候,组件会进入存在期,视图会渲染更新。...如果我们知道用户界面的某一部分不会改变,那么没有理由 React弄清楚它是否应该更新渲染。...通过在 shouldComponentUpdate方法中返回 false, React将当前组件及其所有子组件保持与当前组件状态相同。如何用 React构建( build)生产模式?...总结:跟服务器端渲染(同构)有关系,如果在componentWillMount里面获取数据,fetch data会执行两次,一次在服务器端一次在客户端。

    2.7K30

    函数式编程看React Hooks(一)简单React Hooks实现

    >{count} 点击 ); } 在 React Hooks 还未出现的时候,我们的组件大多用来直接渲染...其实就是 useMemo 的一个包装,毕竟你缓存函数的返回值,那么我我返回值为一个函数不就行了?...也可以通过以下图来理解 第一次渲染,将每个状态都缓存到数组中。 ? 每次重新渲染,获取数组中每个的缓存状态。 ? 以下为了能够清晰地大家明白原理,进行了一些删减。但是核心逻辑不变。...第一次渲染 将所有的状态都存进闭包中。 ? 事件触发 改变了第二个状态的value值。 ? 第二次渲染 将所有状态依次取出,进行渲染。 ?...例如为什么不要在循环、条件判断或者子函数中调用?因为顺序很重要,我们将缓存(状态)按一定地顺序压入数组,所以取出上一次状态,也必须以同样的顺序去获取。否则的话,会导致获取不一致的情况。。。

    1.8K20
    领券