ReactiveElement

管理元素属性和属性的基本元素类。当属性改变时,update 方法会异步调用。此方法应由子类提供以按需渲染更新。

导入

attributeChangedCallback(name, _old, value): void

Permalink to attributeChangedCallback 查看源代码

当属性改变时,同步属性值。

参数
name
string
_old
null | string
value
null | string
详情

具体来说,当设置属性时,会设置相应的属性。你应该很少需要实现这个回调。如果覆盖了此方法,则必须调用super.attributeChangedCallback(name, _old, value)。有关 attributeChangedCallback 的更多信息,请参阅 MDN 上的使用生命周期回调

static observedAttributes: Array<string>

Permalink to observedAttributes 查看源代码

返回与注册属性相对应的属性列表。

addController(controller): void

Permalink to addController 查看源代码

注册 ReactiveController 以参与元素的响应式更新周期。元素在生命周期回调期间自动调用任何已注册的控制器。

参数
controller
ReactiveController
详情

如果元素在调用 addController() 时已连接,则控制器的 hostConnected() 回调将立即被调用。

removeController(controller): void

Permalink to removeController 查看源代码

从元素中移除 ReactiveController

参数
controller
ReactiveController

static disableWarning?: (warningKind: WarningKind) => void

Permalink to disableWarning 查看源代码

为该类禁用给定的警告类别。

详情

此方法仅存在于开发版本中,因此应使用以下保护措施访问它

读取或设置该类所有启用的警告类别。

详情

此属性仅在开发版本中使用。

static enableWarning?: (warningKind: WarningKind) => void

Permalink to enableWarning 查看源代码

为该类启用给定的警告类别。

详情

此方法仅存在于开发版本中,因此应使用以下保护措施访问它

在首次连接时,创建元素的 renderRoot,设置元素样式,并启用更新。

允许在扩展中使用super.disconnectedCallback(),同时保留在将来断开连接时进行非破坏性功能添加的可能性。

static addInitializer(initializer): void

Permalink to addInitializer 查看源代码

向类添加一个初始化函数,该函数在实例构造期间调用。

参数
initializer
Initializer
详情

这对于针对 ReactiveElement 子类运行的代码(如装饰器)很有用,这些代码需要为每个实例执行工作,例如设置 ReactiveController

装饰一个字段将导致每个实例运行一个添加控制器的初始化程序

初始化程序按构造函数存储。向子类添加初始化程序不会将其添加到超类中。由于初始化程序在构造函数中运行,因此初始化程序将按类层次结构的顺序运行,从超类开始,一直到实例的类。

static finalize(): boolean

Permalink to finalize 查看源代码

为注册的属性创建属性访问器,设置元素样式,并确保所有超类也被最终确定。如果元素已最终确定,则返回 true。

将类标记为已完成创建属性。

static createProperty(name, options?): void

Permalink to createProperty 查看源代码

如果元素原型上不存在属性访问器,则创建它,并使用给定的选项存储属性的PropertyDeclaration。属性设置器调用属性的 hasChanged 属性选项或使用严格的标识检查来确定是否请求更新。

参数
name
PropertyKey
options?
PropertyDeclaration<unknown, unknown>
详情

此方法可以被覆盖以自定义属性;但是,在这样做时,重要的是要调用 super.createProperty 以确保属性被正确设置。此方法在内部调用 getPropertyDescriptor 来获取要安装的描述符。要自定义属性在获取或设置时的行为,请覆盖 getPropertyDescriptor。要自定义属性的选项,请按照以下方式实现 createProperty

static elementProperties: PropertyDeclarationMap

Permalink to elementProperties 查看源代码

所有元素属性的记忆列表,包括任何超类属性。在用户子类最终确定类时,延迟创建。

static getPropertyDescriptor(name, key, options): undefined | PropertyDescriptor

getPropertyDescriptor 的永久链接 查看源代码

返回要在给定名称的属性上定义的属性描述符。如果未返回描述符,则该属性将不会成为访问器。例如,

参数
name
PropertyKey
key
string | symbol
options
PropertyDeclaration<unknown, unknown>
详情

static getPropertyOptions(name): PropertyDeclaration<unknown, unknown>

getPropertyOptions 的永久链接 查看源代码

返回与给定属性关联的属性选项。这些选项通过 properties 对象或 @property 装饰器使用 PropertyDeclaration 定义,并在 createProperty(...) 中注册。

参数
name
PropertyKey
详情

注意,此方法应被视为“最终”方法,不应被覆盖。要自定义给定属性的选项,请覆盖 createProperty

用户提供的对象,将属性名称映射到包含配置反应式属性选项的 PropertyDeclaration 对象。当设置反应式属性时,元素将更新并渲染。

详情

默认情况下,属性是公共字段,因此应将其视为主要由元素用户设置,无论是通过属性还是属性本身。通常,元素更改的属性应该是私有或受保护的字段,并且应该使用 state: true 选项。标记为 state 的属性不会从相应的属性中反映出来。但是,有时元素代码确实需要设置公共属性。这通常仅应在响应用户交互时完成,并且应触发一个事件来通知用户;例如,复选框在被点击时设置其 checked 属性并触发 changed 事件。对于非基本类型(对象或数组)属性,通常不应执行修改公共属性的操作。在其他情况下,当元素需要管理状态时,应使用带有 state: true 选项的私有属性。在需要时,可以使用公共属性初始化状态属性以促进复杂的交互。

返回元素应该渲染到的节点,并默认创建并返回一个开放的 shadowRoot。实现以自定义元素的 DOM 渲染位置。例如,要渲染到元素的 childNodes 中,请返回 this

元素 DOM 应该渲染到的节点或 ShadowRoot。默认为开放的 shadowRoot。

调用 attachShadow 时使用的选项。设置此属性以自定义 shadowRoot 的选项;例如,要创建一个封闭的 shadowRoot:{mode: 'closed'}

详情

注意,这些选项在 createRenderRoot 中使用。如果此方法是自定义的,则应尽可能尊重选项。

所有元素样式的记忆列表。在用户子类最终确定类时,延迟创建。

接受用户通过 static styles 属性提供的样式,并返回要应用于元素的样式数组。覆盖此方法以集成到样式管理系统中。

参数
styles?
CSSResultGroup
详情

样式是去重的,保留列表中的最后一个实例。这是一个性能优化,可以避免重复的样式,尤其是在通过子类化进行组合时。保留最后一个项目是为了尝试保留级联顺序,并假设最后添加的样式覆盖以前的样式最为重要。

要应用于元素的样式数组。样式应使用 css 标签函数、可构造样式表或从本机 CSS 模块脚本导入来定义。

详情

关于内容安全策略的说明:当浏览器不支持采用的样式表时,元素样式将使用 <style> 标签实现。要将此类 <style> 标签与 style-src CSP 指令一起使用,style-src 值必须包含 'unsafe-inline' 或 nonce-<base64-value>,其中 <base64-value> 被服务器生成的 nonce 替换。要提供一个 nonce 以在生成的 <style> 元素上使用,请在加载应用程序代码之前,将 window.litNonce 设置为页面 HTML 中的服务器生成的 nonce。

enableUpdating(_requestedUpdate): void

enableUpdating 的永久链接 查看源代码

注意,此方法应被视为最终方法,不应被覆盖。它在元素实例上被一个触发第一个更新的函数覆盖。

参数
_requestedUpdate
boolean

firstUpdated(_changedProperties): void

firstUpdated 的永久链接 查看源代码

当元素首次更新时调用。实现以在更新后对元素执行一次性操作。

参数
_changedProperties
Map<PropertyKey, unknown> | PropertyValueMap<any>

具有旧值的已更改属性的映射

详情

在此方法内部设置属性将触发元素在此更新周期完成后再次更新。

getUpdateComplete(): Promise<boolean>

getUpdateComplete 的永久链接 查看源代码

updateComplete 承诺的覆盖点。

详情

由于 TypeScript 的一个限制,直接覆盖 updateComplete getter 不安全,这意味着当目标语言为 ES5 时,无法调用超类 getter(例如 super.updateComplete.then(...))(https://github.com/microsoft/TypeScript/issues/338)。应改为覆盖此方法。例如

在第一次更新后设置为 true。元素代码不能假设 renderRoot 在元素 hasUpdated 之前存在。

如果由于调用 requestUpdate() 而存在挂起的更新,则为真。应仅读取。

performUpdate(): void | Promise<unknown>

performUpdate 的永久链接 查看源代码

执行元素更新。注意,如果在更新期间抛出异常,firstUpdatedupdated 不会被调用。

详情

调用 performUpdate() 以立即处理挂起的更新。通常不需要这样做,但在您需要同步更新的罕见情况下可以这样做。注意:为了确保 performUpdate() 同步完成挂起的更新,它不应该被覆盖。在 LitElement 2.x 中,建议覆盖 performUpdate() 来定制更新调度。现在您应该覆盖 scheduleUpdate()。为了与 LitElement 2.x 向后兼容,通过 performUpdate() 调度更新仍然有效,但将使同步处理更新的 performUpdate() 调用变得困难。

requestUpdate(name?, oldValue?, options?): void

requestUpdate 的永久链接 查看源代码

请求异步处理的更新。当元素应基于一些状态进行更新时,应调用此方法,该状态不是由设置响应式属性触发的。在这种情况下,不要传递任何参数。当手动实现属性 setter 时,也应调用此方法。在这种情况下,传递属性 nameoldValue 以确保遵守任何配置的属性选项。

参数
name?
PropertyKey

请求属性的名称

oldValue?
unknown

请求属性的旧值

options?
PropertyDeclaration<unknown, unknown>

要使用的属性选项,而不是之前配置的选项

scheduleUpdate(): void | Promise<unknown>

scheduleUpdate 的永久链接 查看源代码

调度元素更新。您可以通过返回一个 Promise 来覆盖此方法,从而更改更新的时序。更新将等待返回的 Promise,您应解决 Promise 以允许更新继续。如果覆盖了此方法,则必须调用 super.scheduleUpdate()

详情

例如,要调度更新以便在下一帧之前发生

shouldUpdate(_changedProperties): boolean

shouldUpdate 的永久链接 查看源代码

控制元素请求更新时是否应调用 update()。默认情况下,此方法始终返回 true,但这可以自定义以控制何时更新。

参数
_changedProperties
Map<PropertyKey, unknown> | PropertyValueMap<any>

具有旧值的已更改属性的映射

update(_changedProperties): void

update 的永久链接 查看源代码

更新元素。此方法将属性值反映到属性。它可以被覆盖以渲染和保持更新的元素 DOM。在此方法中设置属性将不会触发另一个更新。

参数
_changedProperties
Map<PropertyKey, unknown> | PropertyValueMap<any>

具有旧值的已更改属性的映射

updateComplete: Promise<boolean>

updateComplete 的永久链接 查看源代码

返回一个 Promise,该 Promise 在元素完成更新时解析。Promise 值是一个布尔值,如果元素在没有触发另一个更新的情况下完成了更新,则为 true。如果 Promise 结果为 false,则在 updated() 中设置了属性。如果 Promise 被拒绝,则在更新期间抛出了异常。

详情

要等待其他异步工作,请覆盖 getUpdateComplete 方法。例如,有时在履行此 Promise 之前等待已渲染的元素很有用。为此,首先等待 super.getUpdateComplete(),然后等待任何后续状态。

updated(_changedProperties): void

updated 的永久链接 查看源代码

每当元素更新时调用。实施以通过 DOM API 执行更新后的任务,例如,将焦点放在元素上。

参数
_changedProperties
Map<PropertyKey, unknown> | PropertyValueMap<any>

具有旧值的已更改属性的映射

详情

在此方法内部设置属性将触发元素在此更新周期完成后再次更新。

willUpdate(_changedProperties): void

willUpdate 的永久链接 查看源代码

update() 之前调用,以计算更新过程中需要的值。

参数
_changedProperties
Map<PropertyKey, unknown> | PropertyValueMap<any>
详情

实施 willUpdate 来计算依赖于其他属性并在更新过程的其余部分中使用的属性值。

将属性值转换为属性值。

导入

方法和属性

fromAttribute(value, type?): Type

fromAttribute 的永久链接 查看源代码

调用以将属性值转换为属性值。

参数
value
null | string
type?
TypeHint

toAttribute(value, type?): unknown

toAttribute 的永久链接 查看源代码

调用以将属性值转换为属性值。

参数
value
Type
type?
TypeHint
详情

它返回 unknown 而不是 string,以与 https://github.com/WICG/trusted-types(以及类似的努力)兼容。

定义属性访问器的选项。

导入

方法和属性

只读 attribute?: string | boolean

attribute 的永久链接 查看源代码

指示属性如何以及是否成为观察到的属性。如果值为 false,则不会将属性添加到 observedAttributes。如果为 true 或不存在,则观察小写属性名(例如 fooBar 变成 foobar)。如果为字符串,则观察字符串值(例如 attribute: 'foo-bar')。

只读 converter?: AttributeConverter<Type, TypeHint>

converter 的永久链接 查看源代码

指示如何将属性转换为属性或从属性转换为属性。如果此值为函数,则它用于将属性值转换为属性值。如果它是一个对象,它可以包含 fromAttributetoAttribute 的键。如果没有提供 toAttribute 函数并且 reflect 设置为 true,则属性值将直接设置为属性。如果没有提供,则使用默认的 converter;它支持 BooleanStringNumberObjectArray。注意,当属性发生更改并且 converter 用于更新属性时,属性永远不会再次因为属性更改而更新,反之亦然。

指示是否将为该属性创建访问器。默认情况下,将为该属性生成一个访问器,该访问器在设置时请求更新。如果此标志为 true,则不会创建访问器,并且用户有责任调用 this.requestUpdate(propertyName, oldValue) 以在属性更改时请求更新。

指示属性是否应该反映到属性。如果为 true,则在设置属性时,将使用根据 attribute 属性选项的规则确定的属性名和使用 converter 属性选项的规则转换的属性值来设置属性。

当设置为 true 时,表示属性是内部私有状态。用户不应设置该属性。当使用 TypeScript 时,此属性应标记为 privateprotected,并且在命名中使用前导 _ 也是一种常见的做法。该属性不会添加到 observedAttributes

指示属性的类型。这仅用作 converter 的提示,以确定如何将属性转换为属性或从属性转换为属性。

hasChanged(value, oldValue): boolean

hasChanged 的永久链接 查看源代码

一个函数,指示当设置属性时是否应将其视为已更改。该函数应接收 newValueoldValue,如果应请求更新,则返回 true

参数
value
Type
oldValue
Type

属性到 PropertyDeclaration 选项的映射。对于每个属性,都会创建一个访问器,并且根据 PropertyDeclaration 选项处理该属性。

导入

一个属性键到值的映射。

导入

Type

T ? PropertyValueMap<T> : Map<PropertyKey, unknown>

详情

接受一个可选的类型参数 T,当指定为非 any、非 unknown 类型时,将使 Map 具有更强的类型,将 map 键与其在 T 上的对应值类型相关联。在覆盖 ReactiveElement.update() 和其他生命周期方法时,使用 PropertyValues<this> 为了对键和值进行更强的类型检查。