来自https://www.polymer-project.org/1.0/docs/api/dom-if
如果if变为falsey,则标记的内容将被隐藏但不会从dom中删除。如果随后再次变得真实,则简单地重新显示内容。由于其有利的性能特征,因此使用了这种方法:创建模板内容的费用仅支付一次且懒惰。
我认为这是hidden
属性的行为,因此hidden
比dom-if
便宜,因为模板不会被hidden
重新填充。由于“无休息时间”是默认行为dom-if
,dom-if
和hidden
之间有什么区别?hidden
对性能有何影响?聚合物最佳实践指出hidden
更便宜。
答案 0 :(得分:10)
我对它的理解是dom-if
没有标记直到表达式变得真实,但在这样做之后它的行为很像[hidden]
。以这种方式dom-if
是一个悲观的[hidden]
,它会尽可能地推迟加盖。
这种延迟加载方法在某些情况下是有利的,其中标记模板将是非常耗费资源的。例如,如果模板非常大,需要初始化多个自定义组件。如果您刚刚使用了hidden
属性,那么您只需支付创建所有DOM的性能成本,直到稍后才能看到它。
对于简单的情况,例如隐藏或显示某些文本,div或2等,hidden
属性可能更快,因为创建这些元素然后隐藏它们的成本可能低于创建{ {1}}实例来保存你的代码,Polymer设置监听器来监控表达式的真实性,然后,当它变得真实时,所有开销用于标记模板,解析它以获取绑定表达式等。这对于填充了<template>
支持的浏览器。
考虑你的情况(并且理想地测试它)是最好的选择。通常情况下,这些差异可以忽略不计,但如果您的代码中的这部分恰好位于<template>
中且包含大量项目或经常发生的任何事情,则需要特别小心。差异可能会加起来。
答案 1 :(得分:3)
隐藏会干扰display
CSS属性,因此dom-if
是更好的选择。
如果你有
:host {display: block;}
在组件主机元素上设置hidden
不会隐藏它。
您还需要添加像
[hidden] { display: none !important;}
使其可靠地工作(并使其在IE9中工作,不支持hidden
AFAIR)。