LitElement(五)事件
1、概述
1.1 在何处添加事件监听器
您需要以一种可以在事件发生之前触发的方法添加事件监听器。但是,为了获得最佳的加载性能,应尽可能晚添加事件监听器。
你可以在以下位置添加事件监听器:
1.1.1 组件的模板中
您可以在render函数内的模板中使用lit-html @event 绑定,将事件监听器添加到组件中。例如:
- render() {
- return html`<button @click="${this.handleClick}">`;
- }
1.1.2 在组件构造方法中
如果您需要监听将组件添加到DOM之前可能发生的事件,则可能需要在组件的构造函数中添加事件监听器。例如:
- constructor() {
- super();
- this.addEventListener('DOMContentLoaded', this.handleLoaded);
- }
1.1.3 在firstUpdated中
firstUpdated是一个LitElement生命周期回调。首次更新和渲染组件后,会触发firstUpdated。
如果您要处理的事件在第一次更新和呈现组件之前无法发生,那么在firstUpdated中为其添加监听器是安全有效的。
- firstUpdated(changedProperties) {
- this.addEventListener('click', this.handleClick);
- }
1.1.4 在connectedCallback中
connectedCallback是自定义元素API中的生命周期回调。
每当将自定义元素附加到文档连接的元素中时,connectedCallback都会触发。
如果您的组件将事件监听器添加到其自身或其子级以外的任何事物(例如,添加到Window,Document或主DOM中的某个元素),则应在connectedCallback中添加监听器,并在disconnectedCallback中将其删除。
- 删除disconnectedCallback中的事件监听器可确保在销毁组件或将其与页面断开连接时,将清除由组件分配的所有内存。
- 在connectedCallback(而不是例如构造函数或firstRendered)中添加事件侦听器可确保您的组件在断开连接并随后重新连接至DOM时将重新创建其事件侦听器。
例如:
- connectedCallback() {
- super.connectedCallback();
- document.addEventListener('readystatechange', this.handleChange);
- }
- disconnectedCallback() {
- document.removeEventListener('readystatechange', this.handleChange);
- super.disconnectedCallback();
- }
1.2 在事件处理函数中使用this
就像其他语言中的this一样,基于LitElement的组件的事件处理程序中的默认JavaScript上下文对象(this)是组件本身。
用法也是一样,您可以使用它来引用任何事件处理程序内的元素实例:
- class MyElement extends LitElement {
- render() {
- return html`<button @click="${this.handleClick}">click</button>`;
- }
- handleClick(e) {
- console.log(this.prop);
- }
- }
关于JavaScript的this指针详见MDN文档
1.3 从基于LitElement的组件触发事件
1.3.1 触发一个自定义事件
- class MyElement extends LitElement {
- render() {
- return html`<div>Hello World</div>`;
- }
- firstUpdated(changedProperties) {
- let event = new CustomEvent('my-event', {
- detail: {
- message: 'Something important happened'
- }
- });
- this.dispatchEvent(event);
- }
- }
1.3.2 触发一个标准事件
- class MyElement extends LitElement {
- render() {
- return html`<div>Hello World</div>`;
- }
- updated(changedProperties) {
- let click = new Event('click');
- this.dispatchEvent(click);
- }
- }
1.4 处理由基于LitElement的组件触发的事件
如果要从另一个LitElement或lit-html模板中监听从基于LitElement的组件触发的事件,则可以使用lit-html声明性事件语法:
- <my-element @my-event="${(e) => { console.log(e.detail.message) }}"></my-element>
要在其他上下文(例如HTML或其他框架)中监听从基于LitElement的组件触发的事件,请使用标准机制监听DOM事件。
在纯HTML和JavaScript中,这将是addEventListener API:
- const myElement = document.querySelector('my-element');
- myElement.addEventListener('my-event', (e) => {console.log(e)});
2、处理事件和影子DOM
使用事件和影子DOM时,需要了解一些事项。
2.1 事件冒泡
一些事件在DOM树中冒泡,因此页面上的任何元素都可以检测到它们。
事件是否冒泡取决于bubbles属性。要检查特定事件是否冒泡:
- handleEvent(e){
- console.log(e.bubbles);
- }
有关更多信息,请参见MDN上的事件接口文档。
2.2 事件重定向
从影子DOM内部触发的冒泡事件被重定向,所以对组件外部的任何监听器而言,它们似乎都来自组件本身。
example:
- <my-element onClick="(e) => console.log(e.target)"></my-element>
- render() {
- return html`
- <button id="mybutton" @click="${(e) => console.log(e.target)}">
- click me
- </button>`;
- }
处理此类事件时,您可以使用compoundPath查找其起源:
- handleMyEvent(event) {
- console.log('Origin: ', event.composedPath()[0]);
- }
2.3 自定义事件
默认情况下,在影子DOM内部触发的冒泡自定义事件在到达影子root时将停止冒泡。
要使自定义事件通过阴影DOM边界传递,必须将composite和bubble标志都设置为true:
- firstUpdated(changedProperties) {
- let myEvent = new CustomEvent('my-event', {
- detail: { message: 'my-event happened.' },
- bubbles: true,
- composed: true });
- this.dispatchEvent(myEvent);
- }
有关更多信息,请参见有关自定义事件的MDN文档。
LitElement(五)事件的更多相关文章
- 从零开始学习jQuery (五) 事件与事件对象
本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...
- CLR via C#深解笔记五 - 事件
事件处理实际上是一种具有特殊签名的delegate, 像这个样子:public delegate void EventHandler(object sender, EventArgs e); 类型 ...
- salesforce lightning零基础学习(五) 事件阶段(component events phase)
上一篇介绍了lightning component events的简单介绍.此篇针对上一篇进行深入,主要讲的内容为component event中的阶段(Phase). 一. 阶段(Phase)的概念 ...
- stenciljs 学习五 事件
组件可以使用Event Emitter装饰器发送数据和事件. Event 定义 参考: import { Event, EventEmitter } from '@stencil/core'; ... ...
- 07_jQuery对象初识(五)事件(非常重要)
1. 目前为止学过的绑定事件的方式 1. 在标签里面写 onclick=foo(this); 2. 原生DOM的JS绑定 DOM对象.onclick=function(){...} 3. jQuery ...
- SQL Server 事件通知(Event notifications)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 事件通知监控DDL(NotifyQue ...
- C#编程之委托与事件四(二)【转】
C#编程之委托与事件(二) 我在上一篇文章(C#编程之委托与事件(一) )中通过示例结合的方法介绍了委托,在本文中,我同样以代码示例的方式来介绍C#里的事件机制. 二.事件 1.了解概 ...
- 浅谈JavaScript之事件(上)
一 简述JavaScript及其在浏览器中的地位 (一) 浏览器主要构成 虽然不同浏览器之间存在差异(如Google Chrome,Firefox,Safari和IE等),但单从浏览器构成来说,大 ...
- javascript中的事件问题的总结
一.什么是事件? 事件就是DOM和浏览器之间的交互行为(只要触发了这个行为,也就相当于触发了事件),我们可以通过事件监听来绑定事件,例如:box.onclick=function(){},如果我们点击 ...
随机推荐
- React.js高阶函数的定义与使用
/* 高阶函数的简单定义与使用 一: 先定义一个普通组件 二: 用function higherOrder(WrappendComponent) { return } 将组件包裹起来,并用export ...
- Local changes were not restore
问题是这样的: 更新代码的时候出现这个弹框,不能更新最新代码 解决如下: 直接点击Clear [注意:这个操作是放弃本地所有的修改,如果要找回代码千万不要点击] 再点击Apply Stash 就可以 ...
- cocos studio 中交互性
cocos studio 属性->常规->交互性,勾选之后相当于代码中的setTouchEnabled(true)
- Truck History POJ - 1789 板子题
#include<iostream> #include<cstring> #include<algorithm> #include<stdio.h> u ...
- python之路(列表,元组)
列表 list:基础数据类型之一,可以索引,切片,步长,切片+步长可以增删改查,可迭代,可嵌套字典,元组,列表 一.索引,切片,步长 list01 = [1,2,3,'eric','west'] 1. ...
- Maven修改test/rsource的output folder报错Test source folder 'src/test/java'... is not also used for main s
eclipse新建maven项目时候,只出来三个文件夹,然后大都督手动添加了缺失的src/test/resource 的文件夹,最后想修改一下 Output folder的路径为 (原来是 d ...
- 题解【AcWing1089】烽火传递
题面 单调队列优化 DP 模板题. 我们考虑设 \(dp_{i}\) 表示从 \(1\) 到 \(i\) 能够准确传递情报,且第 \(i\) 个烽火台发出信号的最小费用. 转移方程不难得出:\(dp_ ...
- BZOJ2780(广义后缀自动机,set启发式合并)
BZOJ2780(广义后缀自动机,set启发式合并) 题面 自己找去 HINT 就是给多个文本串,然后每次查询的时候问你这个串在多少个文本串中出现过.因为多个文本串,那么直接就往广义后缀自动机上思考啊 ...
- 2级搭建类201-Oracle 12cR2 单实例 ASM(OEL7.7)公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...
- H5_0012:js事件冒泡和捕获
捕获(capture)和冒泡(bubble)是事件传播过程中的两个概念, 比如用户单击某个元素, 但由于元素处于父元素内, 该父元素又处于document对象中, document对象又处于windo ...