SAPUI5:无效和重新渲染之间的区别

SAPUI5: Difference between invalidate and rerender

深入研究代码后,我发现控件上的 invalidate() 会增加一个似乎将控件标记为无效的计数器。 这似乎会导致重新渲染。

因此,如果您有一个想要重新呈现的控件,使用 invalidate() 还是 rerender() 更好?

重新渲染实际上是如何触发的? (当然除了显式调用它)

两者都被标记为 "protected",这意味着除非您真的深入开发自定义控件,否则不应调用它们中的任何一个。

当(例如)更改 属性 时,控件会失效。在那种情况下,您通常希望重新呈现控件,这就是设置器默认调用 invalidate 的原因。

当您在您的自定义控件中覆盖您的无效方法时,您可以分析无效的来源,然后决定您是否真的想要重新呈现等。例如,参见 unified.Shell 决定要做什么根据来源无效: https://sapui5.netweaver.ondemand.com/sdk/resources/sap/ui/unified/Shell-dbg.js 第 1539 行

再次说明:受保护意味着不应从外部调用它(并且除了调试之外,它应该不是必需的)。

最近在工作中遇到这样的事情。我正在修复一个动画问题,但不好的是我必须在渲染后启动动画。如果这就是我所能处理的,但更糟糕的是控件渲染两次。当第一次渲染发生时,动画开始做,但是第二次渲染马上就来了,DOM被重构,然后动画终止,效果就像没有动画执行一样。研究代码后,我发现有一个调用 render() 方法的地方会立即执行渲染。将其更改为调用 invalidated() 方法后,看起来动画运行良好。看起来多次 invalidate() 方法调用只会导致执行一次渲染。

Is it better practice to use invalidate() or rerender()?

作为应用程序开发人员

invalidate()rerender() 都不应该使用,因为它们不是 public APIs.

作为控制开发人员

通常,如果控件设置(属性、聚合或关联)之一发生更改,框架已经自动管理控件的重新呈现。但是如果仍然需要显式触发重新渲染,API invalidate() 应该比 rerender() 更受青睐 因为:

  • rerender()
    • 同步呈现控件(阻塞 main/UI 线程)
    • 仅当控件之前已呈现时才有效(无法进行初始呈现)
    • 不会将多个状态更改合并为一个重新渲染
    • 导致额外的布局垃圾处理
    • 从 1.70 开始已弃用
  • invalidate(),另一方面,只是将控件添加到 to-be-rendered 控件的集合中,以便它可以与它们一起呈现在一个进程异步(当前在下一个浏览器任务中使用setTimeout(fn, 0))。