stencilJs学习之构建 Drawer 组件
前言
在之前的学习中,我们已经掌握了 stencilJs 中的一些核心概念和基础知识,如装饰器 Prop、State、Event、Listen、Method、Component 以及生命周期方法。这些知识是构建复杂组件和应用的基础,而抽屉组件是一个很好的示例,能够综合运用这些知识,让我们更深入地理解它们的作用和用法。
为什么选择抽屉组件
为什么选择抽屉组件作为综合练习呢?因为抽屉组件是现代 Web 应用中常见的 UI 元素,具有以下特点:
- 交互性强:抽屉组件允许用户在不离开当前页面的情况下进行额外操作,因此它需要响应用户的交互行为,如打开、关闭等。
- 多状态管理:抽屉可以有多种状态,比如打开、关闭、正在拖拽等,这就需要使用
State装饰器来管理和控制组件内部的状态。 - 属性传递:抽屉可能需要一些用户自定义的属性,如标题、内容、位置等。这就需要使用
Prop装饰器来接收外部传递的数据。 - 自定义事件:抽屉的打开和关闭需要触发自定义事件,以便其他组件或应用能够响应状态变化。
- 方法调用:用户可能需要通过调用方法来控制抽屉的行为,例如通过点击按钮来打开或关闭抽屉,这就需要使用
Method装饰器来定义公开方法。 - 生命周期方法:抽屉在不同的生命周期阶段可能需要执行特定的逻辑,例如组件初始化、渲染、卸载等。这就需要使用生命周期方法来实现这些逻辑。
- 可复用性:抽屉是一个通用的 UI 元素,在不同的场景中都可能被使用,因此需要设计良好的组件结构和接口,以实现高度的可复用性。
通过实际构建一个抽屉组件,我们能够在综合应用的背景下,更深入地理解这些概念的作用和相互关系。同时,这也为我们未来在实际项目中构建更复杂的组件和应用奠定了坚实的基础。抽屉组件的案例将帮助我们更好地运用 stencilJs 的知识,从而成为更有信心和能力的前端开发者。
实现抽屉组件
创建一个项目
使用以下的命令创建一个 Stencil 项目
#使用 npm
npm init stencil
#使用 yarn
yarn create stencil
#使用 pnpm
pnpm create stencil
创建成功,终端显示如下

创建一个组件
Stencil 项目内置一个生成组件命令 generate,使用下面的命令生成一个组件
#使用 npm
npm run generate
#使用 yarn
yarn generate
#使用 pnpm
pnpm run generate
执行之后会让用户输入一个组件的名字(以-作为连字符),输入之后按回车键会让用户选择要生成的文件,选择之后按回车就能生成一个组件了。你可以在 src/components 目录下看到 ce-drawer, 如下图

实现组件
首先,创建组件的 HTML 结构:
import { Host, h } from '@stencil/core';
@Component({
tag: 'ce-drawer',
styleUrl: 'ce-drawer.css',
shadow: true,
})
export class CeDrawer {
renderHeader() {
if (this.showHeader) {
return (
<div class="ivy-drawer-header">
<slot name="header">{this.header}</slot>
</div>
);
} else {
return null;
}
}
render() {
return (
<Host>
<div class="ivy-mask"></div>
<div class="ivy-drawer">
{this.renderHeader()}
<div class="ivy-drawer-body">
<slot></slot>
</div>
</div>
</Host>
);
}
}
接下来,声明 prop:
import { Component, Event, EventEmitter, Host, Method, Prop, Watch, h } from '@stencil/core';
@Component({
tag: 'ce-drawer',
styleUrl: 'ce-drawer.css',
shadow: true,
})
export class CeDrawer {
@Prop({
attribute: 'show',
mutable: true,
reflect: true,
})
visible: Boolean = false;
@Prop() width: string = '36%';
@Prop({
attribute: 'show-header',
mutable: true,
reflect: true,
})
showHeader: boolean = false;
@Prop({
attribute: 'header',
})
header: string = '';
@Prop({
attribute: 'mask-closable',
mutable: true,
reflect: true,
})
maskClosable: boolean = true;
@Prop({
attribute: 'placement',
mutable: true,
reflect: true,
})
placement: string = 'right';
/**监听传入的 placement 是否符合要求*/
@Watch('placement')
validateName(val: string) {
const flag = ['left', 'right', 'top', 'bottom'].includes(val);
if (!flag) {
throw new Error('placement 必须是 left/right/top/bottom 其中之一');
}
}
renderHeader() {
if (this.showHeader) {
return (
<div class="ivy-drawer-header">
<slot name="header">{this.header}</slot>
</div>
);
} else {
return null;
}
}
render() {
return (
<Host show={this.visible}>
<div class="ivy-mask" onClick={this.maskClose.bind(this)}></div>
<div
class="ivy-drawer"
style={{ width: ['left', 'right'].includes(this.placement) ? this.width : '100%', height: ['top', 'bottom'].includes(this.placement) ? this.width : '100%' }}
>
{this.renderHeader()}
<div class="ivy-drawer-body">
<slot></slot>
</div>
</div>
</Host>
);
}
}
接着,声明自定义事件和遮罩层点击事件:
// ...
maskClose() {
if (this.maskClosable) {
this.visible = false;
}
}
@Event() closed: EventEmitter;
closeHandler() {
this.closed.emit();
}
最后,声明外部可用的辅助方法,例如显示/关闭 Drawer 组件:
// ...
@Method()
async open() {
this.visible = true;
}
@Method()
async close() {
this.closeHandler();
this.visible = false;
}
源码
stencilJs学习之构建 Drawer 组件的更多相关文章
- 【JAVASCRIPT】React学习-如何构建一个组件
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 组件化思想 组件就是 UI + UI 交互逻辑,组件有三个常规map , 分别为state 状态 . props 数据 ...
- stenciljs 学习十三 @stencil/router 组件使用说明
@stencil/router 组件包含的子组件 stencil-router stencil-route-switch stencil-route stencil-route-link stenci ...
- stenciljs 学习四 组件装饰器
stenciljs 可以方便的构建交互式组件 支持以下装饰器 component prop watch state method element component 说明 component 包含ta ...
- Spring实战第五章学习笔记————构建Spring Web应用程序
Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...
- Spark学习之基础相关组件(1)
Spark学习之基础相关组件(1) 1. Spark是一个用来实现快速而通用的集群计算的平台. 2. Spark的一个主要特点是能够在内存中进行计算,因而更快. 3. RDD(resilient di ...
- day 82 Vue学习三之vue组件
Vue学习三之vue组件 本节目录 一 什么是组件 二 v-model双向数据绑定 三 组件基础 四 父子组件传值 五 平行组件传值 六 xxx 七 xxx 八 xxx 一 什么是组件 首先给 ...
- (译文)开始学习Vue——构建你的第一个Vue应用
我们要构建如下组件:(最终代码在这里:https://codesandbox.io/s/38k1y8x375) 开始 Vue是支持单文件组件的,但是我们不准备这么做.你也可以构建一个全局的组件,通过V ...
- DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...
- Spring boot学习1 构建微服务:Spring boot 入门篇
Spring boot学习1 构建微服务:Spring boot 入门篇 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
随机推荐
- 【GiraKoo】线程本地存储(Thread Local Storage, TLS)
[技术分享]线程本地存储(Thread Local Storage, TLS) 在项目开发中,遇到了关于TLS相关的问题.为了了解该机制的用途,在微软的官网查找了一些资料. 本文参考官方文档, 简单介 ...
- 【Java】Java代码拷贝文件的速度
Java代码拷贝文件的速度究竟有多快? 前言 最近学习Java到了流处理,其中有种流叫FileInputStream和FileOutputStream,简单来说,就是操作文件的,老师给我们示范了一个非 ...
- PlayWright(一)
1.如何安装? 安装playwright只需要一条命令,就是pip安装命令,命令如下: pip install playwright 注:playwright需要Python3.7或更新的版本 2.然 ...
- django的部署在centos
虚拟环境 #virtualenv是一个创建独立python环境的工具 sudo pip install virtualenv #virtualenvwrapper将所有的虚拟环境统一管理,留意安装路径 ...
- How to fix the problem that Raspberry Pi cannot use the root user for SSH login All In One
How to fix the problem that Raspberry Pi cannot use the root user for SSH login All In One 如何修复树莓派无法 ...
- PicoRV32-on-PYNQ-Z2: An FPGA-based SoC System——RISC-V On PYNQ项目复现
本文参考: 1️⃣ 原始工程 2️⃣ 原始工程复现教程 3️⃣ RISCV工具链安装教程 本文工程: https://bhpan.buaa.edu.cn:443/link/4B08916BF2CDB4 ...
- 【Netty】03-进阶
三. Netty 进阶 1. 粘包与半包 1.1 粘包现象 服务端代码 public class HelloWorldServer { static final Logger log = Logger ...
- 使用 Sa-Token 实现不同的登录模式:单地登录、多地登录、同端互斥登录
一.需求分析 如果你经常使用腾讯QQ,就会发现它的登录有如下特点:它可以手机电脑同时在线,但是不能在两个手机上同时登录一个账号. 同端互斥登录,指的就是:像腾讯QQ一样,在同一类型设备上只允许单地点登 ...
- JS中使用Promise.all控制所有的异步请求都完成后,在执行后续逻辑
使用场景为,在js中连续的几个异步耗时操作,后面的耗时操作需要使用第一个操作的返回结果.例如调用ajax异步接口,需要先创建完主表,然后拿到主表id在去循环创建明细表,等全部创建完成后,弹出提示来,或 ...
- 利用Aspose.Word对Word文件添加印章处理以及实现业务数据的替换处理
有时候,我们在处理大量文档的时候,需要批量给Word文档添加印章处理,方便打印操作,本篇随笔介绍利用Aspose.Word对Word文件添加印章处理以及实现业务数据的替换处理. 1.利用Aspose. ...