Polymer使用經驗分享

發表於2019-05-11

最近使用polymer對競鹿官網進行改版, 將使用polymer的經驗總結一下分享給大家。

一,polymer是什麼:

   polymer 一個google開發的web components方式的前端UI控制元件庫,它實現了google最新發布的Material design 設計規範。polymer的概念很超前,polymer中有很多可以借鑑學習的地方。 
   polymer官方網站: http://www.polymer-project.org/

二,使用polymer的問題。

1,web components 是什麼。
  
    components 是元件的意思。 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, 檔案的相對路徑 

    polymer中的相對路徑一般都是相對於當前檔案的路徑,而不是相對於入口檔案的路徑,這個大家用過polymer都知道,比如 link import 匯入檔案時就是這樣的。  大家要注意的是,如果你自定義元素中有和地址相關的屬性,polymer也會自動給你計算出當前檔案的相對路徑。 如:
    我們在 /element 檔案下建立 my-element.html 定義一個元素,程式碼如下:
<polymer-element name="my-element" attributes="url">
    <script>
        Polymer('my-element',{
            ready:function(){
                alert(this.url);
            }       
         });
    </script>
</polymer-element>
      上面元素定義了一個url屬性,並在初始化時alert出url屬性的值。  
      
       然後我們在另外一個頁面呼叫這個元素,假設另外一個頁面地址是 /page/test.html , 呼叫程式碼如下:  
       <my-element url="p/a/t/h"></my-element>

      我們執行程式碼發現, alert出來的字串被處理了,  列印出的字串是  page/p/a/t/h ,  注意不是 p/a/t/h,也不是 element/p/a/t/h

       這些屬性名稱會被polymer計算相對地址: url,href,src 。 如果你自定義元素有自定這些屬性要注意了。 你如果不想polymer給這些屬性自動加上計算的目錄結構, 你只能以斜杆開頭定義一個絕對路徑。

9,ajax傳參技巧 

     core-ajax 傳遞的params引數 可以直接和輸入框對應上, 如:  
    <core-ajax id="ajax" url="http://url" params="{{formdata}}" method="post" ></core-ajax>
     然後有提交表單的輸入框:
   <paper-input  inputValue="{{formdata.email}}"     /> 
   <paper-input  inputValue="{{formdata.name}}"     /> 

    這裡的這個formdata 需要初始化宣告是一個物件, 不然寫會報錯的。   
    Polymer('my-elementer',{
            //這裡宣告一個formdata物件,空的都行,但是不宣告不行。
            formdata:{}
     })

10,layout 佈局

    polymer layout佈局功能, 是用flex實現的, 比較先進,還能實現元素的垂直居中。 但現在支援的瀏覽器較少,等以後瀏覽器都先進了,可以過來看看polymer的實現程式碼借鑑一下。
    文件地址 http://www.polymer-project.org/docs/polymer/layout-attrs.html
    程式碼在:polymer/layout.html 檔案中。

11,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比較遺憾的地方。但是不影響我們去學習和借鑑它的一些東西。 

12,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
評論(2)

相關文章