问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Web Components是不是Web的未来

发布网友 发布时间:2022-04-27 08:19

我来回答

1个回答

热心网友 时间:2022-04-15 05:58

随着各式各样的用户需求,浏览器的原生组件已经无法满足需求。Web组件也就变得越来越重要。
我们将以自定义一个传统三方插件为例来介绍Web组件。
首先,需要引用插件的CSS和JavaScript资源:
<link rel="stylesheet" type="text/css" href="my-widget.css" />

<script src="my-widget.js"></script>

接下来,我们需要向页面中添加占位符。
<div data-my-widget></div>

最后,我们需要使用脚本来找到并且实例化这个占位符为Web组件。

// 使用 jQuery 初始化组件

$(function() {

$('[data-my-widget]').myWidget();

});

通过以上是三个基本步骤。已经完成了在页面中添加了自定义插件,但是浏览器无法确定自定义组件的生命周期,如果通过以下方式声明则使自定义组件生命周期变得清晰了。
el.innerHTML = '<div data-my-widget></div>';

因为这不是一个内置的组件,我们现在必须手动实例化新组件,
$(el).find('[data-my-widget]').myWidget();

避免这种复杂设置方法的有效方式是完全抽象DOM交互。不过,这个动作也比较复杂,需要创建框架或者库来自定义组件。
面临的问题
组件一旦被声明,占位符已经被替代为原生的HTML标记:

<div data-my-widget>

<div class="my-widget-foobar">

<input type="text" class="my-widget-text" />

<button class="my-widget-button">Go</button>

</div>

</div>

这样做的弊端是,自定义组件的标记和普通HTML组件的标记混杂在一起,没有清晰的分割和封装。这就不可避免的会出现命名及样式等冲突。
Web组件的产生
随着三方Web组件的发展,它已经成为了Web开发不可或缺的部分:

<!—导入: -->

<link rel="import" href="my-widget.html" />

<!—使用:-->

<my-widget />

在这个实例中,我们通过导入HTML来添加组件并且立即使用。
更重要的是,因为<my-widget />是浏览器原生支持的组件,它直接挂在浏览器的生命周期中,允许我们像添加原生组件一样添加三方组件。
el.innerHTML = '<my-widget />';

// 插件当前已经被实例化

当查看这个组件的HTML 源码,你会发现它仅仅是一个单一的标签。如果启用浏览器Shadow DOM 特性,才可以查看标签内的组件,你将会发现一些有趣的事情,

当我们谈论Web组件时,我们不是在谈论一门新技术。Web组件最初的目的是给我们封装能力,它可以通过自定义组件和Shadow DOM 技术来实现。所以,接下来,我们将着重介绍下这两项技术。介绍以上两个技术之前,我们最好先梳理下已知浏览器原生组件。
已知的HTML组件
我们知道组件可以通过HTML标记或JavaScript来实例化:
使用标记实例化:
<input type="text" />
document.createElement('input');
el.innerHTML = '<input type="text" />';

使用JaveScript实例化:
document.createElement('input')

document.createElement('div')

添加带有属性的HTML标签:

// 创建带有属性的input标签...

el.innerHTML = '<input type="text" value="foobar" />';

//这时value属性已经同步

el.querySelector('input').value;

组件可以响应属性的变化:
// 如果我们更改value 属性值
input.setAttribute('value', 'Foobar');

//属性值会立即更改
input.value === 'Foobar'; // true

组件可以有内部隐藏的DOM结构:
<!—使用一个input实现复杂的日历功能-->
<input type="date" />

// 尽管其内部结构比较复杂,但是已经封装成为一个组件
dateInput.children.length === 0; // true

组件可以使用子组件:

<!—可以给组件提供任意个 'option' 标签-->

<select>

<option>1</option>

<option>2</option>

<option>3</option>

</select>

组件可以为其子组件提供样式:
dialog::backdrop {

background: rgba(0, 0, 0, 0.5);

}

最后,组件可以有内置样式。和自定义插件不同,我们不需要为浏览器的原生控件引用CSS文件。
有了以上的了解,我们已经具备了解Web组件的基础。使用自定义组件和Shadow DOM,我们可以在我们的插件中定义所有这些标准行为。
自定义组件
注册一个新组件也比较简单:
var MyElement = document.register('my-element');

// 'document.register' 返回一个构造函器

你也许注意到上面的自定义组件名称包含一个连接符。这是为了确保自定义组件名称不和浏览器内置组件不冲突。
现在<my-element />这个组件具备了原生组件的特性,
所以,自定义组件也同样可以进行普通的DOM操作:
document.create('my-element');

el.innerHTML = '<my-element />';

document.create('my-element');

构建自定义组件
当前,这个自定义组件仅仅有框架,而没有内容,下面让我们向其中添加一些内容:

//我们将提供'document.register'的第二个参数:

document.register('my-element', {

prototype: Object.create(HTMLElement.prototype, {

createdCallback: {

value: function() {

this.innerHTML = '<h1>ELEMENT CREATED!</h1>';

}

}

})

});

在这个例子中,我们设置自定义组件的prototype,使用Object.create 方法创建一个继承于HTMLElement的对象。在这个方法中修改该组件的属性 innerHTML。
我们定义了createdCallback方法,在每次声明实例时调用。你同样可以有选择性的定义attributeChangedCallback、 enteredViewCallback 和leftViewCallback等方法。
目前为止我们实现了动态修改自定义组件内容的功能,我们仍然需要提供自定义组件的封装方法,用于隐藏其内部组件。
使用Shadow DOM实现封装
我们需要完善下createdCallback方法。本次,除了修改innerHTML之外,我们添加一些额外的操作:

createdCallback: {

value: function() {

var shadow = this.createShadowRoot();

shadow.innerHTML = '<h1>SHADOW DOM!</h1>';

}

}

在这个例子中, 你会注意到‘SHADOW DOM!’,但是查看源码时你会发现只有空白的<my-element /> 标签而已。这里使用创建Shadow Root 方法替代了直接修改页面。
Shadow Root中的任何组件,是肉眼可见的,但是和当前页面的样式和DOM API相隔离。这样就实现了自定义组件是一个独立组件的假象。
添加“轻量级DOM”
目前为止,我们的自定义组件是空标签,但是如果向其中添加内部组件会出现什么现象呢?
我们假设自定义组件包含的节点如下,

<my-element>

这是一个轻量级 DOM。

<i>hello</i>

<i>world</i>

</my-element>

一旦针对于这个组件的 Shadow Root 被创建,它的子节点不再存在。我们这些隐藏的子节点封装为轻量级DOM节点。
如果禁用了 Shadow DOM,上面这个例子仅仅会显示为:这是一个轻量级 DOM‘hello world’。
当我们在createdCallback方法中设置 Shadow DOM后,我们可以使用新增内容分配轻量级DOM组件到Shadow DOM 中。

createdCallback: {

value: function() {

var shadow = this.createShadowRoot();

// 子组件'i' 标签现在已经消失了

shadow.innerHTML =

‘轻量级 DOM 中的 "i" 标签为: ' +

'<content select="i" />';

//现在,在 Shadow DOM 中只有 'i' 标签是可以见的。

}

}

封装样式
Shadow DOM 最重要的作用是创建了和当前页面隔离的Web组件,使Web组件不受当前页面样式和JaveScript脚本的影响。

createdCallback: {

value: function() {

var shadow = this.createShadowRoot();

shadow.innerHTML =

"<style>span { color: green }</style>" +

"<span>I'm green</span>";

}

}

反之,在 Shadow DOM 中定义的样式也不会影响之外的标签样式。
<my-element />

<span>I'm not green</span>
Web Components是不是Web的未来

Web Components 的出现给组件标准化带来了很好的契机:WEB组件目前仍然依靠各种类似"Hack"的方式来模拟,模拟方式也各有不同,很难统一和标准化,而 Web Components 则直接提供了标准化的组件定义方式,这是组件标准化的基石,使得未来的组件能够统一创建、方法调用、事件监听、属性访问等。基于标准化的组件...

Web Components 是个什么样的东西

最后,再啰嗦一句,Web Components 个人觉得还是未来发展趋势,所以才有了这个文章。

为什么web components如此重要

WebComponents 是这类问题最好的良药,通过一种标准化的非侵入的方式封装一个组件,每个组件能组织好它自身的 HTML 结构、CSS 样式、javascript 代码,并且不会干扰页面上的其他代码。The Shadow DOM大家之前可能听说过 shadow DOM,但 shadow DOM 到底是什么? 开发者能通过 shadow DOM 在文档流中创建一些完全独立于其...

什么是web components?

Web Components 是一套用于创建可重用、自定义的web元素的技术,这些元素的功能封装在代码中,可以轻松融入到任何web应用中。它们最初的目标是代码复用,设计为独立且功能单一的组件,处于系统代码的底层,为上层代码提供依赖。要使用Web Components,开发者需要按照以下步骤操作:首先,定义一个ES2015类来指定...

五分钟带你了解 Web Components

简单理解 Web Components 就是:Web Components 是一套技术,允许创建可重用的自定义元素。而 Web Component 的目的也很明确,从原生层面实现组件化,使开发者开发、复用、扩展自定义组,实现自定义标签。意味着前端开发人员开发组件时可以实现 Write once, run anywhere。Web Components 本身不是一个单独的...

Microsoft office 2003 web components是什么

Microsoft office 2003 web components是什么 10  我来答 分享 微信扫一扫 新浪微博 QQ空间 举报 浏览1 次 可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。 office web components 搜索资料 本地图片 图片链接 代码 提交回答 匿名 回答自动保存中...

如何评价webcomponentsjs,生产环境用的话,靠谱吗

现在不合适, 未来可能也不合适 WebComponent不适合直接和业务对接的项目, 原因至少有下面两个.1. WebComponent的数据传递一定要用数字,字符串,或布尔类型的值. 如, 一个展示用户资料的卡片. WebComponent下一定要这么写 &lt;user-profile name="caozhihu" description="f@ck zhihu" avatar="some-doge"...

html未来实现web components都有哪些规范

Web Components 的出现给组件标准化带来了很好的契机:WEB组件目前仍然依靠各种类似"Hack"的方式来模拟,模拟方式也各有不同,很难统一和标准化,而 Web Components 则直接提供了标准化的组件定义方式,这是组件标准化的基石,使得未来的组件能够统一创建、方法调用、事件监听、属性访问等。基于标准化的组件...

webcomponents是什么意思

Web Components的意思是是一种web技术,它允许你在浏览器环境中构建模块化、可重用和封装的web应用组件。这是一种开源标准,由一系列不同的技术组成,包括自定义元素、阴影DOM和HTML模板等。它的目标是提供一个可扩展和强大的工具集,以更轻松地构建复杂的前端应用程序。以下是详细的解释:Web Components...

webcomponents是什么软件

webcomponents是海康威视的视频观看插件,适用于海康dvr监控软件使用。康威视web插件WebComponents.exe,该控件开发包仅支持B/S网页开发,不适用于C/S开发,支持网页上实现预览、回放、云台控制等功能。海康威视是领先的安防产品及行业解决方案提供商,以视频为核心的智能物联网解决方案和大数据服务提供商。

未来是我的但未来也是你们的 WebComponentsKit 没有未来的未来 是不是欠我一个未来 未来是一个什么样的时代 未来在来 未来是什么意思 给你一个期待的未来 会不会还欠我一个未来
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在三角形ABC中,角A,B,C所对的边分别是a,b,c.满足(a-b)(sinA-sinB... 在三角形ABC中,角ABC所对的边分别为abc已知cos2C=负四分之一。 求sin... 在△abc中 角a b c所对的边分别为a b c 若sinA sinB sinC=根号3/2(sin... 在三角形ABC中,角A、 B、 C、的对边分别为a、 b、 c、且sinA方+sinC方... ...角A,B,C所对边为a,b,c,若sinB平方+sinC平方=sinA平方+sinBsinC,且A... 螺丝跟管道的尺寸叫法为什么不一样 在三角形abc中角abc所对的边分别为abc,若sinB平方+sinC平方=sinA平方+... 霍山黄大茶产地哪里 餐厅禁止自带酒水合法吗 餐饮店禁止客人自带酒水如何处罚 microsoft office web componets是什么软件 起什么作用 Microsoft office 2003 web components是什么 web components是什么意思 Web Components 是个什么样的东西 有下唇窝的女人面相 写首生日诗给女朋友 嘴巴大的女人说明什么,嘴巴大的女人面相? 求:爱情或搞笑字谜!要高难度的 嘴巴大的女人说明什么,嘴巴大的女人面相 我去了以后。发现女朋友家人一点都不讲道理。还说太远了。不让她嫁到我们那里。我没同意就把这孩子打掉。 监狱生活到底什么样 面相怎么看女性的福气 女朋友名字叫王玉娇我该怎么称呼? 上嘴唇高于下嘴唇面相学 重装系统后英特尔(R)核心显卡控制面板不见了 急求祝福语,祝女友生日快乐,藏头诗,宋瑞娇,生日快乐 这样下嘴唇鼓鼓的是什么面相 女朋友过年主动找我要红包正常吗? 下牙盖上牙,下唇比上唇突,这是女人的面相,请问命理如何? 有哪些你认为和《三体》处在同一级别的中国科幻小说? microsoft office web components microsoft office xp wep component 这个软件是干什么的,可以卸载么 baidu web component3.0是什么 如何使web加载webcomponents? webcomponents是什么软件 microsoft office web components是什么程序,有什么用的,不装这个电脑会有什么样的问题吗? 2003 web component 有什么用,装sql 2005时带的,本机装有office 2010... websevice是什么 microsoft office web components可以卸载吗 我想卸载Microsoft office 2003 web components,对我的其他软件有什么影响? baidu web component3.0是什么程序 怎样画交通安全的画 平板电脑怎样连接电脑显示器或电视 文明出行交通安全, 漫画 文明出行的手抄报什么画。 黑莓平板电脑 怎么连接电脑 平板怎么连接电视看电影啊有hdmi线 – 手机爱问 安全文明出行手抄报内容 寒假作业~手抄报《真爱生命,文明出行》 文明出行从校园开始 手抄报