原文:https://lit-element.polymer-project.org/guide/templates

1、定义一个渲染模板

1.1 基本规则

要用LitElement 组件定义一个模板,必须为你的模板类写一个render方法:

  1. import { LitElement, html } from 'lit-element';
  2.  
  3. class MyElement extends LitElement {
  4. render() {
  5. return html`<p>template content</p>`;
  6. }
  7. }

这里 html`...` 中 html 是引用的父类函数,用模板字符串包裹原始的HTML标签

组件的 render 方法可以返回 lit-html 可以渲染的任何内容。通常,它返回单个 TemplateResult 对象(与 html 标记函数返回的类型相同)。

完整的例子

  1. import { LitElement, html } from 'lit-element';
  2.  
  3. class MyElement extends LitElement {
  4.  
  5. // Implement `render` to define a template for your element.
  6. render(){
  7. /**
  8. * Return a lit-html `TemplateResult`.
  9. *
  10. * To create a `TemplateResult`, tag a JavaScript template literal
  11. * with the `html` helper function.
  12. */
  13. return html`
  14. <div>
  15. <p>A paragraph</p>
  16. </div>
  17. `;
  18. }
  19. }
  20. customElements.define('my-element', MyElement);

1.2 动态更改模板内容

我们可以通过捕获加载消息作为属性,并根据事件设置属性来改变模板:update-properties.js

  1. import { LitElement, html } from 'lit-element';
  2.  
  3. /**
  4. * Use this pattern instead.
  5. */
  6. class UpdateProperties extends LitElement {
  7. static get properties(){
  8. return {
  9. message: String
  10. };
  11. }
  12. constructor() {
  13. super();
  14. this.message = 'Loading';
  15. this.addEventListener('stuff-loaded', (e) => { this.message = e.detail } );
  16. this.loadStuff();
  17. }
  18. render() {
  19. return html`
  20. <p>${this.message}</p>
  21. `;
  22. }
  23. loadStuff() {
  24. setInterval(() => {
  25. let loaded = new CustomEvent('stuff-loaded', {
  26. detail: 'Loading complete.'
  27. });
  28. this.dispatchEvent(loaded);
  29. }, 3000);
  30. }
  31. }
  32.  
  33. customElements.define('update-properties', UpdateProperties);

该例子中为模板元素绑定了一个加载事件,事件函数模拟3秒后改变元素属性值,从而动态改变模板。这是动态改变模板的方法。

注意:每一个模板类都必须引用  import { html, LitElement } from 'lit-element'; 就算套用了其他模板也是一样

2、在模板中使用属性、循环和条件判断

2.1 属性

  1. static get properties() {
  2. return { myProp: String };
  3. }
  4. ...
  5. render() {
  6. return html`<p>${this.myProp}</p>`;
  7. }

通过静态的 get properties() 函数指定属性的类型, 构造函数 constructor() 初始化属性的初始值

2.2 循环

  1. html`<ul>
  2. ${this.myArray.map(i => html`<li>${i}</li>`)}
  3. </ul>`;

ES6数组的map方法,为每一个数组元素执行括号中的操作

2.3 三目运算符

  1. html`
  2. ${this.myBool?
  3. html`<p>Render some HTML if myBool is true</p>`:
  4. html`<p>Render some other HTML if myBool is false</p>`}
  5. `;

完整的例子

  1. import { LitElement, html } from 'lit-element';
  2.  
  3. class MyElement extends LitElement {
  4. static get properties() {
  5. return {
  6. myString: { type: String },
  7. myArray: { type: Array },
  8. myBool: { type: Boolean }
  9. };
  10. }
  11. constructor() {
  12. super();
  13. this.myString = 'Hello World';
  14. this.myArray = ['an','array','of','test','data'];
  15. this.myBool = true;
  16. }
  17. render() {
  18. return html`
  19. <p>${this.myString}</p>
  20. <ul>
  21. ${this.myArray.map(i => html`<li>${i}</li>`)}
  22. </ul>
  23. ${this.myBool?
  24. html`<p>Render some HTML if myBool is true</p>`:
  25. html`<p>Render some other HTML if myBool is false</p>`}
  26. `;
  27. }
  28. }
  29.  
  30. customElements.define('my-element', MyElement);

一个包含了 get properties(), constructor(), render() 方法的模板

3、给模板元素绑定属性值

您可以插入JavaScript表达式作为HTML文本内容,基本属性,布尔属性,元素属性和事件处理器的占位符。

  • Text content: <p>${...}</p>
  • Attribute: <p id="${...}"></p>
  • Boolean attribute: ?disabled="${...}"
  • Property: .value="${...}"
  • Event handler: @event="${...}"

3.1 绑定到正文

  1. html`<div>${this.prop1}</div>`

3.2 绑定到基本属性

  1. html`<div id="${this.prop2}"></div>`

3.3 绑定到布尔类型属性

  1. html`<input type="text" ?disabled="${this.prop3}">`

3.4 绑定到元素属性

  1. html`<input type="checkbox" .value="${this.prop4}"/>`

3.5 绑定到事件处理程序

  1. html`<button @click="${this.clickHandler}">pie?</button>`

完整的例子

  1. import { LitElement, html } from 'lit-element';
  2.  
  3. class MyElement extends LitElement {
  4. static get properties() {
  5. return {
  6. prop1: String,
  7. prop2: String,
  8. prop3: Boolean,
  9. prop4: String
  10. };
  11. }
  12. constructor() {
  13. super();
  14. this.prop1 = 'text binding';
  15. this.prop2 = 'mydiv';
  16. this.prop3 = true;
  17. this.prop4 = 'pie';
  18. }
  19. render() {
  20. return html`
  21. <!-- text binding -->
  22. <div>${this.prop1}</div>
  23.  
  24. <!-- attribute binding -->
  25. <div id="${this.prop2}">attribute binding</div>
  26.  
  27. <!-- boolean attribute binding -->
  28. <div>
  29. boolean attribute binding
  30. <input type="text" ?disabled="${this.prop3}"/>
  31. </div>
  32.  
  33. <!-- property binding -->
  34. <div>
  35. property binding
  36. <input type="text" .value="${this.prop4}"/>
  37. </div>
  38.  
  39. <!-- event handler binding -->
  40. <div>event handler binding
  41. <button @click="${this.clickHandler}">click</button>
  42. </div>
  43. `;
  44. }
  45. clickHandler(e) {
  46. console.log(e.target);
  47. }
  48. }
  49.  
  50. customElements.define('my-element', MyElement);

4、使用slot占位符给模板元素渲染子节点

4.1 slot标签

要实现如下形式的渲染,必须通过slot占位符标签实现

  1. <my-element>
  2. <p>A child</p>
  3. </my-element>

默认情况下,如果元素具有阴影树,则其子元素根本不会渲染。

要渲染子节点,您的模板需要包含一个或多个<slot>元素,这些元素充当子节点的占位符。

例如定义如下形式的模板

  1. render(){
  2. return html`
  3. <div>
  4. <slot></slot>
  5. </div>
  6. `;
  7. }

就可以在 <slot> 标签的位置渲染子节点

  1. <my-element>
  2. <p>Render me</p>
  3. </my-element>

这些子项不会在DOM树中移动,但会像它们是<slot>的子项一样呈现。

任意多个子节点可以填充到一个slot:

  1. <my-element>
  2. <p>Render me</p>
  3. <p>Me too</p>
  4. <p>Me three</p>
  5. </my-element>

4.2 使用命名的slot

要将子节点分配给特定的 slot ,请确保该子节点的 slot 属性与该 slot 的 name 属性匹配:

  1. render(){
  2. return html`
  3. <div>
  4. <slot name="one"></slot>
  5. </div>
  6. `;
  7. }
  1. <my-element>
  2. <p slot="one">Include me in slot "one".</p>
  3. </my-element>

命名 slot 仅接受具有匹配 slot 属性的子节点。

例如:

  1. import { LitElement, html } from 'lit-element';
  2.  
  3. class MyElement extends LitElement {
  4. render(){
  5. return html`
  6. <div>
  7. <slot name="one"></slot>
  8. <slot name="two"></slot>
  9. </div>
  10. `;
  11. }
  12. }
  13. customElements.define('my-element', MyElement);

one对one,two对two,没有名字的不会被渲染

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <script src="/node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"></script>
  8. <script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
  9.  
  10. <script type="module" src="./my-element.js"></script>
  11. <title>lit-element code sample</title>
  12. </head>
  13. <body>
  14. <!-- Assign child to a specific slot -->
  15.  
  16. <my-element>
  17. <p slot="two">Include me in slot "two".</p>
  18. </my-element>
  19.  
  20. <!--
  21. Named slots only accept children with a matching `slot` attribute.
  22.  
  23. Children with a `slot` attribute can only go into a slot with a matching name.
  24. -->
  25.  
  26. <my-element>
  27. <p slot="one">Include me in slot "one".</p>
  28. <p slot="nope">This one will not render at all.</p>
  29. <p>No default slot, so this one won't render either.</p>
  30. </my-element>
  31. </body>
  32. </html>

5、多个模板组合成页面

您可以从其他LitElement模板组成新的LitElement模板。在以下示例中,我们通过导入其他元素并在模板中使用它们来组成新的<my-page>模板:

my-article.js

  1. import { LitElement, html } from 'lit-element';
  2.  
  3. class MyArticle extends LitElement {
  4. render() {
  5. return html`
  6. <article>article</article>
  7. `;
  8. }
  9. }
  10. customElements.define('my-article', MyArticle);

my-header.js

  1. import { html, LitElement } from 'lit-element';
  2.  
  3. class MyHeader extends LitElement {
  4. render() {
  5. return html`
  6. ${this.headerTemplate}
  7. `;
  8. }
  9. get headerTemplate() {
  10. return html`<header>header</header>`;
  11. }
  12. }
  13. customElements.define('my-header', MyHeader);

my-footer.js

  1. import { LitElement, html } from 'lit-element';
  2.  
  3. class MyFooter extends LitElement {
  4. render() {
  5. return html`
  6. <footer>footer</footer>
  7. `;
  8. }
  9. }
  10. customElements.define('my-footer', MyFooter);

用以上三个子模版元素组成页面元素my-page.js

  1. import { LitElement, html } from 'lit-element';
  2.  
  3. import './my-header.js';
  4. import './my-article.js';
  5. import './my-footer.js';
  6.  
  7. class MyPage extends LitElement {
  8. render() {
  9. return html`
  10. <my-header></my-header>
  11. <my-article></my-article>
  12. <my-footer></my-footer>
  13. `;
  14. }
  15. }
  16. customElements.define('my-page', MyPage);

然后配一个 模板元素整合文件,例如 mian.js

  1. import './my-page.js';

在页面 my-page.html中引用这个文件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.  
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>lit-element code sample</title>
  8. <script src="main.js"></script>
  9. </head>
  10.  
  11. <body>
  12. <my-page></my-page>
  13. <script src="webcomponents-loader.js"></script>
  14. </body>
  15.  
  16. </html>

此时可能有 index.html, my-page.html两个页面, index.js, main.js两个脚本文件,需要同时打包输出,修改rollup,config.js文件,以数组形式输出多个js文件

  1. import resolve from 'rollup-plugin-node-resolve';
  2. import babel from 'rollup-plugin-babel';
  3.  
  4. export default [{
  5. input: ['src/index.js'],
  6. output: {
  7. file: 'build/index.js',
  8. format: 'es',
  9. sourcemap: true
  10. },
  11. plugins: [
  12. resolve(),
  13. babel()
  14. ],
  15. },{
  16. input: ['src/main.js'],
  17. output: {
  18. file: 'build/main.js',
  19. format: 'es',
  20. sourcemap: true
  21. },
  22. plugins: [
  23. resolve(),
  24. babel()
  25. ]
  26. }];

修改package.json中的html打包命令

  1. "scripts": {
  2. "copyindex": "cp src/*.html build",
  3. "copywc": "cp -r node_modules/@webcomponents/webcomponentsjs/bundles build && cp node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js build",
  4. "build": "rm -rf build && mkdir build && npm run copyindex && npm run copywc && rollup -c",
  5. "start": "serve build"
  6. },

就可以在build下生成两个html文件及其对应的js文件了,其他同理可得

6、 lit-html

lit-html作为LitElement的核心,可以使用很多它的其他功能

  1. npm i lit-element@^2.0.0
  2. npm i lit-html@^1.0.0

例如:

  1. import { LitElement, html } from 'lit-element';
  2. import { until } from 'lit-html/directives/until.js';
  3.  
  4. const content = fetch('./content.txt').then(r => r.text());
  5.  
  6. html`${until(content, html`<span>Loading...</span>`)}`

读取一个文件内容作为渲染内容

其他详见文档:https://lit-html.polymer-project.org/guide/template-reference#built-in-directives

LitElement(二)模板编写基本语法的更多相关文章

  1. thinkPHP 模板中的语法知识 详细介绍(十二)

    原文:thinkPHP 模板中的语法知识 详细介绍(十二) 本章节:介绍模板中的语法,详细的语法介绍 一.导入CSS和JS文件    ==>记住常量的是大写 1.css link .js  sc ...

  2. (转)dedecms网页模板编写

    网页模板就是templets中的htm文件,所以编写模板就是要编写html.这篇文章不是关于标签的具体使用,而是对网页模板的一些理解.包括基本的标签语法,封面模板,列表模板和文档模板的关系. 一 关于 ...

  3. python MVC、MTV 框架介绍 Django 模板系统常用语法

    Django 框架简介一.MVC框架和MTV框架1.MVC 全名Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分.优势: 耦合性低 重用性高 生命 ...

  4. c/c++ 模板与STL小例子系列<二> 模板类与友元函数

    c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...

  5. 一、 JSP概述 二、JSP的语法结构 三、JSP内置对象

    一.JSP概述###<1>概念 java服务器页面 可以编写动态页面 其内部是以HTML标签为主,可以在HTML标签嵌套java代码 jsp文件以.jsp为后缀 jsp本质上就是一个Ser ...

  6. iOS 11开发教程(二)编写第一个iOS 11应用

    iOS 11开发教程(二)编写第一个iOS 11应用 编写第一个iOS 11应用 本节将以一个iOS 11应用程序为例,为开发者讲解如何使用Xcode 9.0去创建项目,以及iOS模拟器的一些功能.编 ...

  7. JVM(二):Java中的语法糖

    JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法 ...

  8. Django(二)模板

    一.模板概念 1.Django通过模板动态生成html 2.模板的加载位置 模板一般建立在templates文件夹中,全局路径的设置在settings.py中 ​ DIRS:决定了整个项目的模板路径的 ...

  9. hexo文章编写部分语法总结以及hexo使用

    一.hexo的使用 1.1 新建一篇文章 1 $ hexo new [layout] <title> 1.2. 生成静态文件 1 $ hexo generate 可简写为 1 $ hexo ...

随机推荐

  1. P1553 数字反转(升级版)(copy(),reverse(),find(),substr(),erase())

    题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反 ...

  2. 通俗易懂的RESTful API实践详解(含代码)

    来源:点击进入 点击上方链接,版面更好 一.什么是RESTful REST 是面向资源的,这个概念非常重要,而资源是通过 URI 进行暴露,URI 的设计只要负责把资源通过合理方式暴露出来就可以了,对 ...

  3. 在windows系统下,配置vue项目一键启动文件

    我的项目由客户端.后台管理.数据库和服务器三部分组件,每次启动项目都要一个一个启动,挺麻烦的,现在写一个.bat文件来批处理命令. 这个是我的启动文件内容. 第一行运行的我wampServer服务器, ...

  4. python ide 使用

    pycharm jupyter 官方文档 使用 部署到服务器 参考 配置域名(反向代理) *.conf文件 server { listen ; server_name ju.iii.top; inde ...

  5. Java(三)String类

    一.String类初始化方法 1.初始化一个空字符串 String str=new String();//这里调用了String的无参构造方法 2.初始化一个有值的字符串 String str1=&q ...

  6. 【巨杉数据库SequoiaDB】省级农信国产分布式数据库应用实践

    本文转载自<金融电子化> 原文链接:https://mp.weixin.qq.com/s/WGG91Rv9QTBHPsNVPG8Z5g 随着移动互联网的迅猛发展,分布式架构在互联网IT技术 ...

  7. 全网VIP视频解析接口

    全网VIP视频在线解析可以免费观看[腾讯vip视频.爱奇艺vip视频.优酷VIP视频.土豆VIP视频.乐视VIP视频.芒果VIP视频]等等...可以vip免费观看.去广告等等. https vip视频 ...

  8. 360独角兽实习,连载周记(gnuradio 低功耗蓝牙BLE 综合工具模块编写)

    (有点乱,之后会有整理) 最近在用写一套gnuradio的OOT模块,主要用来进行BLE嗅探的,github上有了一些工具,可是他们并没有很好的模块化,于是打算自己写一个,这样以后做一些其他的项目,模 ...

  9. 0级搭建类012-Windows Server 2019安装(2019) 公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  10. Oracle 12c 多租户家族(12c 18c 19c)如何在 PDB 中添加 HR 模式

    Oracle 12c 多租户家族(12c [12.2.0.1].18c [12.2.0.2].19c [12.2.0.3])如何在 PDB 中添加模式:19c (19.3) 手工添加示例 HR 用户 ...