其实并没有所谓的 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. Windows 11 Update Download Error Solution - 0x80248007

    I had the same issue on a Windows 2019 virtual server while performing routine windows updates. The ...

  2. 每日复习关于static 饿汉式 懒汉式,单例设计模式

    1.1.static 的使用 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过 new 关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部 ...

  3. python-爬虫-css提取-写入csv-爬取猫眼电影榜单

    猫眼有一个电影榜单top100,我们将他的榜单电影数据(电影名.主演.上映时间.豆瓣评分)抓下来保存到本地的excle中 本案例使用css方式提取页面数据,所以会用到以下库 import time i ...

  4. idea 热部署插件JRebel

    idea 热部署插件JRebel ​ 当开始开发web项目的时候,需要频繁的修改web页面,此时如果频繁的重启变得很麻烦,因此,可以在idea中集成JRebel插件,改动代码之后不需要重新启动应用程序 ...

  5. 在Blazor中使用Chart.js

    1. 在Blazor中使用Chart.js 首先,从Chart.js官方网站下载Chart.js库文件. 推荐下载这个构建好的版本https://cdnjs.com/libraries/Chart.j ...

  6. MySQL之 InnoDB 内存结构

    从MySQL 5.5版本开始默认 使用InnoDB作为引擎,它擅长处理事务,具有自动崩溃恢复的特性,在日常开发中使用非常广泛 下面是官方的InnoDB引擎架构图,主要分为内存结构和磁盘结构两大部分. ...

  7. AndroidBanner - ViewPager 03

    AndroidBanner - ViewPager 03 上一篇文章,描述了如何实现自动轮播的,以及手指触摸的时候停止轮播,抬起继续轮播,其实还遗留了一些问题: 当banner不可见的时候,也需要停止 ...

  8. Java并发(一)----进程、线程、并行、并发

    一.进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存.在指令运行过程中还需要用到磁盘.网络等设备.进程就是用来加载指令.管理内存.管理 ...

  9. python 类中的属性排序

    可以使用Python中的类(class)来定义一个包含姓名和年龄的类.以下是一个示例代码: class Person: def __init__(self, name, age): self.name ...

  10. 高阶函数_函数柯里化 以及 setState中动态key

     使用柯里化: 1 state = { 2 username: "", 3 password: "", 4 }; 5 render() { 6 return ( ...