使用 lit-html 时如何指定事件处理程序?

How to specify event handlers when using lit-html?

[编写模板] 下的主要文档提供了以下用于将事件处理程序与 lit-html 绑定的示例。

html`<button @click=${(e) => console.log('clicked')}>Click Me</button>`

添加此简单页面并导入默认 renderhtml 函数并调用 render 但是似乎无法呈现按钮。如果删除 @click 事件绑定,则会呈现该按钮。一定是我遗漏了什么或者库中存在严重错误。

版本:0.10.2

以下链接涉及事件处理程序绑定在 lit-html 中的工作方式:

似乎为了使用事件处理程序绑定不能使用标准 lit-html API 而是 lit-extended 似乎与 lit-html 一起分发.将 import 语句更改为 import lit-extended 并如下所示更改属性语法似乎对我有用。

之前:

import { html, render } from "lit-html";

html`<button @click=${(e) => console.log('clicked')}>Click Me</button>`

(工作后):

import { html, render } from "lit-html/lib/lit-extended";

html`<button on-click=${(e) => console.log('clicked')}>Click Me</button>`

请注意,无论 GitHub 问题以及主要文档中显示的几个示例如何,@click 语法对我来说似乎根本不起作用。我不确定上面的语法是首选方法还是唯一的事件绑定方法,但它似乎至少是一种有效的方法。

在我看来,这可能是为 lit-html 文档做出改进的一个很好的候选者。

之前接受的答案是错误的。 lit-extended 已弃用,该解决方法仅在 2018 年的一段时间内有效,而 lit-html 正在切换到新语法。

正确的事件消费方式是:

html`<button @click=${e => console.log('clicked')}>Click Me</button>`

您也可以通过使用 handleEvent 方法分配对象来配置事件:

const clickHandler = {

    // This fires when the handler is called
    handleEvent(e) { console.log('clicked'); }

    // You can specify event options same as addEventListener
    capture: false;
    passive: true;
}

html`<button @click=${clickHandler}>Click Me</button>`

还有 lit-element,它为您提供了使用 Lit 和 TypeScript 增强功能构建 Web 组件的基础,以将创建事件处理程序的样板噪声转移到装饰器中:

@eventOptions({ capture: false, passive: true })
handleClick(e: Event) { console.log('clicked'); }

render() {
    return html`<button @click=${this.handleClick}>Click Me</button>`
}