当前位置: 首页 > Web前端 > HTML

Web Components 系列(十一)—— 实现 MyCard 的可复用

时间:2023-03-28 13:08:06 HTML

WebComponents系列(十一)——实现MyCardSex的复用性基本为零。今天,我们使用具名的Slots发生在Templates中,然后在自定义元素中给Slots传值,以提高自定义元素的灵活性。传值分析是因为每个人的信息不一样,对应Templates,即className为.info-content的所有div的内容都是可变的。所有变量值汇总为:userNamegendernationbirthYearbirthYearbirthMonthbirthDayaddresscardNO也就是说对于每一个Card,自定义组件中都需要传入以上属性值。使用HTML标签自定义属性给自定义组件,除了Slots,还可以使用HTML标签自定义属性。第一步:我们在Templates内部的变量item父标签中添加一个id,例如:ProgrammingSamadhi

第二步:在自定义组件内部获取自己的用户定义的属性:classMyCardextendsHTMLElement{constructor(){super();this.shadow=this.attachShadow({mode:"open"});让tempEle=document.getElementById("card_layout");this.shadow.appendChild(tempEle.content);//获取并填写名称letuserName=this.getAttribute("userName")||“编程”;this.shadow.querySelector("#user_name").textContent=userName;//其余变量项的获取和设置过程相同}}第三步:在自定义元素的标签中添加相应的自定义属性:通过以上步骤,也可以达到自定义组件传值的效果,从而达到组件复用的目的。使用NamedSlots传值虽然上面通过HTML标签的自定义属性达到了传值的目的,但是JS部分的代码看起来不是很漂亮。接下来,我们将实现一个使用Slots传值的版本。第1步:将命名槽添加到模板作为占位符。姓氏
隐逸王
性别民族出现<插槽名称="birthYear">202212地址xx省xx市xx区xx单元xx楼xx室公民身份号码12345678901234567X第二步:在自定义元素中在标签ProgrammingSamadhiMale200222GalaxyGalaxySolarSystemGlobalVillageAsiaChinaBeautifulCommunity134098567432129485-ZH最终效果如下:实现一个网页显示多张如果MyCard想在同一个页面同时显示多张卡片,如果使用上面的代码,你会发现只有第一张有内容,其他都是空的。这是因为第一个MyCard实例在自身内部追加了Templates的内容,而其他实例获取到的tempEle.content是一个空节点。要解决这个问题,您需要在MyCard构造函数中克隆模板内容,而不是直接使用它:classMyCardextendsHTMLElement{constructor(){super();this.shadow=this.attachShadow({mode:"open"});让tempEle=document.getElementById("card_layout");this.shadow.appendChild(document.importNode(tempEle.content,true));}}customElements.define("my-card",MyCard);小结本文使用两种方式给自定义组件传值:HTML标签的自定义属性传值NamedSlots传值两种都可以使用,看情况和个人喜好。另外,还有一个细节需要注意:appendChild()方法会将传入的节点整个位置移动,传入的Node在DOM中的位置会发生变化。一般我们在调用appendChild()时,传入的Both都是克隆节点。~~本文到此结束,感谢阅读!~学习有趣的知识,认识有趣的朋友,塑造有趣的灵魂!大家好,我是〖编程三昧〗的作者王隐,我的公众号是《编程三昧》,欢迎关注,希望大家多多指教!