Polymer-自定义元素



 

Polymer是一个框架,允许使用标准HTML元素创建自定义元素。自定义Web元素提供以下功能-

  • 它提供带有关联类的自定义元素名称。
  • 当您更改自定义元素实例的状态时,它将请求生命周期回调。
  • 如果您更改实例的属性,则将请求回调。

您可以使用ES6类定义自定义元素,并且该类可以与自定义元素相关联,如以下代码所示。

//ElementDemo class is extending the HTMLElement 
class ElementDemo extends HTMLElement { 
   // code here
};

//link the new class with an element name
window.customElements.define('element-demo', ElementDemo);

可以将custom元素用作标准元素,如下所示-

<element-demo></element-demo>

–自定义元素名称应以小写字母开头,并且名称之间应包含短划线。

自定义元素生命周期

定制元素生命周期提供了一组定制元素反应,这些反应负责元素生命周期的变化,并在下表中进行了定义。

Sr.No. Reactions & Description
1 constructor

When you create an element or define the previously-created element, this element reaction will be called.

2 connectedCallback

When you add an element to a document, this element reaction will be called.

3 disconnectedCallback

When you remove an element from a document, this element reaction will be called.

4 attributeChangedCallback

Whenever you change, append, remove, or replace an element from a document, this element reaction will be called.

元素升级

在通过规范定义自定义元素之前,我们可以使用自定义元素,并且通过向该元素添加定义,该元素的任何现有实例将升级为该自定义类。

自定义元素状态包含以下值-

  • 未定制-有效的定制元素名称是内置元素或未知元素,它们不能成为定制元素。
  • 未定义-元素可以具有有效的自定义元素名称,但无法定义。
  • custom-元素可以具有有效的自定义元素名称,可以对其进行定义和升级。
  • 失败-尝试升级无效类的失败元素。

定义元素

可以通过创建扩展Polymer.Element的类来定义自定义元素,并将其传递给customElements.define方法。该类包含的是getter方法,该方法返回自定义元素的HTML标签名称。例如-

//ElementDemo class is extending the Polymer.Element 
class ElementDemo extends Polymer.Element {
   static get is() { return 'element-demo'; }
   static get properties() {
      . . .
      . . .
   }
   constructor(){
      super();
      . . .
      . . .
   }
   . . .
   . . .
}

//Associate the new class with an element name
window.customElements.define(ElementDemo.is, ElementDemo);

// create an instance with createElement
var el1 = document.createElement('element-demo');

导入和API

可以通过指定以下三个HTML导入来定义Polymer元素-

  • polymer-element.html-它指定Polymer.Element基类。
  • legacy-element.html-它使用Polymer.LegacyElement基类扩展Polymer.Element并添加了1.x兼容的遗留API。它还通过定义传统的Polymer()工厂方法来创建混合元素。
  • polymer.html-它包含聚合物基类以及辅助元素,这些元素包含在1.x polymer.html中。

在主HTML文档中定义元素

您可以使用HTMLImports.whenReady()函数在主HTML文档中定义一个元素。

下面的示例演示如何在主HTML文档中定义元素。创建一个index.html文件并添加以下代码。

<title>Polymer Example</title>
      <script src="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
      <link rel="import" href="bower_components/polymer/polymer.html">
      <link rel="import" href="define-element.html">
   
   
   
      <define-element></define-element>
   

现在创建一个名为define-element.html的自定义元素,并包含以下代码。

<dom-module id="define-element">
   <template>
      <h2>Welcome to Tutorialspoint!!!</h2>
   </template>
   
   <script>
      HTMLImports.whenReady(function(){
         Polymer ({
            is: "define-element"
         })
      })  
   </script>
</dom-module>

输出

要运行该应用程序,请导航到创建的项目目录并运行以下命令。

polymer serve

现在打开浏览器并导航到http://127.0.0.1:8081/ 。以下将是输出。

聚合物定义元素

定义旧元素

传统元素可用于使用Polymer函数注册元素,该函数采用新元素的原型。原型应该包含自定义元素定义的HTML标签。

//registering an element
ElementDemo = Polymer ({
   is: 'element-demo',
   
   //it is a legecy callback, called when the element has been created
   created: function() {
     this.textContent = 'Hello World!!!';
   }
});

//'createElement' is used to create an instance
var myelement1 = document.createElement('element-demo');

//use the constructor create an instance
var myelement2 = new ElementDemo();

生命周期回调

生命周期回调用于完成Polymer.Element类的内置功能的任务。 Polymer使用就绪回调,当Polymer完成创建和初始化DOM元素时将调用该回调。

以下是Polymer.js中的旧式回调列表。

  • created-在设置属性值和初始化本地DOM之前创建元素时调用。
  • ready-在设置属性值并初始化本地DOM之后创建元素时调用。
  • 附加-在将元素附加到文档之后被调用,并且可以在元素的整个生命周期中多次调用。
  • detached-从文档分离元素后调用它,并且在元素的整个生命周期中可以多次调用。
  • attributeChanged-当元素的属性发生更改并且包含与声明的属性不兼容的属性更改时调用。

声明属性

可以在元素上声明属性,以在数据系统中添加默认值和其他特定功能,并且可以将它们用于指定以下功能-

  • 它指定属性类型和默认值。
  • 当属性值发生更改时,它将调用观察器方法。
  • 它指定只读状态以停止对属性值的意外更改。
  • 它提供对双向数据绑定的支持,该双向数据绑定会在您更改属性值时触发事件。
  • 它是一个计算的属性,它根据其他属性动态地计算一个值。
  • 更改属性值时,它会更新并反映相应的属性值。

下表显示了属性对象支持的每个属性的键。

Sr.No. Key & Description Type
1 type

It deserializes from an attribute whose property type is determined using the type’s constructor.

constructor (Boolean, Date, Number, String, Array or Object)
2 value

It specifies the default value for the property and if it is a function, then it uses the return value as the default value of the property.

boolean, number, string or function.
3 reflectToAttribute

If this key sets to true, then it sets the corresponding attribute on the host node. The attribute can be created as a standard HTML boolean attribute, if you set the property value as Boolean.

boolean
4 readOnly

You cannot set the property directly by assignment or data binding, if this key is set to true.

boolean
5 notify

You can use the property for two-way data binding, if this key is set to true and when you change the property, property-name-changed event will get triggered.

boolean
6 computed

You can calculate the value of an argument whenever it changes, by invoking the method and value will be simplified as method name and argument list.

string
7 observer

Invoke the method name, which is simplified by a value, when the property value changes.

string

属性反序列化

如果在属性对象中配置了属性,则根据指定的类型反序列化与实例上的属性匹配的属性名称,并在元素实例上反序列化该属性名称。

如果在属性对象中没有定义其他属性选项,则可以直接将指定的类型设置为属性的值。否则,它将为属性配置对象中的类型键提供值。

配置布尔属性

可以从标记配置Boolean属性,方法是将其设置为false,如果将其设置为true,则不能从标记进行配置,因为带有或不带有值的属性均等于true。因此,它被称为Web平台中属性的标准行为。

可以通过以JSON格式将对象和数组属性传递为-

<element-demo player='{ "name": "Sachin", "country": "India" }'></element-demo>

配置默认属性值

可以使用properties对象中的value字段配置默认属性,它可以是原始值,也可以是返回值的函数。

以下示例描述了如何在properties对象中配置默认属性值。

<link rel="import" href="../../bower_components/polymer/polymer-element.html">

//it specifies the start of an element's local DOM
<dom-module id="polymer-app">
   <template>
      <style>
         :host {
            color:#33ACC9;
         }
      </style>
      <h2>Hello...[[myval]]!</h2>    
   </template>

   <script>
      //cusom element extending the Polymer.Element class
      class PolymerApp extends Polymer.Element {
         static get is() { return 'polymer-app'; }
         static get properties() {
            return {
               myval: {
                  type: String,
                  //displaying this value on screen
                  value: 'Welcome to Tutorialspoint;!!!'
               },
               data: {
                  type: Object,
                  notify: true,
                  value: function() { return {}; }
               }
            }
         }
      }
      window.customElements.define(PolymerApp.is, PolymerApp);
   </script>
</dom-module>

输出

运行上一个示例中所示的应用程序,然后导航到http://127.0.0.1:8000/ 。以下将是输出。

聚合物配置默认属性值

只读属性

通过在属性对象中将readOnly标志设置为true,可以避免对生成的数据进行意外更改。元素使用约定_setProperty(value)的setter来更改属性值。

下面的示例描述了在属性对象中使用只读属性。创建一个index.html文件,并在其中添加以下代码

<title>Polymer Example</title>
      <script src="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
    
      <link rel="import" href="bower_components/polymer/polymer.html">
      <link rel="import" href="my-element.html">
   
   
   
      <my-element></my-element>
   

现在,创建另一个名为my-element.html的文件,并包含以下代码。

<link rel="import" href="bower_components/polymer/polymer-element.html">
<link rel="import" href="prop-element.html">

//it specifies the start of an element's local DOM
<dom-module id="my-element">
   <template>
      <prop-element my-prop="{{demoProp}}"></prop-element>
      <p>Present value: <span>{{demoProp}}</span></p>
   </template>

   <script>
      Polymer ({
         is: "my-element", properties: {
            demoProp: String
         }
      });
   </script>
</dom-module>

接下来,再创建一个名为prop-element.html的文件,并添加以下代码。

//it specifies the start of an element's local DOM
<dom-module id="prop-element">
   <template>
      <button on-click="onClickFunc">Change value</button>
   </template>
   
   <script>
      Polymer ({
         is: "prop-element", properties: {
            myProp: {
               type: String,
               notify: true,
               readOnly: true,
               value: 'This is initial value...'
            }
         },
         onClickFunc: function(){
            this._setMyProp('This is new value after clicking the button...');
         }
      });
   </script>
</dom-module>

输出

运行上一个示例中所示的应用程序,然后导航到http://127.0.0.1:8081/ 。以下将是输出。

聚合物只读属性

单击按钮后,它将更改值,如以下屏幕截图所示。

聚合物只读属性

将属性反映到属性

通过将属性配置对象中的属性上的reflectToAttribute设置为true,可以将HTML属性与属性值同步。

属性序列化

在将属性反映或绑定到属性时,可以将属性值序列化为属性,默认情况下,可以根据值的当前类型对值进行序列化。

  • 字符串-无需序列化。
  • 日期或数字-使用toString序列化值。
  • 布尔值-将显示的非值属性设置为true或false。
  • 数组或对象-使用JSON.stringify序列化值。

Made with ❤️ in Chengdu. Copyright reserved 2019-2022.

蜀ICP备20006366号-1