首页 > 作文

Web componentd组件内部事件回调及痛点剖析

更新时间:2023-04-03 22:45:38 阅读: 评论:0

目录
写在前面wc 到底是什么?目前存在的缺陷1、组件内部事件的回调2、组件样式覆盖3、组件内部资源相对路径问题4、form表单类组件 value 获取问题5、其它写在后面

写在前面

最近致力于研究 web components(以下简称wc),并且也初有成效的拿到了一定的结果,但今天想回过头来重新审视一下 wc。

wc 到底是什么?

简单的讲,web component 就是把组件封装成 html 标签的形式,并且在使用时不需要写额外的 js 代码。

组件是前端的发展方向,抛开周边技术生态,单纯看 react 和 vue 都是组件框架。因此,wc 可以视为原生标签的拓展/延伸,说到底,它依旧是一个标签!

类似<video></video>标签,相比于原生标签,它多了更为丰富的样式和可操作属性。

谷歌公司由于掌握了 chrome 浏览器,一直在推动浏览器的原生组件,即 web components api。

相比第三方框架,原生组件简单直接,符合直觉,不用加载任何外部模块,代码量小。貌似一切完美,似乎大有可以用来替换react、vue之类的趋势。

目前存在的缺陷

与其它 web 框架一起使用存在一些小问题,会给开发体验上造成一些困扰。

1、组件内部事件的回调

比如,一个弹窗组件(<my-dialog></my-dialog>)中的确定按钮,那么它的事件是如何触发的呢?

class mydialog extends htmlelement {  // ...  connectedcallback() {    const shadowroot = this.attachshadow({ mode: 'open' });    shadowroot.innerhtml = `      <div class="dialog">        <div class="dialog-content">          <div class="dialog-body">            弹窗内容          </div>           <button id="okbtn">确定</button>benefit明星产品        </div>      </div>    `;     shadowroot.querylector('#okbtn').addeventlistener('click', () => {      // 组件内部定义事件      this.dispatchevent(new customevent('okbtnfn'));    });  }} customelements.define('my-dialog', mydialog);

现在方案是 custom element 内部自定义事件new customevent(),外部用addeventlistener监听。这样的写法是很丑陋的,仿佛又回到了原生 js 写应用的时代。

<my-dialog></my-dialog> <script>  export default {    created() {      document.addeventlistener('okbtnfn', function(){        // 点击弹窗按钮,触发回调事件      });    }  }</script>

2、组件样式覆盖

对于开发者来说,难免会遇到需要调整组件内部样式的时候。无论你是使用antdvant还是使用其它组件库,但 wc 的 css 防污染机制导致你很难修改内部样式。老公过生日祝福语这需要你付出一些代价来变相的修改内部样式

3、组件内部资源相对路径问题

就目前来说,任何直接基于 custom element v1, template 和 html import 的组件都无法做到完全资源独立 —— 在不知道使用方环境且不给使用方增加额外限制的情况下使用内部封装的任何资源文件。比如如果你有一个自定义 icon 组件:

class myicon extends htmlelement {    static get obrvedattributes() { return ['name','size','color'] }    constructor() {        super();        const shadowroot = this.attachshadow({ mode: 'open' });        shadowroot.i乘出租车英语nnerhtml = `            <svg class="icon" id="icon" aria-hidden="true" viewbox="0 0 1024 1024">                <u id="u"></u>            </svg>            }     attributechangedcallback (name, oldvalue, newvalue) {        if( name == 'name' && this.shadowroot){            // 如果使用的项目中,根目录没有 icon.svg 文件,那就 gg            this.u.tattributens('http://www.w3.org/1999/xlink', 'xlink:href', `./icon.svg#icon-${newvalue}`);        }    }}customelements.define('my-icon', myicon);

如果使用的项目中,根目录没有 icon.svg 文件,那就 gg。如果你在这里使用 cdn 路径,就会出现跨域问题。

4、form表单类组件 value 获取问题

shadow dom 中包含有 <input>、<textarea> 或 <lect> 等标签的 value 不会在 form 表单中自动关联。

示例代码:

// web componentclass inputage extends htmlelement {  constructor() {    super();  }  // connect component  connectedcallback() {    const shadow = this.attachshadow({ mode: 'clod' });    shadow.innerhtml = `<input type="number" placeholder="age" min="18" max="120" />`;  }}// register componentcustomelements.define( '环太平洋什么时候上映input-age', inputage );

wc 组件被使用后

<form id="myform">  <input type="text" name="your-name" placeholder="name" />  <input-age name="your-age"></input-age>   <button>submit</button></form> <script> const form = document.getelementbyid('myform');   form.addeventliste逼近反义词ner('submit', e => {        e.preventdefault();    console.log('submitted data:');     const data = new formdata(form);    for (let nv of data.entries()) {      console.log(`  ${ nv[0] }: ${ nv[1] }`);    }   });</script>

提交的时候无法获取input-agevalue。当然会有解决方案,但会很复杂。

5、其它

此外,缺少数据绑定和状态管理也是 wc 存在的缺陷,此处不再赘述。

写在后面

wc 指在丰富 html 的 dom 特性,让 html 拥有更强大的复用能力

wc 可以直接当做原生标签,在任何前端框架和无框架中运行

结合当下的主流技术栈来说,wc 当前主要问题在于复杂的组件中,数据通信和事件传递存在一定使用成本

兼容问题,比如可以覆盖内部样式的:part方法

以上就是web componentd组件内部事件回调及痛点剖析的详细内容,更多关于web componentd事件回调及痛点的资料请关注www.887551.com其它相关文章!

本文发布于:2023-04-03 22:45:33,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/3d1fc7139738d26f02d85a0153189b5d.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Web componentd组件内部事件回调及痛点剖析.doc

本文 PDF 下载地址:Web componentd组件内部事件回调及痛点剖析.pdf

标签:组件   事件   样式   标签
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图