Polymer 1.0 dom-if vs 隐藏

Polymer 1.0 dom-if vs hidden

来自 https://www.polymer-project.org/1.0/docs/api/dom-if

When if becomes falsey, the stamped content is hidden but not removed from dom. When if subsequently becomes truthy again, the content is simply re-shown. This approach is used due to its favorable performance characteristics: the expense of creating template content is paid only once and lazily.

我认为这是 hidden 属性的行为,因此 hiddendom-if 便宜,因为模板不会用 hidden 重新标记。由于 'no restamp' 是默认行为 dom-if,因此 dom-ifhidden 之间有什么区别?hidden 如何提高性能? Polymer 最佳实践指出 hidden 更便宜。

隐藏会干扰 display CSS 属性,因此 dom-if 是更好的选择。

如果你有

:host {display: block;}

在组件宿主元素上设置 hidden 不会隐藏它。 您还需要添加一个全局样式,例如

[hidden] { display: none !important;}

使其可靠地工作(并使其在不支持 hidden AFAIR 的 IE9 中工作)。

我的理解是 dom-if 不会标记 直到 表达式变为真值,但在这样做之后它的行为很像 [hidden] 。这样一来,dom-if 就是一个悲观主义者 [hidden],它会尽可能推迟加盖时间。

这种 lazy-loading 方法在某些情况下很有用,因为在这些情况下,冲压模板会占用大量资源。例如,如果模板非常大且包含多个必须初始化的自定义组件。如果您刚刚在那里使用了 hidden 属性,那么您将支付创建所有这些属性的性能成本 DOM 只是为了它直到以后才可见。

对于简单的情况,例如隐藏或显示一些文本、一个 div 或两个等。hidden 属性可能更快,因为创建这些元素然后隐藏它们的成本可能少于创建一个 <template> 实例来保存您的代码,Polymer 设置侦听器以监视表达式的真实性,然后,当它变为真实时,所有用于标记模板、解析它以绑定表达式等的开销。对于 <template> 支持 polyfill 的浏览器尤其如此。

根据您的情况仔细考虑(最好进行测试)是最好的选择。通常差异可以忽略不计,但如果您的这部分代码恰好位于 dom-repeat 中,其中包含很多项目或任何经常发生的事情,请务必特别小心。差异可能会增加。