Polymer 1.0 dom-if vs hidden

时间:2017-02-13 03:31:27

标签: polymer polymer-1.0

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

  

如果if变为falsey,则标记的内容将被隐藏但不会从dom中删除。如果随后再次变得真实,则简单地重新显示内容。由于其有利的性能特征,因此使用了这种方法:创建模板内容的费用仅支付一次且懒惰。

我认为这是hidden属性的行为,因此hiddendom-if便宜,因为模板不会被hidden重新填充。由于“无休息时间”是默认行为dom-ifdom-ifhidden之间有什么区别?hidden对性能有何影响?聚合物最佳实践指出hidden更便宜。

2 个答案:

答案 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)。