React Native组件式调用RenderUnUse闪烁,函数式调用正常原因咨询
问题原因解析
1. 组件与函数调用的渲染本质差异
- 组件形式
<RenderUnUse/>会被React识别为独立组件实例,父组件状态更新触发重渲染时,React会检查该组件的props/state变化,决定是否复用实例或重新创建。 - 函数形式
{RenderUnUse()}只是父组件渲染时执行的一段代码,返回的JSX直接作为父组件DOM树的一部分,没有独立的组件生命周期和实例。
2. LayoutAnimation对组件实例的影响
启用LayoutAnimation.easeInEaseOut后,React Native会为布局变化自动添加过渡动画,但两者的处理逻辑不同:
- 对于
<RenderUnUse/>这类独立组件,当父状态切换(点击k/l/m)时,组件可能经历卸载-重新挂载流程,LayoutAnimation尝试为这个过程添加动画,但卸载与挂载的时机衔接不当,就会出现闪烁。 - 函数调用的JSX属于父组件内部结构,布局变化时只是父组件DOM的局部更新,LayoutAnimation会统一处理整个父组件的过渡,不会触发独立组件的卸载挂载,因此无闪烁。
3. key属性的潜在影响
如果<RenderUnUse/>未设置稳定的key属性,父组件重渲染时React无法识别这是同一个实例,会直接销毁旧实例并创建新实例,这个过程中LayoutAnimation的过渡动画会和组件挂载/卸载动画冲突,进一步加剧闪烁。而函数调用不存在组件实例,自然不会有这个问题。
内容的提问来源于stack exchange,提问作者BeanKaKa
相关产品推荐
相关产品推荐

