学习目标
- 组成组件。
- 使用插槽。
- 列出两种编程模型的数据绑定行为之间的差异。
您可以在另一个组件的主体内添加组件。这种组件组成使您可以从更简单的构建块组件中构建复杂的组件。
在大型应用程序中,将应用程序与一组较小的组件组合在一起以使代码更易于重用和维护是很有用的。
的 闪电 命名空间包含许多基本组件,例如 闪电按钮,可用于构建组件。有关更多详细信息,请参见组件库。
了解组件关系
让我们从一个简单的示例开始,然后定义一些我们用于组成组件的术语。讨论似乎是不必要的转移,但与其他开发人员交谈时保持一致的术语很重要。
该HTML文件使用 <c-child>,指的是 儿童 组件中的 C命名空间。如果尚未为组织设置名称空间前缀,请使用默认名称空间C 引用您创建的组件时。
- 所有者
- 所有者是拥有模板的组件。在此示例中,所有者是c所有者组件。所有者控制它包含的所有组成组件。所有者可以:
- 在组成的组件上设置公共属性。
- 在组成的组件上调用公共方法。
- 侦听由组成组件触发的任何事件。
- 父母与子女
- 当一个组件包含另一个组件(该组件又可以包含其他组件)时,我们具有一个包含层次结构。在文档中,有时我们讨论父组件和子组件。父组件包含子组件。父组件可以是所有者,也可以是所有者模板的一部分的容器组件。
- 在这个例子中 c-父容器 是容器组件,因为它包含 小孩。的c-父容器 组件不是所有者,因为它位于所有者组件的模板中, 业主。
梦之屋的例子
让我们看一个组成组件的例子。的PropertyTileList 光环组件包含 PropertyTile 零件。
的 PropertyTile 组件具有称为的属性 属性。不要被那个名字分散注意力。DreamHouse是一个房地产应用程序,因此我们在这里谈论房地产属性而不是JavaScript属性!
这是HTML的 propertyTileList 闪电网络组件:
对于这两种编程模型,标记看起来相似,除了用于引用组成的组件的语法外。前面我们看到了Aura模型和Lightning Web组件模型如何分别具有不同的语法来引用标记中的组件。
- 在Aura组件中,我们使用 c:PropertyTile。
- 在Lightning Web组件中,我们使用 房地产。破折号分隔了命名空间,C,来自组件名称。骆驼案propertyTile 闪电Web组件被称为 物业平铺 在包含它的另一个Lightning Web组件的HTML文件中。
Lightning Web组件包含Lightning Web组件
让我们看一下包含两个Lightning Web组件lwcContainerComponent和lwcComponent的组成。
要使用Lightning Web组件, lwcComponent,在另一个Lightning Web组件中:
- 使用破折号分隔命名空间, C,来自组件名称。
- 更改骆驼案的名称, lwcComponent,以kebab案例(破折号)为参考, LWC组件。为了与Web组件标准保持一致,我们使用破折号分隔的参考。
- HTML规范要求自定义元素的标签不能自动关闭。自闭合标签以/>。Lightning Web组件本质上是一个自定义元素。因此,您需要打开和关闭标签以供组件参考:
Aura组件包含一个闪电Web组件
现在,让我们看一下Aura组件auraWrapper,其中包含Lightning Web组件lwcContainerComponent。
要使用Lightning Web组件, lwcContainerComponent 在光环组件中:
- 使用冒号分隔命名空间, C,来自组件名称。
- 使用骆驼箱组件名称, lwcContainerComponent。
- Aura标记中允许使用自闭合标签,因此我们使用 <c:lwcContainerComponent />。
刻面成为插槽
在Aura中,构面是任何类型的属性Aura.Component []。这只是您可以为属性设置一组组件的一种奇特的方式。用更不用说的话,可以将构面视为三明治。您可以根据需要将尽可能多的配料(成分)填充到三明治(构面)中。
例如,每个Aura组件都继承了一个 身体 属性,这是一个方面。构面的概念很重要,因为它使您可以设计具有属性的组件,该属性是父组件可以设置的标记的占位符。
闪电Web组件使用插槽代替刻面。插槽是Web组件规范的一部分。
这是一个Aura组件的示例,其中包含一个 标头 方面和 身体 默认情况下,每个组件都有。
类似的Lightning Web组件如下所示。
插槽名为 标头 取代 标头方面。未命名的插槽取代了身体 方面。
您可以在《Lightning Web Components开发人员指南》中深入了解。
还有其他方面需要考虑的方面吗?
是的,我很高兴你问!请记住,Lightning Web组件不能包含Aura组件。如果要迁移包含构面的Aura组件,则还必须将要填充的所有子组件都迁移到构面中。这样,您可以确保永远不要将Aura组件放入Lightning Web组件中。
数据绑定差异
在标记中添加组件时,可以根据所有者组件的属性值在子组件中初始化公共属性值。两种编程模型的数据绑定行为是不同的。
Aura组件数据绑定
Aura组件可以使用两种形式的表达式语法进行数据绑定: {!expr} 要么 {#expr}。在这里我们将不讨论其中的差异,但让我们看一个简单的示例。
所有者组件传递其值 名称 属性添加到子组件中,这将导致两个组件之间的数据绑定(也称为值绑定)。
在Aura组件中,此数据绑定是两种方法。的变化名称 属性传递到子组件的 名字 属性,以及 名字 子组件中的属性传递回 名称所有者组件的属性。这种双向数据绑定对于性能而言可能是昂贵的,并且由于数据更改的传播而可能创建难以调试的错误,尤其是在您具有深层嵌套的组件的情况下。
Lightning Web组件数据绑定
在Lightning Web组件中,属性值的数据绑定是一种方法。如果属性值在所有者组件中更改,则更新后的值将传播到子组件。反之则不成立。
让我们看一个简单的数据绑定示例。
数据绑定行为在Lightning Web组件中故意更简单且更可预测。子组件必须将从所有者组件传递的所有属性值都视为只读。如果子组件更改了从所有者组件传递的值,则会在浏览器控制台中看到错误。
为了触发所有者组件提供的属性值的突变,子组件可以将事件发送给父组件。如果父级拥有数据,则父级可以更改属性值,该属性值将通过单向数据绑定向下传播到子级组件。