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)
)。
深入研究代码后,我发现控件上的 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()
orrerender()
?
作为应用程序开发人员
invalidate()
和 rerender()
都不应该使用,因为它们不是 public APIs.
作为控制开发人员
通常,如果控件设置(属性、聚合或关联)之一发生更改,框架已经自动管理控件的重新呈现。但是如果仍然需要显式触发重新渲染,API invalidate()
应该比 rerender()
更受青睐 因为:
rerender()
- 同步呈现控件(阻塞 main/UI 线程)
- 仅当控件之前已呈现时才有效(无法进行初始呈现)
- 不会将多个状态更改合并为一个重新渲染
- 导致额外的布局垃圾处理
- 从 1.70 开始已弃用。
invalidate()
,另一方面,只是将控件添加到 to-be-rendered 控件的集合中,以便它可以与它们一起呈现在一个进程异步(当前在下一个浏览器任务中使用setTimeout(fn, 0)
)。