You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中JSX组件标签与函数调用渲染的差异及闪烁问题

JSX组件标签渲染与直接函数调用的核心差异

核心区别

  • 标签渲染<Display/>:React会将其识别为独立组件,为其分配单独的Fiber节点,走完整的组件生命周期流程。React的Diff算法中会通过组件的引用判断是否为同类型组件,如果引用变化会直接卸载旧实例、挂载新实例,对应DOM也会销毁重建。
  • 直接调用{Display()}:本质是执行普通函数,返回的JSX会直接合并到父组件的渲染结果中,没有独立的Fiber节点和生命周期。React只会对最终返回的DOM节点做Diff,内容相同就不会触发DOM销毁重建。

你遇到闪烁的原因

你的Display组件定义在App组件内部,每次App重渲染(你切页后主动触发重渲染时),都会生成一个新的Display函数引用。使用标签渲染时,React会判定为组件类型变化,走卸载再挂载的流程,DOM销毁重建的过程就会产生视觉闪烁。而直接调用的方式没有独立组件实例的判断逻辑,仅Diff返回的<h1>节点,内容无变化就不会操作DOM,所以不会闪烁。

修复方案和注意事项

不要在组件内部定义其他组件,将Display移到App外部,标签渲染的闪烁问题就会消失:

// 移到App外部定义,函数引用不会随App重渲染变化
const Display = ()=>{
  console.log(" === Rendering display ===")
  return (
    <h1> Hello there.. </h1>
  )
}

const App = ()=> {
  return(
    <div>
      <Display/>
      {Display()}
    </div>
  )
}

另外不推荐长期使用直接调用组件的写法:如果组件内部用到useState、useEffect等Hook,直接调用时这些Hook会被绑定到父组件上,极易出现Hook调用顺序异常、状态污染等问题。

内容的提问来源于stack exchange,提问作者Amar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:09:03