Lightning-组件(4)属性

学习目标

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

  • 在组件上定义属性,并将属性值传递给嵌套组件。
  • 理解组件定义和组件实例之间的区别,并创建组件的多个实例。
  • 创建基本表达式来显示更改和计算的值。
  • 为动态输出创建条件表达式。

组件属性

到目前为止,虽然我们已经创建了几个组件,并且在构建应用程序方面学到了一些(高层次的),但是我们编写的代码并没有做比HTML更简单的工作。也就是说,我们创建的两个组件输出相同的静态文本,不管我们做什么。你可以把他们放在同一个屏幕上,他们总是会说同样的事情。

无聊。

要改变这一点,我们需要学习两件事情。首先,我们需要学习如何使组件在创建时接受输入。也就是说,我们需要在组件上设置值。我们使用属性来做这件事。

(我们需要学习的第二件事是如何实际使用这些值来改变组件的行为和输出,在我们弄清楚属性之后,我们会这样做)。

组件上的属性就像对象中的实例变量一样。这是一种保存更改值的方法,也是一种命名这些值占位符的方法。例如,假设我们想编写一个打印自定义消息的helloMessage组件。我们可以想象为这个组件添加一个消息属性来定制它的输出。然后,我们可以在将组件添加到我们的应用程序时设置该消息,如下所示。

<aura:component>
	  
    <c:helloMessage message="You look nice today."/>
	    
</aura:component>

您需要将其添加到您的组织中,因为我们将继续使用它。但是,如果你现在做,你会得到一个错误。这是为什么?因为helloMessage组件还不存在。闪电组件在您编写代码时验证您的代码。如果你试图保存它知道是无效的代码,例如引用一个不存在的组件,你会得到一个错误。所以,让我们先弄清楚如何创建helloMessage。
您可以在创建组件时设置组件的属性,就像我们在前面的示例中所做的那样。您还可以在组件生命周期的过程中更改它们,以响应用户采取的操作或其他地方发生的事件等等。你当然可以用许多不同的方式读取和使用属性值。当我们到达表达式时,我们会看看那些。

现在,我们来看看如何定义组件的属性。使用<aura:attribute>标记定义属性,该标记需要名称和类型属性的值,并接受这些可选属性:default,description,required。

哇,这是在句子中使用“属性”的很多不同的方法!在这里很容易混淆,因为我们有三个不同的名称相似的概念。让我们具体。

  1. 组件属性是可以存储值的地方。在前面的例子中,helloMessage组件有一个名为message的组件属性。大多数时候我们正在讨论组件属性。
  2. 您可以使用<aura:attribute>标签定义组件属性。我们稍后会看到一个例子。我们来调用这些属性定义。
  3. 使用它时,<aura:attribute>标签本身就具有属性! 😖也就是说,使用<aura:attribute>标记定义组件属性时,可以在<aura:attribute>上设置属性,以指定要定义的组件属性的“形状”。 😡等等,让我们再试一次:通过设置属性定义的属性来添加一个组件属性定义。 component组件属性的属性定义是否具有属性? 😴
    这就是为什么作家😱。我们试着用一些代码来解决这个术语问题。 😄

下面是我们的helloMessage组件的开始:

<aura:component>

    <aura:attribute name="message" type="String"/>

    <p>Hello! [ message goes here, soon ]</p>

</aura:component>
helloMessage组件具有一个组件属性,该属性通过设置属性的名称和类型来定义。该属性的名称是消息,一旦我们了解表达式,这就是你如何引用它。它仍然只输出静态文本和HTML,但我们正在接近有用的东西。

👍 ?

我们在这里使用的另一个属性是type,我们已经设置了它,因为它在属性定义中是必需的。它说消息属性包含一个字符串,这是有道理的。我们将详细讨论属性数据类型和属性定义的其他部分,但是首先让我们学习表达式,然后让helloMessage实际上做一些事情。

表达式

不要再让我们迷失,而是让我们按照预期使用helloMessage。

<aura:component>

    <aura:attribute name="message" type="String"/>

    <p>Hello! {!v.message}</p>

</aura:component>
难道是这样的还是什么?

我们使用表达式{!v.message}输出消息的内容。也就是说,这个表达式引用了消息属性。表达式被评估,并解析为当前存储在消息中的文本字符串。这就是表达式输出到组件主体的内容。

嗯…这是什么“表达”?

表达式基本上是一个公式或计算,您将其放在表达式分隔符(“{!”和“}”)中。所以,表达式如下所示:

{!<expression>}

表达式的正式定义有点令人生畏,但让我们看一下,然后解压它:表达式是可以解析为单个值的任何一组字面值,变量,子表达式或运算符。

是的,基本上是一个公式,就像你在计算领域,过滤标准或Visualforce中写的一样。公式或表达式可以包含各种各样的东西。字面值应该是显而易见的;他们是像数字42,或字符串“你好”的东西。变量就像消息属性一样。运算符就像+, – 等等,子表达式基本上意味着你可以使用括号把事物分组在一起。

让我们试试这个,让我们的表情稍微复杂一些。

<aura:component>

    <aura:attribute name="message" type="String"/>

    <p>{!'Hello! ' + v.message}</p>

</aura:component>
我们所做的就是将“Hello”部分从表达式外部的静态文本移动到表达式中的文本文本。请注意,我们使用“+”运算符将两个字符串连接在一起。这可能看起来像一个很小的差异,但移动表达式中的问候语文本可以使用标签,而不是文本文本,这使得更新(和翻译)组件更容易。例如:
{!$Label.c.Greeting + v.message}

你注意到我们对表达式的正式定义有什么遗漏吗? JavaScript函数调用。 Lightning Components标记中的表达式中不能使用JavaScript。

在我们继续之前,关于表情的最后一件事。您可以将它们传递给另一个组件来设置该组件上的值。这是一个将自定义值传递给helloMessage组件的新组件。将值传递给其他组件会覆盖该组件上的值。

<aura:component>
    <aura:attribute name="customMessage" type="String"/>
    <p> <c:helloMessage message="{!v.customMessage}"/> </p>
</aura:component>

.

价值提供者

实际上,我们需要谈谈表情的另一个方面。在前面的例子中,我们用v.message引用了helloMessage组件的消息属性。什么是“v”部分?

v是所谓的价值提供者。价值提供者是分组,封装和访问相关数据的一种方式。价值提供者是一个复杂的话题,所以现在把v想象成一个可供你使用的自动变量。在我们的组件中,v是视图的值提供者,它是helloMessage组件本身。

v给你一个“钩子”来访问组件的消息属性,这就是你如何访问组件的所有属性。

值提供者中的值作为命名属性被访问。要使用值,请使用点(句点)分隔值提供程序和属性名称。例如,v.message,正如我们所见。

当组件的属性是对象或其他结构化数据(即不是原始值)时,使用相同的点符号访问该属性上的值。例如,{!v.account.Id}访问帐户记录的Id字段。对于深度嵌套的对象和属性,继续添加点来遍历结构并访问嵌套的值。

属性数据类型

访问结构化数据是讨论属性的一个很好的部分,特别是关于非基本属性类型。消息是一个字符串,但是有许多不同的属性类型。

  • 原始数据类型,如布尔值,日期,日期时间,十进制,双精度,整数,长或字符串。任何编程语言通常的使用的。
  • 标准和自定义Salesforce对象,例如Account或MyCustomObject__c。
  • 集合,例如List,Map和Set。
  • 自定义Apex类。
  • 特定于框架的类型,如Aura.Component或Aura.Component []。这些比我们在这个模块中会更先进,但是你应该知道它们存在。

这是一个精简的费用项目组件,我们将在稍后填写。它演示了如何为自定义对象定义属性,以及如何访问记录中的字段。

<aura:component>

    <aura:attribute name="expense" type="Expense__c"/>

    <p>Amount:
        <lightning:formattedNumber value="{!v.expense.Amount__c}" style="currency"/>
    </p>
    <p>
        Client: {!v.expense.Client__c}
    </p>
    <p>
        <lightning:input type="toggle"                            
                         label="Reimbursed?"                           
                         name="reimbursed"                         
                         checked="{!v.expense.Reimbursed__c}" />
     </p> 
    <!-- Other markup here -->

</aura:component>
这个组件有一个属性,开销,这是我们在本模块开始时创建的自定义对象。该组件的目的是通过使用{!v.expense.fieldName}表达式引用Expense__c记录中的字段来显示费用的详细信息。我们使用类型=“toggle”的<lightning:input>组件,这是一个切换形式的复选框,以便我们稍后可以更新UI中的值。

其他方面的属性定义

当涉及到您在<aura:attribute>标签上设置的属性时,以下是您需要了解的其余部分。

  • 默认属性定义了默认的属性值。它在引用属性时使用,但尚未设置该属性的值。
  • 必需的属性定义属性是否是必需的。默认值是false。
  • description属性定义了属性及其用法的简要摘要。

为具有复杂数据类型的属性设置默认值可能有些棘手。不过,我们稍后会看到一个例子,所以现在我们只是把你的头抬起来。

乐趣与属性和表达式

为了说明更多关于属性和表达式的概念,让我们用下面的标记创建一个非常愚蠢的组件helloPlayground。

<aura:component>

    <aura:attribute name="messages" type="List"
        default="['You look nice today.',
            'Great weather we\'re having.',
            'How are you?']"/>


    <h1>Hello Playground</h1>

    <p>Silly fun with attributes and expressions.</p>


    <h2>List Items</h2>

    <p><c:helloMessage message="{!v.messages[0]}"/></p>
    <p><c:helloMessage message="{!v.messages[1]}"/></p>
    <p><c:helloMessage message="{!v.messages[2]}"/></p>


    <h2>List Iteration</h2>

    <aura:iteration items="{!v.messages}" var="msg">
        <p><c:helloMessage message="{!msg}"/></p>
    </aura:iteration>


    <h2>Conditional Expressions and Global Value Providers</h2>

    <aura:if isTrue="{!$Browser.isIPhone}">
        <p><c:helloMessage message="{!v.messages[0]}"/></p>
    <aura:set attribute="else">
        <p><c:helloMessage message="{!v.messages[1]}"/></p>
        </aura:set>
    </aura:if>

</aura:component>

现在将helloPlayground组件添加到你的线束应用程序,并看看它是如何运行的!

这里有很多新东西。我们现在不会对它们进行深入的了解,但是你会再次看到所有这些。

首先,helloPlayground有一个属性消息,这是一个复杂的数据类型List。它有一个默认值的列表,这是一个由逗号分隔的三个单引号字符串组成的数组。而且,在“列表项”部分中,您可以看到如何使用索引访问每个字符串。

如果有人用两条消息创建一个<c:helloPlayground>,会发生什么?访问第三个项目将失败,虽然它不会导致崩溃,但可能会有更复杂的组件。

因此,在List Iteration部分中,您可以看到更好的方法来处理列表中的所有项目。 <aura:iteration>组件在其items属性中的每个项目重复其身体一次,所以列表收缩或增长,因为我们有更少或更多的消息。

在“条件表达式”和“全球价值提供商”部分,您可以看到在两种不同可能的输出之间进行选择的方法。这种格式有点尴尬,因为这是标记而不是JavaScript,但是<aura:if>组件允许您例如只在用户具有对该对象的编辑权限时才将编辑按钮添加到页面。

最后,有些不那么明显。在面向对象编程中,类和类的实例是有区别的。组件有一个相似的概念。当您创建.cmp资源时,您正在提供该组件的定义(类)。当你把一个组件标签放到一个.cmp文件中时,你正在创建一个对该组件(的实例)的引用。

我们可以添加具有不同属性的相同组件的多个实例,这并不奇怪。在前面的例子中,当你使用消息的默认值时,你最终会得到8个对<c:helloMessage>组件实例的引用。如果你通过一个更长的名单,你可以结束(多)更多。所有来自我们的一个小组件!

对此,朋友,我们认为你已经准备好了一些真正的工作。