首页 > 其他分享 >Web Component 简单示例

Web Component 简单示例

时间:2023-07-28 15:15:31浏览次数:38  
标签:Web style TodoItem 示例 Component toggleBtn extends template class

前言

学习内容来源:

基本概念

  • Custom element(自定义元素):class或者function,定义组件api
  • Shadow DOM(影子 DOM):用于将封装的“影子”DOM 树附加到元素(与主文档 DOM 分开呈现)。使元素私有化,样式不会相互干扰。
  • HTML template(HTML 模板): <template><slot> 可以编写不在呈现页面中显示的标记模板。

调试

谷歌浏览器:设置——preferences——Elements——Show user agent shadow DOM打钩

自定义组件

  1. 注册组件
// TodoItem.js

class TodoItem extends HTMLElement{}
customElements.define("todo-item", TodoItem)  // 传入组件名称与组件
<todo-item></todo-item>
  1. 创建模板
// TodoItem.js

const template=document.createElement("template")
template.innerHTML=`
    <style>
        label{
            display: block;
        }
        .description{
            color: #a9a9a9;
            font-size: .8em;
        }
    </style>

    <label>
        <input type="checkbox" />
        <slot></slot>
        <span class="description">
            <slot name="description"></slot>
        </span>
    </label>
`
  1. 打开shadow dom
// TodoItem.js

class TodoItem extends HTMLElement{
    constructor(){
        super()
        // ++ 打开shadow dom
        const shadowDom = this.attachShadow({ mode : "open"})
        // ++ 将模板克隆进去
        shadowDom.appendChild(template.content.cloneNode(true))
    }
}
<todo-item>
    <!--内容会加到默认slot中 -->
    todo1    
    
    <!--内容会加到description slot中 -->
    <span slot="description">其他描述</span> 
</todo-item>
  1. 生命周期
// TodoItem.js

class TodoItem extends HTMLElement{
    constructor(){
        super()
        const shadowDom = this.attachShadow({ mode : "open"})
        shadowDom.appendChild(template.content.cloneNode(true))
    }
    
	// ++ 自定义元素挂载时被调用
	connectedCallback() {}
	// ++ 自定义元素卸载时被调用
	disconnectedCallback() {}
}

内置元素扩展-可展开列表

  1. 注册组件:继承ul标签
// ExpandableList.js
class ExpandableList extends HTMLUListElement {}

customElements.define('expandable-list', ExpandableList, {
   extends: 'ul',
});
  1. 定义组件
class ExpandableList extends HTMLUListElement {
   constructor() {
      super();
      this.style.position = 'relative';

	  // 创建一个子元素
      this.toggleBtn = document.createElement('button');
      this.toggleBtn.style.position = 'absolute';
      this.toggleBtn.style.border = 'none';
      this.toggleBtn.style.background = 'none';
      this.toggleBtn.style.padding = 0;
      this.toggleBtn.style.top = 0;
      this.toggleBtn.style.left = '5px';
      this.toggleBtn.style.cursor = 'pointer';
      this.toggleBtn.innerText = '>';
      this.appendChild(this.toggleBtn);
      
	 // 定义点击事件
      this.toggleBtn.addEventListener('click', () => {
         this.dataset.expanded = !this.isExpanded;
      });
      
   }

   // 计算属性
   get isExpanded() {
      return (
         this.dataset.expanded !== 'false' && this.dataset.expanded !== null
      );
   }

   // 监听属性
   static get observedAttributes() {
      return ['data-expanded'];
   }

  // 监听到上方属性变化后调用
   attributeChangedCallback(name, oldValue, newValue) {
      this.updateStyles();
   }


   updateStyles() {
      const transform = this.isExpanded ? 'rotate(90deg)' : '';
      this.toggleBtn.style.transform = transform;
      [...this.children].forEach((child) => {
         if (child !== this.toggleBtn) {
            child.style.display = this.isExpanded ? '' : 'none';
         }
      });
   }
   
   // 挂载后调用
   connectedCallback() {
      this.updateStyles();
   }
}

customElements.define('expandable-list', ExpandableList, {
   extends: 'ul',
});
  1. 使用:通过is传入扩展
<ul is="expandable-list" data-expanded>
    <li>apple</li>
    <li>banana</li>
</ul>

标签:Web,style,TodoItem,示例,Component,toggleBtn,extends,template,class
From: https://www.cnblogs.com/sanhuamao/p/17587646.html

相关文章

  • C# webapi 参数(AI)
    在C#WebAPI中,参数是用于接收和处理HTTP请求中传递的数据的方式。WebAPI支持不同类型的参数,包括路由参数、查询字符串参数、请求体参数和标头参数。以下是一些常用的WebAPI参数类型:路由参数(RouteParameters):路由参数从URL的路径中提取值。在WebAPI中,通常使用路由模板来定义路由......
  • WebFlux
    WebFlux个人理解:webflux跟springmvc功能类似,区别是实现异步非阻塞。是spring家族中的响应式web框架。以全新的java9后的响应式编程编写,具有前瞻性。同时,webflux是基于Reactor框架,并且以数据流处理为中心的框架。类型java中Stream流,具有流的一些特点。(需要关闭流了才传递)WebFlu......
  • # mac 使用 Docker 部署Python服务和web app服务最佳实践~保姆级教程
    目录部署Python后端服务部署python服务最佳实践部署web前端应用Docker同步到另一台设备部署Python后端服务部署python服务拉取python镜像dockerpullpython:3.9.13查看镜像dockerimages运行容器dockerrun-p9000:8080-it--namepytest-v~/PycharmPr......
  • ruby web 实战(10)-postgresql(1)
    目录user和installuser和install用户建议运行PostgreSQL在单独的用户帐户下。此用户帐户应仅拥有由服务器,不应与其他守护进程共享.特别是,建议该用户帐户不拥有PostgreSQL可执行文件,以确保受损的服务器进程无法修改这些可执行文件。PostgreSQL的预打包版本通常会在软......
  • 如何用DHTMLX组件为Web应用创建甘特图?(一)
    dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一,DHTMLXGantt组件提供了能提升研发甘特图功能所需的重要工具。在这篇文章中,您将学习如何添加一个基本......
  • linux可视化管理 | webmin
    摘要介绍linux可视化管理介绍webmin如何使用一、基本介绍Webmin是功能强大的基于Web的Unix/linux系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理操作。除了各版本的linux以外还可用于:AIX、HPUX、Solaris、Unixware、lrix和FreeBSD等系统(这几......
  • 细说强网杯Web辅助
    8/27文章共计1908个词包括三段长代码今天的内容无图,流量不预警和我一起阅读吧1写在前面这里就借由强网杯的一道题目“Web辅助”,来讲讲从构造POP链,字符串逃逸到最后获取flag的过程2题目源码index.php获取我们传入的username和password,并将其序列化储存...if(isset($_GET['username......
  • 看漫画学技术 0元包邮送Web开发必读“漫画书”
    对于网络安全学习者来说,如果能深刻理解HTTP协议,就能在日常Web安全运维工作中快速定位问题。但是关于HTTP的知识,五花八门,比较零散,如果没有什么基础去读TCP/IP权威指南的话,倒是大而全了,关键是你能看得下去吗?那么在这里特别推荐这本适合网安小白零基础必看的漫画书——《图解HTTP》。......
  • 八、Web应用模式
    8.1、web应用模式在开发Web应用中,有两种应用模式:前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。前后端分离【把前端的界面效果(html,css,js分离到另一个服务端,python服务端只需要返回数据即可)】前端形成一个独立的网站,服务端构成一个独立的网......
  • Game as a Service —— 开源云游戏搭载WebRTC
    软件即服务,基础架构即服务,平台即服务,通信平台即服务,视频会议即服务,那么,游戏即服务(GameasaService)如何呢?已经有不少科技公司试水云游戏,最著名的要数Google的Stadia。对WebRTC来说,Stadia已经算是老朋友了,但是其他云游戏也能以同样的方式运用WebRTC吗?ThanhNguyen研究了他自己的开......