webcomponents安装了没有用_Web Components 入门实例教程

0844ae5f9583b497f8c621729bb4c2ee.png来源 | http://www.ruanyifeng.com/blog/2019/08/web_components.html组件是前端的发展方向,现在流行的React和Vue都是组件框架。谷歌公司由于掌握了Chrome浏览器,一直在推动浏览器的原生组件,即Web组件API。部分第三方框架,原生组件简单直接,符合直觉,不用加载任何外部模块,代码量小。因此,它还在不断发展,但已经可用于生产环境。Web组件API内容很多,这里不是全面的教程,只是一个简单的演示,让大家看一下怎么用它开发组件。

1、自定义元素

下图是一个用户卡片。905d2b1188dd4bd0365588fb7c4eb37b.png本文演示如何把这个卡片,写成Web Components组件,这里是最后的完整代码。网页只要插入以下的代码,就会显示用户卡片。
这种自定义的HTML标签,称为自定义元素(custom element)。根据规范,自定义元素的名称必须包含连词线,用与区别原生的HTML元素。所以,不能写成。

2、customElements.define()

自定义元素需要使用JavaScript定义一个类,所有都会是这个类的实例。
class UserCard extends HTMLElement {constructor() {super();  }}
上面代码中,UserCard就是自定义元素的类。注意,这个类的父类是HTMLElement,因此继承了HTML元素的特性。接着,使用浏览器原生的customElements.define()方法,告诉浏览器元素与这个类关联。
window.customElements.define('user-card', UserCard);

3、自定义元素的内容

自定义元素目前还是空的,下面在类里面称为这个元素的内容。
class UserCard extends HTMLElement {constructor() {super();var image = document.createElement('img');    image.src = 'https://semantic-ui.com/images/avatar2/large/kristy.png';    image.classList.add('image');var container = document.createElement('div');    container.classList.add('container');var name = document.createElement('p');    name.classList.add('name');    name.innerText = 'User Name';var email = document.createElement('p');    email.classList.add('email');    email.innerText = 'yourmail@some-email.com';var button = document.createElement('button');    button.classList.add('button');    button.innerText = 'Follow';    container.append(name, email, button);this.append(image, container);  }}
上面的代码最后一行,this.append()的this表示自定义元素实例。完成这一步以后,自定义元素内部的DOM结构就已经生成了。

4、标签

使用JavaScript写上一级的DOM结构很麻烦,Web Components API提供了标签,可以在它里面使用HTML定义的DOM。

User Name

yourmail@some-email.com

Follow
然后,改写一下自定义元素的类,为自定义元素加载。
class UserCard extends HTMLElement {constructor() {super();var templateElem = document.getElementById('userCardTemplate');var content = templateElem.content.cloneNode(true);this.appendChild(content);  }} 
上面的代码中,获取上游以后,克隆了它的所有子元素,这是因为可能有多个自定义元素的实例,这个模板还要留给其他实例使用,所以不能直接移动它的子元素。到这一步为止,完整的代码如下。
...class UserCard extends HTMLElement {constructor() {super();var templateElem = document.getElementById('userCardTemplate');var content = templateElem.content.cloneNode(true);this.appendChild(content);      }    }window.customElements.define('user-card', UserCard);    

5、添加样式

自定义元素还没有样式,可以给它指定细分样式,类似下面这样。
user-card {/* ... */}
但是,组件的样式应该与代码封装在一起,只对自定义元素实施,不影响外部的布局样式。所以,可以把样式写在里面。
:host {display: flex;align-items: center;width: 450px;height: 180px;background-color: #d4d4d4;border: 1px solid #d5d5d5;box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);border-radius: 3px;overflow: hidden;padding: 10px;box-sizing: border-box;font-family: 'Poppins', sans-serif;   }.image {flex: 0 0 auto;width: 160px;height: 160px;vertical-align: middle;border-radius: 5px;   }.container {box-sizing: border-box;padding: 20px;height: 160px;   }.container > .name {font-size: 20px;font-weight: 600;line-height: 1;margin: 0;margin-bottom: 5px;   }.container > .email {font-size: 12px;opacity: 0.75;line-height: 1;margin: 0;margin-bottom: 15px;   }.container > .button {padding: 10px 25px;font-size: 12px;border-radius: 5px;text-transform: uppercase;   }

User Name

yourmail@some-email.com

Follow
上方代码中,样式里面的:host伪类,指代自定义元素本身。

6、自定义元素的参数

内容现在是在里面设定的,为了方便使用,把它改成参数。
image="https://semantic-ui.com/images/avatar2/large/kristy.png"name="User Name"email="yourmail@some-email.com">
代码也相应改造。
Follow John
最后,改一下类的代码,把参数加到自定义元素里面。
class UserCard extends HTMLElement {constructor() {super();var templateElem = document.getElementById('userCardTemplate');var content = templateElem.content.cloneNode(true);    content.querySelector('img').setAttribute('src', this.getAttribute('image'));    content.querySelector('.container>.name').innerText = this.getAttribute('name');    content.querySelector('.container>.email').innerText = this.getAttribute('email');this.appendChild(content);  }}window.customElements.define('user-card', UserCard);   

7、影子DOM

我们不希望用户能够看到的内部代码,Web组件允许内部代码隐藏起来,这叫做Shadow DOM,即这部分DOM默认与外部DOM隔离,内部任何代码都无法影响外部。自定义元素的this.attachShadow()方法开启Shadow DOM,详见下面的代码。
class UserCard extends HTMLElement {constructor() {super();var shadow = this.attachShadow( { mode: 'closed' } );var templateElem = document.getElementById('userCardTemplate');var content = templateElem.content.cloneNode(true);    content.querySelector('img').setAttribute('src', this.getAttribute('image'));    content.querySelector('.container>.name').innerText = this.getAttribute('name');    content.querySelector('.container>.email').innerText = this.getAttribute('email');    shadow.appendChild(content);  }}window.customElements.define('user-card', UserCard);
上面的代码中,this.attachShadow()方法的参数{ mode: 'closed' },表示Shadow DOM是封闭的,永久外部访问。至此,这个Web组件组件就完成了,完整代码可以访问这里。可以看到,整个过程还是很简单的,不像第三方框架那样有复杂的API。

8、组件的扩展

在前面的基础上,可以对组件进行扩展。(1)与用户互动用户卡片是一个静态组件,如果要与用户互动,也很简单,就是在类里面监听各种事件。
this.$button = shadow.querySelector('button');this.$button.addEventListener('click', () => {// do something});
(2)组件的封装上面的例子中,与网页代码放在一起,可以其实用脚本把注入|网页。这样的话,JavaScript的跟脚本就能封装一个分类中翻译JS文件,成为独立的组件文件。网页只要加载这个脚本,使用就能组件。这里就不展开了,更多Web Components的高级用法,可以接着学习下面两篇文章。
  • Web组件初学者教程
  • 自定义元素v1:可重用的Web组件

九,参考链接

  • Web组件剖析,Uday Hiwarale
(完)93fa5a1d574ab7e1c7efa6c36b8e19a3.png034da8edf76d81911120943aa9d70664.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虹软java接摄像头_虹软人脸识别SDK(java+linux/window) 初试

虹软人脸识别全平台demo调用—快速上手之服务端Windows篇demo名称:ArcFace 2.2 Windows(86) Demo [C]一 环境配置:1) 安装VS2013环境安装包(vcredist_x86_vs2013.exe)2) 从官网(http://www.arcsoft.com.cn/ai/arcface.html)申请sdk,下载对应的…

java 循环查询list_Java用list储存,遍历,查询指定信息过程详解

需求说明实现思路见代码注释代码内容使用list储存,遍历,查询,删除import java.util.ArrayList;import java.util.List;/*** auther::9527* Description: 第七题* program: 多线程* create: 2019-08-09 23:39*/public class Sevent…

低代码开发平台_低代码开发平台系列:6、低代码是编程技术发展大势所趋

一、低代码是一种编程技术低代码是快速开发工具/技术的一种,属于软件开发/编程工具/技术领域,主要应用于企业软件开发领域。借助低代码工具,使用者无需编码即可实现企业软件系统常见功能的交付;少量编码扩展更多功能,相…

abnf java实现_详细讲解如何利用Java实现组合式解析器?

简介:Ward Cunningham 曾经说过,干净的代码清晰地表达了代码编写者所 想要表达的东西,而优美的代码则更进一步,优美的代码看起来就像是专门为了 要解决的问题而存在的。在本文中,我们将展示一个组合式解析器的设计、实…

充电原理_电动汽车充电桩如何设置?充电桩原理介绍

随着新能源产业的蓬勃发展,电动汽车在生活中变得越来越普遍。比亚迪(BYD),宝马(BMW)和特斯拉(Tesla)等汽车制造商都已经推出了全电动汽车,而混合动力汽车则更为普遍。为了能够方便地为这些电动汽车的电池充电,必须建立充电桩。充电…

java 获取服务器硬件_dell服务器远程获取硬件状态

以dell的R620型号的服务器做的测试登陆上dell服务器ilo的IP地址,首先打开ipmi,ilo2是直接支持ipmi2.0的此框需要点击 “IDRAC设置”->“网络”->“IPMI设置”在”启用LAN上IPMI“后的复选框打钩,才能启动ipmi好像是内置到了ilo2&#x…

简单可行性报告模板_项目可行性报告模板分享!第三章主要内容

项目可行性报告模板分享!第三章主要内容如下:第三章 市场分析与建设规模市场分析在可行性研究中的重要地位在于,任何一个项目,其生产规模的确定、技术的选择、投资估算甚至厂址的选择,都必须在市场需求情况有了充分的了解后才能解…

java外挂源码_2.7 万 Star!Github 项目源码辅助阅读神器

【导语】:一款用于将 Github 项目代码以树形格式展示的浏览器插件。简介大家平时逛 GitHub 是否会觉得查看源代码的体验十分糟糕?项目文件需要一层层点击,返回也要一层层返回。这样不直观,也比较麻烦。Octotree 是一款辅助阅读 Gi…

php教育网站设计案例_酒店装修,精品酒店设计装修案例,酒店设计网站

酒店设计需要考虑:设计酒店的时候也要顺应市场潮流,不再单一的提供休息、洗漱、睡觉的空间,还要能提供社交、商务等功能,同顾客产生情况共鸣。这样能够引领生活方式的、能够互动,有仪式感的酒店,是很吸引人…

写一个方法判断一个字符串是否对称_判断一个男生是否好色的方法

▾我们店只招黑喵哦?▾其实也不是不能理解为什么男的要跑?▾有什么相见恨晚的小知识??▾见证奇迹?:是不是穿过去了!?▾医学奇迹?▾卧槽流劈!?真的超光速了!▾细节很到位啊几位少年?▾昨有坟头蹦迪?…

matlab计算联合熵,如何用matlab软件计算一幅图像信息的熵以及两幅图像间的联合熵?...

%计算一副图像的熵%随机生成图像Afloor(rand(8,8).*255);[M,N]size(A);tempzeros(1,256);%对图像的灰度值在[0,255]上做统计for m1:M;for n1:N;if A(m,n)0;i1;elseiA(m,n);endtemp(i)temp(i)1;endendtemptemp./(M*N);%由熵的定义做计算result0;for i1:length(temp)if temp(i)0;…

自然水体辐射特性与数值模拟 pdf_OpenGMS系列讲座(十三)汪亚平教授:南黄海水动力过程和辐射沙脊群演化...

2020年8月28日,南京大学海岸与海岛开发教育部重点实验室汪亚平教授应地科院陈旻教授邀请,作客南京师范大学虚拟地理环境教育部重点实验室OpenGMS系列讲座,并做了题为"南黄海水动力过程和辐射沙脊群演化" 的报告。汪教授首先通过两个…

matlab2014a 3d标定,[转载]张的matlab摄像机标定

自己写了下matlab张的标定程序,采用张正有网站上的数据,即数据文档Model.txt data1.txt data2.txtdata3.txt data4.txt data5.txt。其中Model.txt为世界坐标系中的点【实验结果】我的程序:k1 -0.2286 k2 0.1903 fx 832.5000fy 832.5298 cx 30…

小括号教学设计导入_【教资面试】语文政治历史地理教学设计答题技巧!

语文1.确立教学目标的依据 (1)基础教育课程改革课程改革要求语文课程必须面向全体学生,使学生获得基本的语文素养。对知识与技能,过程与方法,情感态度与价值观三个方面目标的整合,是语文新课程的价值追求。 根据语文学科工具性与人…

360浏览器卸载_陈蛋蛋碎碎念—如何完美地卸载流氓软件

陈蛋蛋碎碎念—如何完美地卸载流氓软件很多小伙伴都会有困扰,明明我就是只下载了一个软件啊,怎么电脑上莫名其妙地多了一大堆软件,什么我是渣渣辉一刀就是99级的游戏,什么影视全家桶,又或者是各种各样的浏览器&#xf…

java int相除向上取整_Java基础篇——Java运算符

Java运算符按功能可分为:算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和条件运算符。算数运算符算术运算符包括通常的加()、减(-)、乘(*)、除(/)、取模&am…

nginx php access denied,LNMP 解决Access Denied错误详细介绍

处理搭建好LNMP环境之后,呈现了Access Denied错误搭建好LNMP环境之后,呈现了Access Denied错误,现已扫除掉文件权限的问题也扫除掉是Nginx的问题,而是无法解析PHP的问题。发现网上的很多大牛都是经过Nginx的log来排查错误&#xf…

dp主机_MODBUS 和 PROFIBUS-DP 协议有什么区别

modbus协议和 profibus DP协议两者的区别和用途主要在哪里?相比好多工控人都有这个疑问。今天小编带大家一起学习一下。一、modbus协议和 profibus DP协议综述Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络…

ios上架图片在线制作_不同风格gif在线制作,公众号动态图片制作方法

现在运营公众号的主要方式就通过文章来进行宣传推广,在公众号文章中使用GIF动态图是非常常见的一种图片展现的方式,让文章整体效果看起来更加的生动有趣,所以很多的运营者在日常的工作和生活中会手机许多的动图素材,方便以后的使用…

table tr省略后鼠标移入显示相应信息_中考来了,人机对话、信息技术考试要求看过来...

半岛记者 魏海洋今年的中考将拉开大幕,九年级英语听说人机对话考试(以下简称“人机对话考试”)将于4月20日(周六)至21日(周日)进。八年级信息技术考试将于4月22日(周一)进行,市招考办提醒广大考生,按照准考证规定时间及时参加考试。关于两门考…