那能不能基于原生的 HTML/CSS/JS 就能封装的组件规范呢?那就是 Web Components。
成都创新互联公司专业为企业提供澜沧网站建设、澜沧做网站、澜沧网站设计、澜沧网站制作等企业网站建设、网页设计与制作、澜沧企业网站模板建站服务,十年澜沧做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
Web Components 本身不是一个单独的规范,而是由一组 DOM API 和 HTML 规范所组成,用于创建可复用的自定义名字的 HTML 标签,并且可以直接在你的 Web 应用中使用。
我认为组件就是内部抽象封装了一定的逻辑功能,并暴露相关接口给外部调用。
它能够完成以下的功能:
UI
的统一模式,降低了使用者学习的心智成本。那 Web Components 怎么做到以上几点的呢?
主要有以下几点:
我们接下来通过封装一个 user-card Web Components 组件实战说明一下。本文 Demo 地址[1]。
我们先定义好它的 HTML 和 CSS。
这里留意几点:
使用 CustomElementRegistry.define() 方法注册您的新自定义元素 ,并向其传递要定义的元素名称、指定元素功能的类、以及可选的其所继承自的元素。
代码如下:
class UserCard extends HTMLElement {
constructor() {
// 必须调用 super();
super();
// 创建一个 shadow 节点,创建的其他元素应附着在该节点上
var shadow = this.attachShadow({ mode: "closed" });
// 获取到模板实例
var templateElem = document.getElementById("userCardTemplate");
// 进行拷贝,因为页面上的模板并不是一次性的,可能其他的组件也要引用
var content = templateElem.content.cloneNode(true);
// this.getAttribute 可以获取到组件的传参
content
.querySelector("img")
.setAttribute("src", this.getAttribute("image"));
// 添加到 shadow dom 中
shadow.appendChild(content);
}
}
// 注册自定义元素
window.customElements.define("user-card", UserCard);
这里需要留意这个点:
定义好之后,我们就可以直接使用 user-card 这个自定义元素了,并且可以传递属性给组件,并且能够通过 slot 标签指定 name 属性,使用上面 HTML 模板中我们定义好的占位符。
image="https://p3-passport.byteacctimg.com/img/user-avatar/a0383600d66ccc81b3396b75cf3a95ea~300x300.image"
>
Gopal
1172597655@qq.com
最终的组件效果如下:
上面的 Demo 中其实已经使用了,我们可以在任意一个节点内部创建一个 Shadow DOM,在获取元素实例后,调用 Element.attachShadow() 方法,就能将一个新的 shadow-root 附加到该元素上。
该方法接受一个对象,且只有一个 mode 属性,值为 open 或 closed,表示 Shadow DOM 内的节点是否能被外部获取。
上面我们设置为 closed。
假如改成 open,结果如下:
虽然 Web Components 提出来已经很久了,但是普及的程度远远没有 Vue、React 这些框架的组件库。其主要的问题是,Vue、React 这些框架帮助我们解决了一些视图渲染的逻辑,比如 React,使用 JSX 和 Css module,我们只需要关心数据状态,不需要像 Web Components 一样需要更多的关注 HTML 模板,也就带来了更多的灵活和便利。
精读《Web Components 的困境》[2]的总结中提到:
Web Components 作为浏览器底层特性不应该拿出来和 React,vue 这类应用层框架相比较。Web Components 的方向以及提供的价值都不会跟 应用框架一致。而 Web Components 作为未来的 Web 组件标准,它在任何生态中都可以运行良好。我倒是更加期待应用层去基于 Web Components 去做更多的实现,让组件超越框架存在,可以在不同技术栈中使用。
确实 React 和 Web Components 也是可以共存的,React 官方文档也提到:
为了解决不同的问题而生。Web Components 为可复用组件提供了强大的封装,而 React 则提供了声明式的解决方案,使 DOM 与数据保持同步。两者旨在互补。作为开发人员,可以自由选择在 Web Components 中使用 React,或者在 React 中使用 Web Components,或者两者共存。
至于应用层去基于 Web Components 去做更多的实现,我觉得这是一个很理想的状态,毕竟要 React、Vue 基于 Web Components 去封装它们的实现,那就需要 Web Components 做更多灵活的规范和标准,期待这一天的到来吧。
[1]Demo 地址: https://codepen.io/gpingfeng/pen/zYRMagp。
[2]精读《Web Components 的困境》: https://juejin.cn/post/6844903494885851149。
[3]精读《Web Components 的困境》: https://juejin.cn/post/6844903494885851149。
[4]Web Components MDN: https://developer.mozilla.org/zh-CN/docs/Web/Web_Components。
[5]Web Components 上手指南: https://segmentfault.com/a/1190000039269731。
当前名称:十分钟带你入门WebComponents
网站URL:http://www.csdahua.cn/qtweb/news35/480235.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网