• 主页
  • 归档
  • 分类
  • 照片墙
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 分类
  • 照片墙
  1. 1. 基本用法
    1. 1.1. 组件模板
  2. 2. shadow DOM
  3. 3. 组件传参

Web Components

2020-11-03 17:15:36
总字数 607
预计阅读时间 2 分钟

组件化封装是前端的发展趋势,现在的主流框架比如Vue、React也都实现了这个目标
浏览器也是支持原生组件的,目前在各种浏览器也已经普及,可以在开发当中使用

基本用法

1
2
3
4
5
6
7
8
9
10
11
12
class UserInfo extends HTMLElement {
constructor() {
super()
var p1 = document.createElement('p')
p1.innerText = 'UserName: Sookie'
this.appendChild(p1)
var p2 = document.createElement('p')
p2.innerText = 'E-mail: colorfulsweet@gmail.com'
this.appendChild(p2)
}
}
window.customElements.define('user-info', UserInfo)

这里的构造器内部执行的事情就是生成一个DOM树
customElements.define表示声明一个自定义组件
这样在页面中直接使用自定义标签<user-info></user-info>就可以使用该组件了

组件模板

但是如果组件内DOM结构复杂,上面的写法还是有些过于繁琐了
于是我们可以在页面内声明一个模板

1
2
3
4
<template id="userInfo">
<p>UserName: Sookie</p>
<p>E-mail: colorfulsweet@gmail.com</p>
</template>
1
2
3
4
5
6
7
8
9
class UserInfo extends HTMLElement {
constructor() {
super()
var templateElem = document.getElementById('userInfo')
var content = templateElem.content.cloneNode(true)
this.appendChild(content)
}
}
window.customElements.define('user-info', UserInfo);

组件template

shadow DOM

独立封装的一段html代码块,其中包含的html标签、CSS样式、js行为都可以隔离、隐藏起来
它就是为组件封装而生的特性,父子组件之间不会互相干扰

其实浏览器本身就有一些内置的shadow DOM
需要打开F12的设置当中的Show user agent shadow DOM
就可以看到诸如<input type="range" />的内部结构了
input range

可以把它看做浏览器封装的一个组件
如果要把我们的组件也封装为这样的一个结构(虽然可以看到组件中的结构,但是内外隔离,外部无法对内部的DOM进行操作)
可以使用如下的方式

1
2
3
4
5
6
7
8
9
10
class UserInfo extends HTMLElement {
constructor() {
super()
var shadow = this.attachShadow( { mode: 'closed' } )
var templateElem = document.getElementById('userInfo')
var content = templateElem.content.cloneNode(true)
shadow.appendChild(content)
}
}
window.customElements.define('user-info', UserInfo)

shadow DOM
此时在组件内部定义的样式就只应用在该组件内,不会对外部造成影响了

组件传参

接收传参的方式就是获取DOM上的属性

1
2
3
4
var templateElem = document.getElementById('userInfo')
var content = templateElem.content.cloneNode(true)
content.querySelector('#name').innerText = this.getAttribute('name')
shadow.appendChild(content)
  • 组件化
  • 前端杂烩

扫一扫,分享到微信

TensorFlow.js初见(1)
图片加载失败处理 
© 2024 夏夜梦星辰
鲁ICP备19028444号
Power By Hexo
  • 所有文章
  • 友情链接
  • 关于我
{{searchItem.query}}
标签: 分类:
  • maven
  • 持续集成
  • JMS
  • 线程
  • JavaScript
  • ECMAScript6
  • 单元测试
  • Promise
  • Web Worker
  • 函数
  • prototype
  • 模块化
  • 正则表达式
  • 数据库
  • MongoDB
  • 索引
  • 集群
  • 全文检索
  • flutter
  • dart
  • git
  • 版本控制
  • linux
  • shell
  • docker
  • nginx
  • jenkins
  • opencv
  • vim
  • react
  • react native
  • 前端
  • css
  • HTML5
  • Hexo
  • sass
  • Three.js
  • TypeScript
  • Vue
  • 组件化
  • base64
  • webpack
  • nodejs
  • gulp
  • TensorFlow
  • 机器学习
  • 算法
  • 动态规划
  • 数据结构
  • Java
  • JavaScript
  • MongoDB
  • flutter
  • Git
  • linux
  • react
  • 前端杂烩
  • 男生女生
  • 算法
  • 十年饮冰,难凉热血
  • †少女癌†
  • 猫与向日葵
  • coderfun
  • JENKINS
  • API管理后台
愿你最终能接纳每一面每一种的自己
独自活着便是团圆