适用于Aura开发人员的Lightning Web Components

适用于Aura开发人员的Lightning Web Components – 组成组件

学习目标

完成本单元后,您将能够:

  • 组成组件。
  • 使用插槽。
  • 列出两种编程模型的数据绑定行为之间的差异。

您可以在另一个组件的主体内添加组件。这种组件组成使您可以从更简单的构建块组件中构建复杂的组件。

在大型应用程序中,将应用程序与一组较小的组件组​​合在一起以使代码更易于重用和维护是很有用的。

的 闪电 命名空间包含许多基本组件,例如 闪电按钮,可用于构建组件。有关更多详细信息,请参见组件库

了解组件关系

让我们从一个简单的示例开始,然后定义一些我们用于组成组件的术语。讨论似乎是不必要的转移,但与其他开发人员交谈时保持一致的术语很重要。

<!-- owner.html -->
<template>
    <c-child first-name="Moonbeam"></c-child>
<template>

该HTML文件使用 <c-child>,指的是 儿童 组件中的 C命名空间。如果尚未为组织设置名称空间前缀,请使用默认名称空间C 引用您创建的组件时。

所有者
所有者是拥有模板的组件。在此示例中,所有者是c所有者组件。所有者控制它包含的所有组成组件。所有者可以:

  • 在组成的组件上设置公共属性。
  • 在组成的组件上调用公共方法。
  • 侦听由组成组件触发的任何事件。
父母与子女
当一个组件包含另一个组件(该组件又可以包含其他组件)时,我们具有一个包含层次结构。在文档中,有时我们讨论父组件和子组件。父组件包含子组件。父组件可以是所有者,也可以是所有者模板的一部分的容器组件。
在这个例子中 c-父容器 是容器组件,因为它包含 小孩。的c-父容器 组件不是所有者,因为它位于所有者组件的模板中, 业主

<!-- owner.html -->
<template>
    <c-parent-container>
        <c-child first-name="Moonbeam"></c-child>
    </c-parent-container>
<template>

梦之屋的例子

让我们看一个组成组件的例子。的PropertyTileList 光环组件包含 PropertyTile 零件。

<aura:component>
    ...
    <div class="slds-card">
        <lightning:layout horizontalAlign="center" multipleRows="true">
            <aura:iteration items="{!v.properties}" var="property">
                <lightning:layoutItem padding="around-small" size="12" smallDeviceSize="6" mediumDeviceSize="4" largeDeviceSize="3">
                    <c:PropertyTile property="{#property}"/>
                </lightning:layoutItem>    
            </aura:iteration>
        </lightning:layout>
    </div>
    
</aura:component>

的 PropertyTile 组件具有称为的属性 属性。不要被那个名字分散注意力。DreamHouse是一个房地产应用程序,因此我们在这里谈论房地产属性而不是JavaScript属性!

这是HTML的 propertyTileList 闪电网络组件:

<template>
    <div class="slds-card tile-list">
        <template for:each={filteredProperties} for:item="property">
            <c-property-tile property={property} key={property.Id}></c-property-tile>
        </template>
    </div>
</template>

对于这两种编程模型,标记看起来相似,除了用于引用组成的组件的语法外。前面我们看到了Aura模型和Lightning Web组件模型如何分别具有不同的语法来引用标记中的组件。

  • 在Aura组件中,我们使用 c:PropertyTile
  • 在Lightning Web组件中,我们使用 房地产。破折号分隔了命名空间,C,来自组件名称。骆驼案propertyTile 闪电Web组件被称为 物业平铺 在包含它的另一个Lightning Web组件的HTML文件中。

Lightning Web组件包含Lightning Web组件

让我们看一下包含两个Lightning Web组件lwcContainerComponent和lwcComponent的组成。

<!-- lwcContainerComponent.html -->
<template>
    <c-lwc-component></c-lwc-component>
</template>

要使用Lightning Web组件, lwcComponent,在另一个Lightning Web组件中:

  • 使用破折号分隔命名空间, C,来自组件名称。
  • 更改骆驼案的名称, lwcComponent,以kebab案例(破折号)为参考, LWC组件。为了与Web组件标准保持一致,我们使用破折号分隔的参考。
  • HTML规范要求自定义元素的标签不能自动关闭。自闭合标签以/>。Lightning Web组件本质上是一个自定义元素。因此,您需要打开和关闭标签以供组件参考:
    <c-lwc-component></c-lwc-component>

Aura组件包含一个闪电Web组件

现在,让我们看一下Aura组件auraWrapper,其中包含Lightning Web组件lwcContainerComponent。

<!-- auraWrapper.cmp -->
<aura:component>
    <c:lwcContainerComponent />
</aura:component>

要使用Lightning Web组件, lwcContainerComponent 在光环组件中:

  • 使用冒号分隔命名空间, C,来自组件名称。
  • 使用骆驼箱组件名称, lwcContainerComponent
  • Aura标记中允许使用自闭合标签,因此我们使用 <c:lwcContainerComponent />

刻面成为插槽

在Aura中,构面是任何类型的属性Aura.Component []。这只是您可以为属性设置一组组件的一种奇特的方式。用更不用说的话,可以将构面视为三明治。您可以根据需要将尽可能多的配料(成分)填充到三明治(构面)中。

例如,每个Aura组件都继承了一个 身体 属性,这是一个方面。构面的概念很重要,因为它使您可以设计具有属性的组件,该属性是父组件可以设置的标记的占位符。

闪电Web组件使用插槽代替刻面。插槽是Web组件规范的一部分

这是一个Aura组件的示例,其中包含一个 标头 方面和 身体 默认情况下,每个组件都有。

<aura:component>
    <aura:attribute name="header" type="Aura.Component[]"/>
    <div>
        <span>{!v.header}</span><br/>
        <span>{!v.body}</span>
    </div>
</aura:component>

类似的Lightning Web组件如下所示。

<template>
    <div>
        <slot name="header"></slot><br/>
        <slot></slot>
    </div>
</template>

插槽名为 标头 取代 标头方面。未命名的插槽取代了身体 方面。

您可以在《Lightning Web Components开发人员指南》中深入了解。

还有其他方面需要考虑的方面吗?

是的,我很高兴你问!请记住,Lightning Web组件不能包含Aura组件。如果要迁移包含构面的Aura组件,则还必须将要填充的所有子组件都迁移到构面中。这样,您可以确保永远不要将Aura组件放入Lightning Web组件中。

数据绑定差异

在标记中添加组件时,可以根据所有者组件的属性值在子组件中初始化公共属性值。两种编程模型的数据绑定行为是不同的。

Aura组件数据绑定

Aura组件可以使用两种形式的表达式语法进行数据绑定: {!expr} 要么 {#expr}。在这里我们将不讨论其中的差异,但让我们看一个简单的示例。

<!-- owner.cmp -->
<aura:component>
    <aura:attribute name="fName" type="String" />
    <c:child firstName="{!v.fName}"/>
</aura:component>

所有者组件传递其值 名称 属性添加到子组件中,这将导致两个组件之间的数据绑定(也称为值绑定)。

在Aura组件中,此数据绑定是两种方法。的变化名称 属性传递到子组件的 名字 属性,以及 名字 子组件中的属性传递回 名称所有者组件的属性。这种双向数据绑定对于性能而言可能是昂贵的,并且由于数据更改的传播而可能创建难以调试的错误,尤其是在您具有深层嵌套的组件的情况下。

Lightning Web组件数据绑定

在Lightning Web组件中,属性值的数据绑定是一种方法。如果属性值在所有者组件中更改,则更新后的值将传播到子组件。反之则不成立。

让我们看一个简单的数据绑定示例。

<!-- owner.html -->
<template>
    <c-child first-name={fName}></child>
</template>

数据绑定行为在Lightning Web组件中故意更简单且更可预测。子组件必须将从所有者组件传递的所有属性值都视为只读。如果子组件更改了从所有者组件传递的值,则会在浏览器控制台中看到错误。

为了触发所有者组件提供的属性值的突变,子组件可以将事件发送给父组件。如果父级拥有数据,则父级可以更改属性值,该属性值将通过单向数据绑定向下传播到子级组件。

你可能也会喜欢...