组合概述

组合是一种管理复杂性并将代码组织成可重用部分的策略。Lit 提供了几种组合和代码重用的选项:

  • 组件组合
  • 响应式控制器
  • 类混入

组件组合是将复杂组件从更简单的组件组装起来的过程。组件可以在其模板中使用子组件。组件可以使用标准的 DOM 机制进行通信:在子组件上设置属性,以及监听来自子组件的事件。

虽然组件组合是思考如何将复杂的 Lit 项目分解成更小单元的默认方式,但还有两种其他值得注意的代码模式可用于分解你的 Lit 代码:

响应式控制器是可以挂钩到 Lit 组件更新生命周期的对象,将与某个功能相关的状态和行为封装到单独的代码单元中。

类混入让你可以编写可重用的部分组件定义,并将它们"混入"到组件的继承链中。

混入和响应式控制器都允许你将与特定功能相关的组件逻辑分解为可重用的单元。有关控制器和混入的比较,请参见下一节。

控制器和类混入在某些方面非常相似。它们都可以挂钩到宿主组件的生命周期,维护状态,并触发宿主更新。

控制器和混入之间的主要区别在于它们与组件的关系。组件与响应式控制器是"has-a"(有一个)关系,因为它拥有该控制器。组件与混入是"is-a"(是一个)关系,因为组件是混入类的一个实例。

响应式控制器是由组件拥有的独立对象。控制器可以访问组件上的方法和字段,组件也可以访问控制器上的方法和字段。但是使用组件的人不能(轻易地)访问控制器,除非组件暴露了访问它的公共 API。控制器的生命周期方法在组件相应的生命周期方法_之前_被调用。

另一方面,混入成为组件原型链的一部分。混入定义的任何公共字段或方法都是组件 API 的一部分。而且因为混入是原型链的一部分,你的组件可以控制混入的生命周期回调何时被调用。

通常,如果你在尝试决定是将功能打包为控制器还是混入,你应该选择控制器,_除非_该功能需要以下之一:

  • 向组件添加公共 API
  • 对组件生命周期的非常精细的访问