前言

在之前的学习中,我们已经掌握了 stencilJs 中的一些核心概念和基础知识,如装饰器 PropStateEventListenMethodComponent 以及生命周期方法。这些知识是构建复杂组件和应用的基础,而抽屉组件是一个很好的示例,能够综合运用这些知识,让我们更深入地理解它们的作用和用法。

为什么选择抽屉组件

为什么选择抽屉组件作为综合练习呢?因为抽屉组件是现代 Web 应用中常见的 UI 元素,具有以下特点:

  1. 交互性强:抽屉组件允许用户在不离开当前页面的情况下进行额外操作,因此它需要响应用户的交互行为,如打开、关闭等。
  2. 多状态管理:抽屉可以有多种状态,比如打开、关闭、正在拖拽等,这就需要使用 State 装饰器来管理和控制组件内部的状态。
  3. 属性传递:抽屉可能需要一些用户自定义的属性,如标题、内容、位置等。这就需要使用 Prop 装饰器来接收外部传递的数据。
  4. 自定义事件:抽屉的打开和关闭需要触发自定义事件,以便其他组件或应用能够响应状态变化。
  5. 方法调用:用户可能需要通过调用方法来控制抽屉的行为,例如通过点击按钮来打开或关闭抽屉,这就需要使用 Method 装饰器来定义公开方法。
  6. 生命周期方法:抽屉在不同的生命周期阶段可能需要执行特定的逻辑,例如组件初始化、渲染、卸载等。这就需要使用生命周期方法来实现这些逻辑。
  7. 可复用性:抽屉是一个通用的 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 组件的更多相关文章

  1. 【JAVASCRIPT】React学习-如何构建一个组件

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 组件化思想 组件就是 UI + UI 交互逻辑,组件有三个常规map , 分别为state 状态 . props 数据 ...

  2. stenciljs 学习十三 @stencil/router 组件使用说明

    @stencil/router 组件包含的子组件 stencil-router stencil-route-switch stencil-route stencil-route-link stenci ...

  3. stenciljs 学习四 组件装饰器

    stenciljs 可以方便的构建交互式组件 支持以下装饰器 component prop watch state method element component 说明 component 包含ta ...

  4. Spring实战第五章学习笔记————构建Spring Web应用程序

    Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...

  5. Spark学习之基础相关组件(1)

    Spark学习之基础相关组件(1) 1. Spark是一个用来实现快速而通用的集群计算的平台. 2. Spark的一个主要特点是能够在内存中进行计算,因而更快. 3. RDD(resilient di ...

  6. day 82 Vue学习三之vue组件

      Vue学习三之vue组件   本节目录 一 什么是组件 二 v-model双向数据绑定 三 组件基础 四 父子组件传值 五 平行组件传值 六 xxx 七 xxx 八 xxx 一 什么是组件 首先给 ...

  7. (译文)开始学习Vue——构建你的第一个Vue应用

    我们要构建如下组件:(最终代码在这里:https://codesandbox.io/s/38k1y8x375) 开始 Vue是支持单文件组件的,但是我们不准备这么做.你也可以构建一个全局的组件,通过V ...

  8. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  9. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

  10. Spring boot学习1 构建微服务:Spring boot 入门篇

    Spring boot学习1 构建微服务:Spring boot 入门篇 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

随机推荐

  1. Java商城网站系统设计与实现(带源码)

    基于Java的商城网站系统设计与实现 功能介绍 平台采用B/S结构,后端采用主流的Springboot框架进行开发,前端采用主流的Vue.js进行开发. 整个平台包括前台和后台两个部分. 前台功能包括 ...

  2. vue使用iframe嵌入html,js方法互调

    前段时间 使用h5搞了个用cesium.js做的地图服务功能,后来想整合到vue项目,当然最简单的就是iframe直接拿来用了. 但html和vue的方法交互就是成了问题,vue调用html种方法还好 ...

  3. ODOO13之六:Odoo 13开发之模型 – 结构化应用数据

    在本系列文章第三篇Odoo 13 开发之创建第一个 Odoo 应用中,我们概览了创建 Odoo 应用所需的所有组件.本文及接下来的一篇我们将深入到组成应用的每一层:模型层.视图层和业务逻辑层. 本文中 ...

  4. CANoe_系统变量的创建过程

    在Canoe中创建系统变量,可以用于定义和管理与CAN网络通信相关的参数和配置.遵循以下步骤: 1.打开Canoe 启动Canoe软件. 2.打开项目 在Canoe的菜单栏中,选择"File ...

  5. (翻译)Rust中的设计模式(1-Use borrowed types for arguments)

    引言 设计模式 在开发程序中,我们必须解决许多问题.一个程序可以看作是一个问题的解决方案.它也可以被看作是许多不同问题的解决方案的集合.所有这些解决方案共同解决一个更大的问题. 在Rust中的设计模式 ...

  6. flutter系列之:做一个图像滤镜

    目录 简介 我们的目标 带滤镜的图片 打造filter按钮 打造可滑动按钮 最后要解决的问题 简介 很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过c ...

  7. ReactNative原理与核心知识点

    React Native特点 跨平台 使用js写出页面组件代码被React框架统一转成Virtual DOM树,Virtual DOM树是UI结构的一层抽象,可以被转换成任何支持端的UI视图. Rea ...

  8. 【论文阅读】Pyramid Scene Parsing Network

    解决的问题:(FCN) Mismatched Relationship: 匹配关系错误,如将在水中的船识别为车. Confusion Categories: 模糊的分类,如 hill 和 mounta ...

  9. 浏览器手动设置Cookie

    浏览器手动设置Cookie js代码: document.cookie="{KEY}={Value}":  可多次执执行.

  10. MIT6.s081/6.828 lectrue1:Introduction and examples

    目前课程官网能够查到 2020,2021.2022 秋季的课程表,但是视频都是 2020 年录制的那一版 简单复习+回顾下自己的 OS 学习之旅 参考资料: 官网:https://pdos.csail ...