其实并没有所谓的 stencil Event,相反 stencil 鼓励使用 DOM event。然而,Stencil 提供了一个 API 来指定组件可以触发的事件,以及组件监听的事件。 这是通过 Event()和 Listen()装饰器实现的。

Event 装饰器

组件可以使用事件发射器装饰器发送数据和事件。

要将自定义 DOM 事件分发给其他组件处理,可以使用@Event()装饰器。

import { Event, EventEmitter } from '@stencil/core';

...
export class TodoList { @Event() todoCompleted: EventEmitter<Todo>; todoCompletedHandler(todo: Todo) {
this.todoCompleted.emit(todo);
}
}

上面的代码将 dispatch 一个名为 todoCompleted 的自定义 DOM 事件。

EventOptions

interface EventOptions {
/**
* 自定义事件名称
*/
eventName?: string;
/**
* 表明事件是否允许冒泡
*/
bubbles?: boolean; /**
* 表明事件是否允许取消
*/
cancelable?: boolean; /**
* 表示事件是否可以跨越shadow DOM和regular DOM的边界
*/
composed?: boolean;
}

Listen 装饰器

Listen() 装饰器用于监听 DOM 事件,包括从 @Events 分发的事件。当组件从 DOM 中添加或删除时,事件监听器会自动添加或删除。

在下面的示例中,假设子组件 TodoList 使用 EventEmitter 触发 todoCompleted 事件。

import { Listen } from '@stencil/core';

...
export class TodoApp { @Listen('todoCompleted')
todoCompletedHandler(event: CustomEvent<Todo>) {
console.log('Received the custom todoCompleted event: ', event.detail);
}
}

ListenOptions

interface ListenOptions {
target?: "body" | "document" | "window"; // 如果target属性不设置值,则默认监听host(宿主元素)
capture?: boolean;
passive?: boolean;
}

使用组件的自定义事件

在 jsx 中使用

// 在stencilJs项目内使用
import { Event, EventEmitter } from '@stencil/core'; ...
export class TodoList { @Event() todoCompleted: EventEmitter<Todo>; todoCompletedHandler(todo: Todo) {
this.todoCompleted.emit(todo);
}
}

常规使用

<todo-list></todo-list>
<script>
const todoListElement = document.querySelector("todo-list");
todoListElement.addEventListener("todoCompleted", (event) => {
/* your listener */
});
</script>

结束语

至此,我们已经基本把 StencilJs 的相关基础知识已经学习的差不多了,由于 stencilJs 使用的 tsx

来开发的,所以在下一章节中将会学习如何使用 tsx

StencilJs学习之事件的更多相关文章

  1. stenciljs 学习五 事件

    组件可以使用Event Emitter装饰器发送数据和事件. Event 定义 参考: import { Event, EventEmitter } from '@stencil/core'; ... ...

  2. Vue – 基础学习(4):事件修饰符

    Vue – 基础学习(3):事件修饰符

  3. 【JavaScript学习】-事件响应,让网页交互

    什么是事件: JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单 ...

  4. 系统学习DOM事件机制

    本文将从以下几个方面介绍DOM事件: 基本概念:DOM事件的级别 DOM事件模型,事件流 描述DOM事件捕获的具体流程 Event对象的常见应用 自定义事件 DOM事件的级别 //DOM0 eleme ...

  5. stenciljs 学习九 使用jsx

    可以使用jsx 方便组件的开发 基本格式 主要是render 函数 class MyComponent { render() { return ( <div> <h1>Hell ...

  6. stenciljs 学习四 组件装饰器

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

  7. C#基础学习之事件的理解和应用

    事件的使用和委托类似,也是分四步来实现:声明委托.定义事件.注册事件.调用事件 我们先看一下事件的定义 //定义委托 public delegate void PublishEventHandler( ...

  8. JS学习笔记-事件绑定

    一.传统事件模型 传统事件模型中存在局限性. 内联模型以HTML标签属性的形式使用,与HTML混写.这样的方式无疑造成了改动以及扩展的问题,已经非常少使用了. 脚本模型是将事件处理函数写到js文件里, ...

  9. 微信小程序入门学习之事件 事件对象 冒泡非冒泡事件(1)

    这关于事件的学习,可以自己复制到微信开发者工具上自己运行试试. 首先这里有两个文件.js 和.wxml 文件 首先给出.js文件下代码 // pages/news/news.js Page({ /** ...

  10. Flex事件机制学习-自定义事件实现类间通信 .

    今天,学习Flex自定义事件,可以使两个类通信,定义一个Main类. public class Main extends Sprite     {            public function ...

随机推荐

  1. STM32 HAL库学习 (2) USART实验

    使用STM32F407 串口:PA9.PA10(利用CH340G驱动) 一. stm32f4xx_hal_uart.c 函数说明 HAL_UART_Init 函数 要使用一个外设首先要对它进行初始化, ...

  2. 容器云平台监控告警体系(三)—— 使用Prometheus Operator部署并管理Prometheus Server

    1.概述 Prometheus Operator是一种基于Kubernetes的应用程序,用于管理Prometheus实例和相关的监控组件.它是由CoreOS开发的开源工具,旨在简化Prometheu ...

  3. Spring(Bean详解)

    GoF之工厂模式 GoF是指二十三种设计模式 GoF23种设计模式可分为三大类: 创建型(5个):解决对象创建问题. 单例模式 工厂方法模式 抽象工厂模式 建造者模式 原型模式 结构型(7个):一些类 ...

  4. 逍遥自在学C语言 | 位运算符^的高级用法

    前言 在上一篇文章中,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一 ...

  5. $.set() 处理非响应式案例

    <template> <div id="app"> <ul> <li v-for="item in list" :ke ...

  6. Django基于一对多的正向查询和反向查询

    1.正向查询 obj = models.User.objects.get(name='longge') name = obj.group.name print(name) # 肖邦组 2.反向查询 & ...

  7. 天梯赛L1-027 出租

    一.问题描述 下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破.其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index ...

  8. [C++核心编程] 5 文件操作

    文章目录 5 文件操作 5.1文本文件 5.1.1写文件 5.1.2读文件 5.2 二进制文件 5.2.1 写文件 5.2.2 读文件 5 文件操作 程序运行时产生的数据都属于临时数据,程序一旦运行结 ...

  9. 想打印k8s资源YAML结果搞懂了Client-Side & Server-Side Apply

    前言 由于查看k8s资源YAML时常看到沉长的YAML与手写的格式,相差甚远不利于阅读,经过探索官方文档,才理解什么是Client-Side & Server-Side Apply. 先看一下 ...

  10. stl------stack与queue

    stack与queue 一.stack 二.queue 例题:详见我的另一篇博文: 栈------表达式求值 http://www.cnblogs.com/Cloud-king/p/8453703.h ...