Polymer组件里根据property值来显示不同的样式

我们的组件有时候需要根据property的值来呈现不同效果。
例如当isActive是true的时候,使用active样式。一个比较传统的方法是每当isActive改变的时候添加/删除active样式:

/* css */

.active {
  color: yellow;
  background: black;
}
// js

properties {
  isActive: {
    type: Boolean,
    notify: true,
    observer: '_observeIsActive'
  }
},

_observeIsActive() {
  if (this.isActive) {
    this.classList.add('active');
  } else {
    this.classList.remove('active');
  }
}

实际上polymer能提供一个更方便的解决。

使用reflectToAttribute

详细可查看文档Reflecting properties to attributes

Polymer的property提供一个reflectToAttribute设置,来将property反射到元素的html(attribute)上。当你的<my-element>isActivereflectToAttribute设置为true,而isActive的值也为true的时候,浏览器的DOM会变成这样:

<my-element is-active></my-element>

通过这么个特性,我们就可以简化上面的功能的实现了:

/* 直接去掉之前的.active,根据元素的attribute里是否包含'is-active'来显示样式 */
:host[is-active] {
  color: yellow;
  background: black;
}
properties {
  isActive: {
    type: Boolean,
    notify: true,
    // 不再需要observer,但需要将property反射到attribute上
    reflectToAttribute: true
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • layout: defaulttype: guideshortname: Docstitle: Registrat...
    1bdd9a4a74a2阅读 652评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,571评论 0 4
  • 早啊,好久没有起这么早了,努力回想起来上次起这么早还是在昨天。不光早安,还有元宵节快乐!团团圆圆吃汤圆(yuanx...
    徐彳亍阅读 286评论 0 0
  • 不知不觉,对你的简书,对你的微博,对你的朋友圈,对你的空间。对你的任何交际圈的下一条动态,都有了一种期待。
    Mr_Zoul阅读 128评论 2 0