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应用的初始搭建以及开发过程.该框 ...
随机推荐
- DP杂谈【持续更新中】
什么是DP? 推荐看一下. 正文 滚动数组优化 在一些空间贼小,时间还好的 DP 题目里,会用到优化空间的小技♂巧--滚动数组优化. 滚动数组,顾名思义,一个会滚动的数组,主要是怎样个滚法呢?接下来我 ...
- springboot 多环境配置及配置文件的位置
了解即可
- 在R中子集化数据框的5种方法
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 通常,我们在使用大型数据集时,只会对其中的一小部分感兴趣,用以进行特定分析. 那么,我们应该如 ...
- 【RS】ENVI5.6.3 图像融合
图像融合是将低空间分辨率的多光谱图像或高光谱数据与高空间分辨率的单波段图像重采样生成一幅高分辨率多光谱图像的遥感图像处理技术,使得处理后的图像既有较高的空间分辨率,又具有多光谱特征.一 ...
- 如何让别人访问你本地允许的Vue本地项目
步骤一: 将config/index.js 中的host: localhost 改为 host:'0.0.0.0'步骤二:在package.json 将scripts 下面的dev 后 ...
- Hive常见时间日期函数的使用与问题整理
这里整理一下Hive常见的时间函数和日期函数和用法,作为平时数据处理过程的一个检索和记录. 平时在数据处理过程中,如果不经常使用时间函数,一时间遇到一些时间上的处理,难免会想不起来. hive本身提供 ...
- 02-面试必会-SSM框架篇
01-什么是 Spring IOC 和 DI ? IOC : 控制翻转 , 它把传统上由程序代码直接操控的对象的调用权交给容 器,通过容器来实现对象组件的装配和管理.所谓的"控制反转&quo ...
- 春秋杯春季联赛&&ciscn2023华北赛区部分题解
前言 复现几个比赛时没做出来的题 1.[CISCN 2023 华北赛区]ez_ruby 查文档可知 ruby内置的open函数,如果第一个字符是管道符|,后面就可以接命令.这可能是考察涉猎的知识范围广 ...
- 面试官:讲讲MySql索引失效的几种情况
索引失效 准备数据: CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAUL ...
- SpringBoot 如何优雅的进行全局异常处理?
在SpringBoot的开发中,为了提高程序运行的鲁棒性,我们经常需要对各种程序异常进行处理,但是如果在每个出异常的地方进行单独处理的话,这会引入大量业务不相关的异常处理代码,增加了程序的耦合,同时未 ...