polymer使用经验分享

最近使用polymer对竞鹿官网(JobDeer.com)进行改版, 将使用polymer的经验总结一下分享给大家。

一,polymer是什么:

   polymer 一个google开发的web componts方式的前端UI控件库,它实现了google最新发布的Material design 设计规范。polymer的概念很超前,polymer中有很多可以借鉴学习的地方。 
   polymer官方网站: http://www.polymer-project.org/

二,使用polymer的问题。

1,web componts 是什么。
  
    componts 是组件的意思。 web组件就是web的一个一个元素标签, 如input标签,img标签,video标签等等。 web componts 的概念就是把所有可重用的东西封转成元素组件, 下次要用,自己使用自己写好的标签即可。 polymer给大家提供了封装自定义标签的方法, 它自己也有很多已经封装的标签,  如滑块: paper-slider,文档地址http://www.polymer-project.org/docs/elements/paper-elements.html#paper-slider ,大家可以看看这个文档中的demo查看效果。  
  
    polymer的理念是一切功能切元素, 即使是ajax, 也是元素,core-ajax标签可以发起ajax请求, 文档地址:http://www.polymer-project.org/docs/elements/core-elements.html#core-ajax

2,如何学习polymer 。  
    1) 看完get started的文档, 对polymer会有大体的了解 http://www.polymer-project.org/docs/start/getting-the-code.html

    2)学习polymer自带标签的使用 http://www.polymer-project.org/docs/elements/ , core-开头的是核心标签。    paper-开头的是Material design风格的标签。 paper-开头的标签会带有很炫的效果,它们一般是基于core-标签再此封装出来的。 比如paper-input标签 是基于 core-input封装的

3,  polymer 中如何选择新产生的dom元素。  
     polymer选择元素的方法是  this.$.idname , 可以选择模板中指定id的层。 但是这种选择方法不能选择新查询的层。 比如:
             <template> 
             <div id="root">
                 <div id="a">A层</div>
                 <template if="{{show_b}}">
                 <div id="b">B层</div>           
                 </template>
                 <div id="c">C层</div>
              </div>
             <template>
   
    加上show_b这个变量默认值是false, 也就是说默认 不会有B层元素, 后面show_b变量为true是才会产生B层元素, 也就是说B层元素是后来生成的, 而不是初始化时就有的。
    这时候我们在polymer代码中 可以用  this.$.a选择到A层, 可以用this.$.c选择到C层,但是无法用 this.$.b选择到B层。
    解决方法是,我们可以在最外面加一个 root层, root层是初始化时就有的层, 因为B层是新生的,可以这样选择:
    this.$.root.querySelector('#b')

4, 事件监听 on-eventname 和addEventlistener的区别。

    polymer提供了on-eventname属性来对事件进行监听, 如监听按钮的点击事件:
<paper-button id="button" label="flat button" on-click="{{buttonClick}}"></paper-button>
    另外还可以用addEventlistener监听事件, 如
  this.$.button.addEventlistener('click',function(){
        alert('click');
        console.log(this);
})
    在两种监听方法是有区别的。  
     on-eventname 方式监听, 在监听函数中  this 指向的是当前polymer对象。你可以用this来获得当前polymer对象的其他属性。  
     而addEventlistener 在监听函数中 this 是当前元素。

5, 如何选中模板中<content>标签中的内容。
      参考文章 http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-301/ , 这篇文章中说明了 <content>标签代表的元素并不属于 shadow dom的元素,而是属于外层元素。 
      所以用选择外层元素来选择它就好,  在polymer代码中可以这样选择:  this.querySelector('#id')

6, polymer中如何导入jquery 。
      我们可以简历一个 lib.html  他的代码是: 
<script src="./jquery.js"></script>
       然后在元素中导入
<link rel="import" href="lib.html" />


因为 link import 加载的页面时会自动判定是否重复加载只会加载一次(类似php的require_once函数)。 所以及时我们在多个元素中 导入lib.html 都不会重复加载jquery 。

7 ,polymer 兼容语法  
     我们在CSS样式中,可以用/deep/ 语法,让一条元素既对html元素生效,也对shadow dom元素生效。 如:
 html /deep/ h3 { background:red }
     但是deep语法,并非所有浏览器都支持。 兼容不支持deep语法的浏览器的方法,
    link标签导入样式时,加上shim-shadowdom属性  <link rel="stylesheet" href="./xxx.css" shim-shadowdom />
    style标签定义元素时,加上shim-shadowdom 属性
   <style  shim-shadowdom>
   </style>
  
     这其实是在告诉polymer的平台兼容js,这些地方需要处理, platform.js会识别到这些区域,然后用js做兼容处理。

   我们在css中还经常会用 ::content 选择 <content> 标签指定中的元素, 但是 ::content 语法也是一些浏览器不支持的, 所以要用polyfill-next-selector在声明一下, 如: 
polyfill-next-selector { content: '#question .title:before'; } 
#question ::content .title{
   //css样式代码
}


8,layout 布局

    polymer layout布局功能, 是用flex实现的, 比较先进,还能实现元素的垂直居中。 但现在支持的浏览器较少,等以后浏览器都先进了,可以过来看看polymer的实现代码借鉴一下。
    文档地址 http://www.polymer-project.org/docs/polymer/layout-attrs.html
    代码在:polymer/layout.html 文件中。

9,polymer的原理。

    polymer自定义标签,建立一个新元素,然后定义元素的shadow dom, shadow dom是HTML5  的内容, 详见:  http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/

   定义好自定义元素后是用 link import导入的, link import 也是HTML5 的知识 , 详见: http://www.html5rocks.com/en/tutorials/webcomponents/imports/

   用了这么多HTML5的技术,一些浏览器不支持的, 所以要在用polymer之前,加载platform.js,然后不支持这些HTML5特性的浏览器可以用js来实现兼容。 
 
   但它兼容性有些差,对android版本要求4.3以上。 因此,对应国内来说, 大部分android用户 访问有问题, 因此polymer也不能用到phonegap中, 这是polymer比较遗憾的地方。但是不影响我们去学习和借鉴它的一些东西。 

10,polymer一次导入的文件太多,能否压缩。

      polymer 每使用一个标签,都要导入一个文件,而且标签可能还有依赖,所以polymer代码写完后,我们发现页面加载了好多文件, 能否压缩优化,让一次加载?

      这是可以的,使用 https://github.com/Polymer/vulcanize

因为polymer兼容性的问题,最后我们还是换回了angularjs做官网。  我们之前写的polymer代码大家可以借鉴一下, 地址是: http://5.deersite.sinaapp.com/

NB的人才都不找工作,都到JobDeer拍卖自己:  www.jobdeer.com

大家有问题可以在微博上找我: http://weibo.com/luofei614

你可能感兴趣的:(polymer使用经验分享)