使用Lightning Web组件构建Bear-tracking应用程序 – 创建一个子组件并与之交互

创建一个子组件并与之交互

在前面的步骤中,我们的代码库有所增加。现在,花一点时间将我们的清单列表组件重构为几个较小的组件。我们将把熊牌的代码移到一个新的组件中。

创建Bear Tile组件

  1. 在VS Code中,右键单击该lwc文件夹,然后单击SFDX:Create Lightning Web Component
  2. 命名组件bearTile
  3. 打开bearList.html并剪切<!-- Start bear tile -->和之间的所有代码<!-- End bear tile -->
  4. 将代码粘贴到的template标签中bearTile.html。完成后,bearTile.html应如下所示。
    <template>
    	<lightning-card title={bear.Name} class="bear-tile">
    		<div class="slds-var-p-horizontal_small bear-tile-body">
    			<div class="slds-media">
    				<div class="slds-media__figure">
    					<img src={appResources.bearSilhouette} alt="Bear profile" class="bear-silhouette"/>
    				</div>
    				<div class="slds-media__body">
    					<p class="slds-var-m-bottom_xx-small">{bear.Sex__c}</p>
    					<p class="slds-var-m-bottom_xx-small">{bear.Age__c} years old</p>
    					<p class="slds-var-m-bottom_xx-small">{bear.Height__c} cm</p>
    					<p class="slds-var-m-bottom_xx-small">{bear.Weight__c} Kg</p>
    				</div>
    			</div>
    		</div>
    	</lightning-card>
    </template>
  5. 将以下内容替换为bearTile.js
    import { LightningElement, api } from 'lwc';
    import ursusResources from '@salesforce/resourceUrl/ursus_park';
    export default class BearTile extends LightningElement {
    	@api bear;
    	appResources = {
    		bearSilhouette: `${ursusResources}/img/standing-bear-silhouette.png`,
    	};
    }

    我们添加了一个bear装饰有的属性@api。这会将bear属性公开给任何父组件。

  6. 删除bearList.css
  7. bearTile.cssbearTile目录中创建一个新文件,并将以下代码粘贴到该文件中。
    .bear-tile {
      border: 1px solid #d2955d;
      background-color: #fae8d2;
      border-radius: .25rem;
      display: block;
    }
    .bear-silhouette {
      height: 100px;
    }
    .bear-tile-body {
      background: linear-gradient(180deg, rgba(255,255,255,1) 80%, #fae8d2 100%);
    }
  8. 打开bearList.html并更换<!-- Start bear tile --><!-- End bear tile -->与评论<c-bear-tile bear={bear}></c-bear-tile>。一旦完成,bearList.html 应该看起来像这样。
    <template>
    	<lightning-card title="Bears" icon-name="utility:animal_and_nature">
    		<div class="slds-card__body_inner">
    			<!-- Start bear list -->
    			<template if:true={bears.data}>
    				<lightning-input type="search"
    					onchange={handleSearchTermChange}
    					variant="label-hidden"
    					class="slds-var-m-bottom_small"
    					label="Search"
    					placeholder="Search for bears"
    					value={searchTerm}>
    				</lightning-input>
    				<lightning-layout multiple-rows="true" pull-to-boundary="small">
    					<template for:each={bears.data} for:item="bear">
    						<lightning-layout-item key={bear.Id} size="3" class="slds-var-p-around_x-small">
    							<c-bear-tile bear={bear}></c-bear-tile>
    						</lightning-layout-item>
    					</template>
    				</lightning-layout>
    				<!-- No bears found -->
    				<template if:false={hasResults}>
    					<div class="slds-align_absolute-center slds-var-m-vertical_small">
    						This is beary disturbing, we did not find results...
    					</div>
    				</template>
    			</template>
    			<!-- End bear list -->
    			<!-- Data failed to load -->
    			<template if:true={bears.error}>
    				<div class="slds-text-color_error">
    					An error occurred while loading the bear list
    				</div>
    			</template>
    		</div>
    	</lightning-card>
    </template>

    bear将使用我们在前面的步骤中定义的属性引用我们的Bear Tile组件。请注意,我们的组件文件夹和文件已命名bearTile,但我们添加的标签是c-bear-tile。开头c代表默认名称空间,在名称空间后附加小写字母,并用破折号分隔以前的大写字母。

  9. 将更新的代码部署到组织中并测试您的新列表组件。细微的渐变看起来应该更好。

Ursus Park主页上具有自定义样式的熊列表

与Bear List组件进行交互

游骑兵要求能够快速查看熊记录并对其进行编辑,而不必离开主页。让我们单击熊形图块,然后打开一个可编辑的熊形记录表格。

  1. 编辑bearTile.html以下代码并将其添加到<lightning-card title={bear.Name} class="bear-tile">标签之后。
    <div slot="actions">
    	<lightning-button-icon
    		icon-name="utility:search"
    		icon-class="bear-tile-button"
    		variant="bare"
    		alternative-text="Open record"
    		onclick={handleOpenRecordClick}>
    	</lightning-button-icon>
    </div>

    我们添加了一个触发该handleOpenRecordClick功能的编辑按钮。使用actions插槽将按钮放置在闪电卡上。插槽是父组件传递到组件主体的标记的占位符。

  2. bearTile.js在最后一个括号之前编辑并添加以下功能。
    handleOpenRecordClick() {
    	const selectEvent = new CustomEvent('bearview', {
    		detail: this.bear.Id
    	});
    	this.dispatchEvent(selectEvent);
    }

    代码重点:

    • handleOpenRecordClick当用户单击熊图块的打开记录按钮时,将调用该函数。
    • 该函数创建并触发一个bearview包含熊记录ID的自定义事件。
  3. 编辑属性bearList.html并将其添加onbearview={handleBearView}c-bear-tile标签。这使我们能够捕获bearview由tile组件触发的事件。该事件在handleBearView函数中处理。
    <c-bear-tile bear={bear} onbearview={handleBearView}></c-bear-tile>
  4. 将以下内容替换为bearList.js
    import { NavigationMixin } from 'lightning/navigation';
    import { LightningElement, wire } from 'lwc';
    /** BearController.searchBears(searchTerm) Apex method */
    import searchBears from '@salesforce/apex/BearController.searchBears';
    export default class BearList extends NavigationMixin(LightningElement) {
    	searchTerm = '';
    	@wire(searchBears, {searchTerm: '$searchTerm'})
    	bears;
    	handleSearchTermChange(event) {
    		// Debouncing this method: do not update the reactive property as
    		// long as this function is being called within a delay of 300 ms.
    		// This is to avoid a very large number of Apex method calls.
    		window.clearTimeout(this.delayTimeout);
    		const searchTerm = event.target.value;
    		// eslint-disable-next-line @lwc/lwc/no-async-operation
    		this.delayTimeout = setTimeout(() => {
    			this.searchTerm = searchTerm;
    		}, 300);
    	}
    	get hasResults() {
    		return (this.bears.data.length > 0);
    	}
    	handleBearView(event) {
    		// Get bear record id from bearview event
    		const bearId = event.detail;
    		// Navigate to bear record page
    		this[NavigationMixin.Navigate]({
    			type: 'standard__recordPage',
    			attributes: {
    				recordId: bearId,
    				objectApiName: 'Bear__c',
    				actionName: 'view',
    			},
    		});
    	}
    }

    代码重点:

    • 我们导入一个导航mixin,它捆绑了处理导航的实用程序功能。使用mixin,我们可以在不扩展类的情况下向其添加功能。当一个类已经扩展了一个父类(一个类只能扩展一个父类)时,这很有用。
    • 我们的课程将导航混入扩展到了LightningElement基础类。
    • 我们bearviewhandleBearView函数中处理事件。我们从事件详细信息中提取熊记录ID,并使用导航mixin导航到熊记录页面。
  5. 将更新的代码部署到组织中,并测试您是否可以使用图块上的按钮图标导航到熊记录。

这就是步骤。我们已经将组件重构为两个较小的组件:Bear列表和Bear Tile。我们探索了如何使用@api装饰器从父列表组件与子磁贴组件进行通信。我们还看到了如何通过自定义事件从孩子与父母进行交流。

在下一步中,我们将在Lightning页面中了解如何与其他组件进行交互。

使用Lightning Web组件构建Bear-tracking应用程序 – 处理记录清单

创建熊列表组件

公园护林员希望直接从其主页上看到熊的目录。您的任务是实施该清单。

  1. 在VS Code中,右键单击该lwc文件夹,然后单击SFDX:Create Lightning Web Component
  2. 命名组件bearList
  3. 编辑bearList.js-meta.xml文件,并替换<isExposed>false</isExposed>为这些行。
    <isExposed>true</isExposed>
    <targets>
    	<target>lightning__AppPage</target>
    	<target>lightning__RecordPage</target>
    	<target>lightning__HomePage</target>
    </targets>

    这使您的组件可以放置在Lightning App Builder中的任何类型的页面上。

  4. 将以下内容替换为bearList.html
    <template>
    	<lightning-card title="Bears" icon-name="utility:animal_and_nature">
    		<div class="slds-card__body_inner">
    			<!-- Start bear list -->
    			<template if:true={bears}>
    				<lightning-layout multiple-rows="true" pull-to-boundary="small">
    					<template for:each={bears} for:item="bear">
    						<lightning-layout-item key={bear.Id} size="3" class="slds-var-p-around_x-small">
    							<!-- Start bear tile -->
    							<lightning-card title={bear.Name} class="bear-tile">
    								<div class="slds-var-p-horizontal_small bear-tile-body">
    									<div class="slds-media">
    										<div class="slds-media__figure">
    											<img src={appResources.bearSilhouette} alt="Bear profile" class="bear-silhouette"/>
    										</div>
    										<div class="slds-media__body">
    											<p class="slds-var-m-bottom_xx-small">{bear.Sex__c}</p>
    											<p class="slds-var-m-bottom_xx-small">{bear.Age__c} years old</p>
    											<p class="slds-var-m-bottom_xx-small">{bear.Height__c} cm</p>
    											<p class="slds-var-m-bottom_xx-small">{bear.Weight__c} Kg</p>
    										</div>
    									</div>
    								</div>
    							</lightning-card>
    							<!-- End bear tile -->
    						</lightning-layout-item>
    					</template>
    				</lightning-layout>
    			</template>
    			<!-- End bear list -->
    			<!-- Data failed to load -->
    			<template if:true={error}>
    				<div class="slds-text-color_error">
    					An error occurred while loading the bear list
    				</div>
    			</template>
    		</div>
    	</lightning-card>
    </template>

    代码重点:

    • template带有for:eachfor:item指令的标记用于遍历bears记录。每个迭代项都传递给bear属性。
    • 模板的每次迭代均标记有特殊key属性。key在迭代的上下文中必须具有唯一值。那就是我们组件中的熊id。
  5. 将以下内容替换为bearList.js
    import { LightningElement } from 'lwc';
    import ursusResources from '@salesforce/resourceUrl/ursus_park';
    /** BearController.getAllBears() Apex method */
    import getAllBears from '@salesforce/apex/BearController.getAllBears';
    export default class BearList extends LightningElement {
    	bears;
    	error;
    	appResources = {
    		bearSilhouette: `${ursusResources}/img/standing-bear-silhouette.png`,
    	};
    	connectedCallback() {
    		this.loadBears();
    	}
    	loadBears() {
    		getAllBears()
    			.then(result => {
    				this.bears = result;
    			})
    			.catch(error => {
    				this.error = error;
    			});
    	}
    }

    代码重点:

    • 我们导入ursusResources适配器,这使我们能够访问与我们的应用程序关联的静态资源。我们使用此适配器来构建一个appResources对象,该对象在模板中公开熊剪影图像URL。
    • 我们导入getAllBears适配器,这使我们可以与BearController.getAllBears()Apex方法进行交互。该BearController班是您在这个项目开始部署的代码捆绑在一起。该getAllBears方法返回获取所有熊记录的查询结果。
    • 我们实现了该connectedCallback功能,该功能允许我们在组件加载后执行代码。我们使用此函数来调用该loadBears函数。
    • loadBears函数调用getAllBears适配器。适配器调用我们的Apex代码并返回JS promise。我们使用promise将返回的数据保存在bears属性中或报告错误。使用这种方法检索数据称为命令式Apex。
  6. bearList.cssbearList目录中创建一个新文件,并将以下代码粘贴到该文件中。
    .bear-tile {
    		border: 1px solid #d2955d;
    		border-radius: .25rem;
    		display: block;
    }
    .bear-silhouette {
    		height: 100px;
    }

    这些CSS规则为熊卡添加边框,并设置熊剪影图像的高度。

  7. 将更新的代码部署到组织。右键单击默认文件夹,然后单击SFDX:将源部署到组织

将Bear List组件添加到App主页

让我们将新组件添加到应用程序主页。

  1. 在您的组织中,从App Launcher( 应用启动器)中找到并选择Ursus Park。
  2. 单击设置( 安装装置),然后选择编辑页面
  3. 在“自定义组件”下,找到您的bearList组件并将其拖动到页面的左上方。
  4. 单击保存,然后单击返回以返回主页并检查您的工作。

Ursus Park主页上的熊名单

使用有线Apex

现在,我们将探索一种检索熊市名单的新方法。我们将使用有线Apex代替命令式Apex。

  1. 编辑bearList.html并替换<template if:true={bears}><template if:true={bears.data}>
  2. 替换<template for:each={bears} for:item="bear"><template for:each={bears.data} for:item="bear">
  3. 替换<template if:true={error}><template if:true={bears.error}>。在这一点上,除了命令性Apex之外,模板几乎是相同的。现在,我们通过调用bears.data 而不是just来访问空头列表bears,并且现在使用bears.error而不是just来检索错误error
  4. 将以下内容替换为bearList.js
    import { LightningElement, wire } from 'lwc';
    import ursusResources from '@salesforce/resourceUrl/ursus_park';
    /** BearController.getAllBears() Apex method */
    import getAllBears from '@salesforce/apex/BearController.getAllBears';
    export default class BearList extends LightningElement {
    	@wire(getAllBears) bears;
    	appResources = {
    		bearSilhouette: `${ursusResources}/img/standing-bear-silhouette.png`,
    	};
    }

    通过bears使用有线Apex装饰属性,我们大大简化了JS代码。现在,我们需要的所有数据都通过以下一行:@wire(getAllBears) bears;

  5. 将更新的代码部署到组织中,并观察其行为与命令式Apex相同。

在您的Apex呼叫中传递参数

乌尔苏斯公园(Ursus Park)的居民人数正在上升。游骑兵希望能够过滤熊名单以快速找到它们。让我们在熊列表中添加一个搜索栏来帮助他们。

  1. 编辑bearList.html以下代码并将其添加到<template if:true={bears.data}>标签之后。
    <lightning-input type="search"
    	onchange={handleSearchTermChange}
    	variant="label-hidden"
    	class="slds-var-m-bottom_small"
    	label="Search"
    	placeholder="Search for bears"
    	value={searchTerm}>
    </lightning-input>

    这将添加一个搜索输入字段。当其值更改时,我们调用该handleSearchTermChange函数。

  2. </lightning-layout>结束标记后添加以下代码。
    <!-- No bears found -->
    <template if:false={hasResults}>
    	<div class="slds-align_absolute-center slds-var-m-vertical_small">
    		This is beary disturbing, we did not find results...
    	</div>
    </template>

    这会添加一条消息,指示未找到结果。仅当hasResults表达式为false时才会显示此消息。

  3. 将以下内容替换为bearList.js
    import { LightningElement, wire } from 'lwc';
    import ursusResources from '@salesforce/resourceUrl/ursus_park';
    /** BearController.searchBears(searchTerm) Apex method */
    import searchBears from '@salesforce/apex/BearController.searchBears';
    export default class BearList extends LightningElement {
    	searchTerm = '';
    	@wire(searchBears, {searchTerm: '$searchTerm'})
    	bears;
    	appResources = {
    		bearSilhouette: `${ursusResources}/img/standing-bear-silhouette.png`,
    	};
    	handleSearchTermChange(event) {
    		// Debouncing this method: do not update the reactive property as
    		// long as this function is being called within a delay of 300 ms.
    		// This is to avoid a very large number of Apex method calls.
    		window.clearTimeout(this.delayTimeout);
    		const searchTerm = event.target.value;
    		// eslint-disable-next-line @lwc/lwc/no-async-operation
    		this.delayTimeout = setTimeout(() => {
    			this.searchTerm = searchTerm;
    		}, 300);
    	}
    	get hasResults() {
    		return (this.bears.data.length > 0);
    	}
    }

    代码重点:

    • 我们添加了searchTerm反应性属性,并将其作为有线Apex调用的参数传递给searchBears
    • handleSearchTermChange功能用于对搜索输入字段的值的变化做出反应。更新searchTerm反应性时,我们有目的地引入了300毫秒的延迟。如果有更新待处理,我们将取消它,并在300毫秒内重新安排一个新的更新。当用户键入字母以形成单词时,此延迟会减少Apex呼叫的次数。每个新字母都会触发对的呼叫,handleSearchTermChange但理想情况下,searchBears 只有在用户完成输入后才被调用一次。这种技术称为反跳。
    • 我们公开该hasResults表达式以检查搜索是否返回了熊。
  4. 将更新后的代码部署到组织中,并检查搜索是否成功,无论结果如何。

Ursus Park主页上的已过滤熊列表

这就是步骤。我们已经了解了如何使用命令式Apex然后使用有线Apex处理记录列表,并且学习了如何在Apex调用中传递参数。在此过程中,我们组件的代码已显着增长,因此现在让我们将其分为子组件以使其易于维护。

使用Lightning Web组件构建Bear-tracking应用程序 – 处理单个记录

你会做什么

熊熊游乐园管理员需要您的帮助来追踪在公园里游荡的熊。他们已经在Salesforce中输入了一些信息,但是他们需要您为他们提供定制的应用程序体验。

创建Bear位置组件

  1. 在VS Code中,右键单击该lwc文件夹,然后单击SFDX:Create Lightning Web Component
  2. 命名组件bearLocation
  3. 编辑bearLocation.js-meta.xml文件,并替换<isExposed>false</isExposed>为这些行。
    <isExposed>true</isExposed>
    <targets>
    	<target>lightning__RecordPage</target>
    </targets>
    <targetConfigs>
    	<targetConfig targets="lightning__RecordPage">
    		<objects>
    			<object>Bear__c</object>
    		</objects>
    	</targetConfig>
    </targetConfigs>

    这样可以确保您的组件只能放置在Bear记录页面上。

  4. 将内容替换为bearLocation.html以下标记。
    <template>
    	<lightning-card title={cardTitle} icon-name="standard:address">
    		<lightning-map map-markers={mapMarkers} zoom-level="12"></lightning-map>
    	</lightning-card>
    </template>

    代码重点:

    • 我们根据cardTitle表达式显示带有动态标题的卡片组件。
    • 该卡包含一个地图组件,其标记由定义mapMarkers
  5. 用以下内容替换的内容bearLocation.js
    import { LightningElement, api, wire } from 'lwc';
    import { getRecord, getFieldValue } from 'lightning/uiRecordApi';
    // Set Bear object fields
    const NAME_FIELD = 'Bear__c.Name';
    const LOCATION_LATITUDE_FIELD = 'Bear__c.Location__Latitude__s';
    const LOCATION_LONGITUDE_FIELD = 'Bear__c.Location__Longitude__s';
    const bearFields = [
    	NAME_FIELD,
    	LOCATION_LATITUDE_FIELD,
    	LOCATION_LONGITUDE_FIELD
    ];
    export default class BearLocation extends LightningElement {
      @api recordId;
      name;
      mapMarkers = [];
      @wire(getRecord, { recordId: '$recordId', fields: bearFields })
      loadBear({ error, data }) {
        if (error) {
          // TODO: handle error
        } else if (data) {
          // Get Bear data
          this.name =  getFieldValue(data, NAME_FIELD);
          const Latitude = getFieldValue(data, LOCATION_LATITUDE_FIELD);
          const Longitude = getFieldValue(data, LOCATION_LONGITUDE_FIELD);
          // Transform bear data into map markers
          this.mapMarkers = [{
            location: { Latitude, Longitude },
            title: this.name,
            description: `Coords: ${Latitude}, ${Longitude}`
          }];
        }
      }
      get cardTitle() {
        return (this.name) ? `${this.name}'s location` : 'Bear location';
      }
    }

    代码重点:

    • 我们导入了一个getRecord适配器,该适配器使我们能够使用Lightning Data Service检索记录而无需编写Apex。
    • 我们导入一个getFieldValue辅助函数来检索字段值。
    • 我们Bear__cbearFields常量中汇编来自对象的硬编码字段名称的列表。请注意,这种方法不支持参照完整性。在编译时无法检查对象和字段的存在。这意味着Bear__c即使在您的代码中使用了它,也可以删除它的任何字段。我们在下一个组件中使用另一种支持引用完整性的方法。
    • recordId装饰为的属性会@api自动接收当前记录ID。
    • 我们@wireloadBear函数上使用装饰器来获取数据和错误,然后将它们传递给函数。@wire配置为getRecord使用某些参数调用适配器功能。这些参数是记录ID和我们希望检索的记录字段列表。感谢@wire装饰器,loadBear当组件加载或记录id更改时,它会自动调用。
    • 在此组件的第一个版本中,我们不处理错误。我们暂时跳过。
    • 如果没有错误,我们将保存熊的名称并使用熊的坐标构建地图标记。
  6. 将更新的代码部署到组织。右键单击默认文件夹,然后单击SFDX:将源部署到组织

将Bear位置组件添加到Bear Record页面

现在我们已经实现了组件,让我们将其添加到页面中以对其进行查看。

  1. 在您的组织中,导航至Bears标签并打开任何记录。
  2. 单击设置( 安装装置),然后选择编辑页面
  3. 在“定制组件”下,找到您的bearLocation组件并将其拖到右侧列的顶部。
  4. 点击保存
  5. 由于这是我们第一次修改标准Bear记录页面,因此我们需要激活更新的页面,以便我们的用户可以看到我们所做的事情。点击激活
  6. 单击应用程序默认选项卡。
  7. 点击分配为应用默认值
  8. 检查Ursus公园
  9. 单击下一步,下一步,然后单击保存
  10. 单击上一步返回到Bear记录页面并检查您的工作。

熊记录页面上的熊位置组件

做得好!现在,我们可以在地图上看到熊。让我们继续自定义熊记录页面。

创建Bear Supervisor组件

公园护林员被分配来监督特定的熊。如果发现熊做了鲁doing的事情,公园员工必须能够迅速联系到熊的主管。您将在熊记录页面上添加熊主管卡来提供帮助。

  1. 在VS Code中,右键单击该lwc文件夹,然后单击SFDX:Create Lightning Web Component
  2. 命名组件bearSupervisor
  3. 编辑bearSupervisor.js-meta.xml文件,并替换<isExposed>false</isExposed>为这些行。
    <isExposed>true</isExposed>
    <targets>
    	<target>lightning__RecordPage</target>
    </targets>
    <targetConfigs>
    	<targetConfig targets="lightning__RecordPage">
    		<objects>
    			<object>Bear__c</object>
    		</objects>
    	</targetConfig>
    </targetConfigs>

    这使您的组件可以放置在Bear记录页面上。

  4. 将以下内容替换为bearSupervisor.html
    <template>
    	<lightning-card title="Supervisor" icon-name="standard:people">
    		<div class="slds-var-m-around_medium">
    			<!-- Show supervisor when bear is loaded -->
    			<template if:true={bear.data}>
    				<lightning-record-form
    					object-api-name="Contact"
    					record-id={supervisorId}
    					layout-type="Compact">
    				</lightning-record-form>
    			</template>
    			<!-- Data failed to load -->
    			<template if:true={bear.error}>
    				<div class="slds-text-color_error">
    					An error occurred while loading the bear record
    				</div>
    			</template>
    		</div>
    	</lightning-card>
    </template>

    代码重点:

    • if:true加载熊数据后,我们使用指令有条件地呈现主管。
    • 我们使用来显示主管(联系人)记录的紧凑视图lightning-record-form
    • 如果无法加载Bear记录if:true,则使用指令和error属性有条件地呈现错误消息。
  5. 将以下内容替换为bearSupervisor.js
    import { LightningElement, api, wire } from 'lwc';
    import { getRecord, getFieldValue } from 'lightning/uiRecordApi';
    // Import Bear object fields
    import SUPERVISOR_FIELD from '@salesforce/schema/Bear__c.Supervisor__c';
    const bearFields = [SUPERVISOR_FIELD];
    export default class BearSupervisor extends LightningElement {
    	@api recordId; // Bear Id
    	@wire(getRecord, { recordId: '$recordId', fields: bearFields })
      bear;
    	get supervisorId() {
    		return getFieldValue(this.bear.data, SUPERVISOR_FIELD);
    	}
    }

    代码重点:

    • 我们Bear__c.Supervisor__c通过模式导入来导入字段,而不是像以前在熊位置组件中那样使用硬编码字符串。这种方法的主要好处是可以确保引用完整性。
    • 我们使用@wire装饰器和getRecord适配器检索熊记录。
    • 我们公开一个supervisorId表达式。该表达式使用该getFieldValue函数来检索主管字段的值。
  6. 将更新的代码部署到组织。右键单击默认文件夹,然后单击SFDX:将源部署到组织

将Bear Supervisor组件添加到Bear Record页面

让我们将新组件添加到熊记录页面。

  1. 在您的组织中,通过单击“熊”选项卡并单击任何熊来导航到熊记录页面。在熊记录页面中,单击设置( 安装装置),然后选择编辑页面
  2. 在“定制组件”下,找到您的bearSupervisor组件并将其拖动到bearLocation组件下。
  3. 单击保存返回以返回到记录页面并检查您的工作。

熊记录页面上的熊主管组件

这就是步骤。我们已经看到了Lightning Web组件如何使用@wire适配器处理单个记录。现在让我们进入记录列表。

使用Lightning Web组件构建Bear-tracking应用程序 – 创建一个Hello World Lightning Web组件

学习目标

在此项目中,您将:

  • 构建一组简单的Lightning Web组件。
  • 从单个记录,然后从记录列表中检索并显示数据。
  • 将功能封装到子组件中。
  • 使用事件进行跨组件通信。

介绍

在这个项目中,您将通过创建一个让公园管理员跟踪熊的应用程序来尝试Lightning Web Components的基本概念。

Lightning Web Components是用于构建Lightning组件的新编程模型。它使用最新的Web标准,并且可以与原始的Aura编程模型互操作。

在此项目中,您为虚拟国家公园Ursus Park工作。您创建的应用程序允许护林员跟踪在公园中游荡的熊。

已完成的Ursus Park应用程序概述

注意

注意

在此项目中,我们针对Trailhead Playground组织进行开发。您还可以使用以下force:source:push命令针对临时组织开发Lightning Web组件。通过“使用Salesforce DX进行应用开发”模块了解有关源驱动开发的更多信息 。

在你开始之前

在进行此项目之前,请确保完成“快速入门:闪电Web组件”中的这些步骤 。如果您尚未完成快速入门中的步骤,则将无法完成该项目。

确保已安装VS Code和Salesforce CLI。

设置您的Trailhead游乐场

  1. 要创建新的Trailhead Playground,请点击此步骤末尾的下拉菜单,然后选择Create a Trailhead Playground在模块的动手练习中创建一个Trailrail游乐场下拉菜单。
  2. 拥有Trailhead游乐场后,单击“启动”。

如果您在组织中看到一个标签为“获取登录凭据”的标签,那就太好了!请按照以下步骤操作。 

如果不是,请打开App Launcher( 应用启动器),找到并选择Playground Starter,然后按照以下步骤操作。如果您没有看到Playground Starter应用程序,请在Trailhead帮助中签出 查找Trailhead Playground的用户名和密码

  1. 单击获取您的登录凭据选项卡,并记下您的用户名。
  2. 单击重置我的密码。这会将电子邮件发送到与您的用户名关联的地址。
  3. 单击电子邮件中的链接。
  4. 输入新密码,确认,然后单击更改密码

设置Ursus Park应用

  1. 打开命令提示符,例如Windows上的cmd或MacOS上的Terminal。
  2. 克隆Ursus Park应用程序git存储库。
    git clone https://github.com/trailheadapps/build-apps-with-lwc.git

    该存储库包含Ursus Park应用程序,具有一组字段,记录和页面布局的Bear对象以及用于检索熊记录和样本熊记录的Apex代码。该项目基础帮助我们专注于Lightning Web Component开发。请注意,VS Code集成了Git支持,您也可以直接从开放源代码站点(https://git-scm.com/)安装它。

  3. 导航到新的build-apps-with-lwc目录。
    cd build-apps-with-lwc
  4. 使用Salesforce CLI授权Trailhead Playground,使用bear-tracking别名保存它,并将当前用户设置为默认用户:
    sfdx auth:web:login -s -a bear-tracking
  5. 当带有Salesforce登录页面的浏览器窗口打开时,输入您的Trailhead Playground凭据。
  6. 将应用程序代码部署到组织中。
    sfdx force:source:deploy -p force-app/main/default
  7. 将Ursus Park用户权限集分配给当前用户。
    sfdx force:user:permset:assign -n Ursus_Park_User
  8. 导入样本数据。
    sfdx force:data:tree:import -p data/plan.json
  9. 在浏览器中打开组织。
    sfdx force:org:open
  10. 在应用启动器( 应用启动器)中,找到并选择Ursus Park。这将打开闪电应用程序。
  11. 单击Bears选项卡,并确保已填充一些示例数据。

使用静态HTML创建Hello World Lightning Web组件

让我们创建第一个Lightning Web组件:一个简单的hello world组件。

  1. 打开VS Code。
  2. 通过单击文件>打开 文件夹并导航到该build-apps-with-lwc文件夹 ,添加刚从GitHub克隆的项目文件夹。
  3. 在边栏中,展开force-app/main/default文件夹。
  4. 在以下位置创建一个lwc文件夹force-app/main/default
  5. 右键单击该lwc文件夹,然后单击SFDX:创建Lightning Web组件并命名该组件helloWebComponent
    或者,您可以通过sfdx force:lightning:component:create --type lwc -n helloWebComponent -d force-app/main/default/lwc在命令提示符下运行来获得相同的结果。
  6. 将内容替换为helloWebComponent.html以下标记。
    <template>
    	<lightning-card title="Lightning Web Component" icon-name="custom:custom14">
    		<div class="slds-var-m-around_medium">
    			<h2>Hello World!</h2>
    		</div>
    	</lightning-card>
    </template>

    该标记使用静态文本定义了 卡片基础组件

  7. 编辑helloWebComponent.js-meta.xml文件,并替换<isExposed>false</isExposed>为这些行。
    <isExposed>true</isExposed>
    <targets>
    	<target>lightning__AppPage</target>
    	<target>lightning__RecordPage</target>
    	<target>lightning__HomePage</target>
    </targets>

    这些额外的行允许您将组件添加到Lightning App Builder中的任何类型的Lightning页面。

  8. 将更新的代码部署到组织。在VS Code中,右键单击默认文件夹,然后单击SFDX:将源部署到组织

将Hello World组件添加到页面

现在我们已经实现了组件,让我们将其添加到页面中以对其进行查看。

  1. 在浏览器中打开组织:
    sfdx force:org:open
  2. 在应用启动器( 应用启动器)中,找到并选择Ursus Park。这将打开应用程序主页。
  3. 单击齿轮图标( 安装装置 ),然后选择“编辑页面”
  4. 在“自定义组件”下,找到您的helloWebComponent组件并将其拖动到右侧列的顶部。
  5. 点击保存
  6. 由于这是我们第一次修改标准主页,因此我们需要激活更新的页面,以便我们的用户可以看到我们所做的事情。点击激活
  7. 单击应用程序默认选项卡。
  8. 单击分配给应用程序
  9. 检查Ursus公园
  10. 单击下一步,然后单击保存
  11. 单击上一步返回键返回到主页。

Ursus Park主页上的静态Lightning Web组件

恭喜你!您刚刚创建了第一个Lightning Web组件并将其添加到Lightning Experience中的页面。这个第一个版本并没有太大的作用,所以让我们将其转变为更具动态性的东西。

使用数据绑定

让我们向组件中添加一些数据。我们将使用单向数据绑定。我们首先显示只读数据,然后使其可编辑。

  1. 在“ VS代码”中,单击helloWebComponent.html以对其进行编辑。替换<h2>Hello World!</h2><h2>Hello {greeting}!</h2>。这将为greeting我们在下一步中定义的属性添加绑定。
  2. 编辑helloWebComponent.js其内容并替换为以下内容。
    import { LightningElement } from 'lwc';
    export default class HelloWebComponent extends LightningElement {
    	greeting = 'Trailblazer';
    }

    这将声明并初始化一个greeting属性。此属性是反应性的。换句话说,只要greeting更改值,组件的HTML模板就会自动刷新。

  3. 将更新的代码部署到组织。右键单击默认文件夹,然后单击SFDX:将源部署到组织
  4. 在组织中,刷新Ursus Park主页,并注意您的组件已更改(它现在显示“ Hello Trailblazer!”而不是“ Hello World!”)。

做得好!您已经实现了数据绑定:greeting读取并显示了该属性,但是用户暂时无法修改该属性。

让我们更进一步,并通过添加输入字段使数据可编辑。

  1. 在VS Code中,编辑helloWebComponent.html并在下面添加以下行<h2>Hello {greeting}!</h2>
    <lightning-input
    label="Name"
    value={greeting}
    onchange={handleGreetingChange}
    ></lightning-input>

    这段代码添加了一个用SLDS样式化的文本输入字段。输入使用greeting属性初始化。每当输入更改时,它将调用handleGreetingChange我们在下一步中定义的JavaScript函数。

  2. 编辑helloWebComponent.js并在下方添加以下行greeting = 'Trailblazer';
    handleGreetingChange(event) {
    	this.greeting = event.target.value;
    }

    这定义了一个函数,该函数从事件(来自输入字段的输入更改事件)中捕获值并将其分配给greeting属性。

  3. 将更新的代码部署到组织。右键单击默认文件夹,然后单击SFDX:将源部署到组织
  4. 在组织中,刷新主页,并注意在编辑文本字段时如何立即更新组件。

Ursus Park主页上具有数据绑定的Lightning Web组件

您已建立数据绑定,并使数据可编辑。greeting每当您在输入字段中更改其值时,该属性就会显示并自动刷新。

显示属性只是一个开始,但是如果需要在呈现之前转换其值怎么办?Lightning Web Components使您可以使用表达式。

使用表达式

让我们进入一些更高级的主题,并使用表达式来显示动态值。我们将添加一个表达式,该表达式以大写字母返回您的名字的问候消息。

  1. 在VS Code中,编辑helloWebComponent.html并替换title="Lightning Web Component"title={capitalizedGreeting}
  2. 替换<h2>Hello {greeting}!</h2><p>Today is {currentDate}</p>
  3. 编辑helloWebComponent.js并在handleGreetingChange功能块上方添加以下几行。
    currentDate = new Date().toDateString();
    get capitalizedGreeting() {
    	return `Hello ${this.greeting.toUpperCase()}!`;
    }

    这定义了一个currentDate类属性和一个capitalizedGreetinggetter函数。这些getter函数称为表达式。它们用于显示值,就像属性一样,但是表达式值可以基于函数中编写的某些逻辑来计算。与属性不同,表达式不是被动的:每次重新渲染组件时,表达式都会自动重新评估。无论其值是否更改,这都是正确的。当用户在组件的输入中键入内容时,handleGreetingChange事件处理程序函数将更新greeting属性的值。由于greeting是反应性的,因此会触发重新渲染,从而迫使表达式重新评估。请注意,我们声明了currentDateclass属性,用于保存和显示当前日期,而不使用表达式。我们也可以使用just编写表达式,return new Date().toDateString();但是使用属性的好处是不必Date为每个重新渲染创建新对象。

  4. 将更新的代码部署到组织。右键单击默认文件夹,然后单击SFDX:将源部署到组织
  5. 在组织中,刷新“主页”并注意表达式的显示方式。

在Ursus Park主页上带有表达式的Lightning Web组件

如您所见,表达式使我们能够使组件模板保持逻辑清晰。实际上,使用表达式是在显示属性值之前对其进行转换的唯一方法。

这就是步骤。您已经建立了带有基本组件,数据绑定和表达式的基本hello world组件。

现在我们已经涵盖了基础知识,让我们继续进行一些更令人兴奋的事情。

快速入门:探索Visualforce至LWC示例应用程序 – 探索Visualforce转LWC示例应用程序

使用应用程式

您可以通过两种方式使用此应用。因为您克隆了visualforce-to-lwc存储库,所以可以简单地在Visual Studio Code中打开该文件夹并挖掘源代码。但是您还刚刚在Trailhead Playground中安装了一个闪亮的新应用程序,因此让我们开始吧!

在这个项目中,我们探索了五个关键模式的例子。

  • 查看包含来自父记录的数据的记录。
  • 列出记录并带有打开每个记录的链接。
  • 列出记录以及来自父记录的数据。
  • 使用页面导航控件在分页列表中显示记录。
  • 单击一个按钮以创建两个不同类型的记录。

我们不会深入研究每种模式的代码。相反,我们将浏览该应用程序,并在我们的Lightning Web组件示例中解释如何实现您在Visualforce中熟悉的功能。

让我们开始吧。

单条记录

  1. 单击“单个记录”选项卡。
  2. 单击带我到那里!
  3. 查看带有家长记录数据卡的查看记录。
    此卡显示了如何在Visualforce和Lightning Web组件中显示带有父记录数据的帐户记录(帐户所有者)。
    “使用父记录数据查看记录”示例在Visualforce中将帐户名称,电话号码,帐户类型和帐户所有者名称显示为Lightning Web组件。
  4. 单击查看Visualforce源并查看代码。
    在Visualforce中,我们使用apex:form和标准控制器字段显示记录详细信息。
  5. 单击查看LWC源,然后查看代码。
    在Lightning Web组件中,我们将lightning-record-edit-form基础组件与getRecord有线适配器(由Lightning Data Service提供支持)组合在一起,以检索记录及其字段。这样,我们就可以为记录及其父级获得Lightning Data Service的所有缓存和同步优势。

记录清单

  1. 单击记录列表选项卡。
  2. 查看带有记录链接的列表卡。
    在帐户列表中,帐户名称是指向帐户详细信息页面的超链接。(在此应用中,我们用示例替换了标准帐户详细信息页面。如果您在另一个组织中使用此组件,则该链接将打开预期的帐户详细信息页面。)
    “带有记录链接的列表”示例在表中列出了具有帐户名称,类型,电话和员工人数的帐户。 有一个Visualforce实现和一个Lightning Web组件。
  3. 单击查看LWC源
    在示例中,我们lightning-datatable通过调用cacheableApex方法来填充@wire。此示例有趣的部分是,我们使用了自定义单元格渲染器lightning-datatable来显示记录链接。
  4. 将您的注意力转移到“父母记录数据清单”卡上。
    本示例检索一个帐户列表,包括父记录数据(帐户所有者的姓名)。
    “带有父记录数据的列表”示例在一个表中列出了具有四列的帐户:“帐户名称”,“类型”,“电话”和“所有者名称”。 有一个Visualforce实施和一个Lightning Web组件。
  5. 单击查看LWC源
    就像在“带有记录链接的列表”示例中所做的一样,我们通过使用调用cacheableApex方法来填充表格@wire。但是,由于lightning-datatable独立于数据源,因此我们必须转换数据以匹配lightning-datatable组件期望的格式。在此示例中,我们为您提供了一种方法,该方法可以对查询到的相关记录中的任何级别执行递归转换。
  6. 现在查看分页列表卡。
    本示例在分页列表中显示记录。尽管无限制滚动是首选的用户体验,但在某些情况下您可能仍想使用分页。这就是为什么我们包含此示例。
    分页列表示例显示帐户列表的一页,底部带有分页控件。 有一个Visualforce实现和一个Lightning Web组件。
  7. 单击查看LWC源
    就像我们探索的先前示例一样,此示例使用调用Apex @wire。但是,在这种情况下,适配器仅检索第一页的前五个记录。直到您转到第2页,它才会检索第2页的记录6–10。

混合记录

  1. 单击混合记录选项卡。
  2. 查看通过LDS功能卡创建混合记录。
    本示例使用JavaScript创建两个不同类型的记录:联系人和机会。
    通过LDS功能创建混合记录示例具有三个输入(名字,姓氏和机会名称)和一个“创建联系人和机会”按钮。 有一个Visualforce实现和一个Lightning Web组件。
  3. 对于新联系人,请保留默认值:Yan Khang
  4. 为了获得机会,请保留默认值:Possible deal
  5. 单击创建联系人和机会按钮。
    应该显示两个成功消息。
  6. 单击查看LWC源
    为了创建记录,我们对createRecordLDS函数执行了两个独立的调用。请注意,每个方法调用都在其自己的事务上运行,并且创建的记录是不相关的。

快速入门:探索Visualforce至LWC示例应用程序 – 将Visualforce部署到LWC示例应用程序

学习目标

在此项目中,您将:

  • 将Visualforce部署到LWC示例应用程序。
  • 探索从Visualforce到LWC的示例应用程序及其示例代码。
  • 了解如何将五个关键模式实现为Lightning Web组件。

欢迎使用Visualforce开发人员!我们很高兴你在这里。我们凭借在Visualforce中的开发经验,特别为您编写了该项目。

Visualforce转LWC示例应用程序

为什么我们创建Visualforce到LWC示例应用程序?Visualforce是一种流行且被广泛采用的技术。许多开发人员维护Visualforce页面,甚至在一些新项目上,开发人员仍然选择使用Visualforce。我们知道从Visualforce过渡到Lightning Web Components可能会令人生畏。

我们创建了Visualforce至LWC示例应用程序,以帮助您进行Lightning Web Components编程。该应用程序与等效的Lightning Web组件一起显示Visualforce中的常用模式。我们为这两种实现提供了代码,因此您可以比较它们并了解Lightning Web组件代码与您熟悉的Visualforce代码有何不同。您甚至可以在学习时自行复制,粘贴,改编和试验代码。

您熟悉的一些Visualforce概念也适用于Lightning Web组件。有些没有。适用于Visualforce开发人员的 Lightning Web组件 模块将Visualforce概念映射到Lightning Web组件。它还强调并说明了开发Lightning Web组件与使用Visualforce开发在根本上不同的方式。在探索从Visualforce到LWC的示例应用程序之前或之后,应对Visualforce Developers的Lightning Web Components模块。它们是互补的。

Visualforce至LWC应用程序显示四种布局模式:页面块,面板网格,面板栏和选项卡。 每个示例都有一个Visualforce实现和一个LWC实现。

关于这个项目

在此快速入门项目中,您将从Trailhead样本库安装样本应用程序 。该示例应用程序包含一些示例,您可以使用这些示例来了解Lightning Web组件。它还具有代码,可让您从头开始开发自己的Lightning Web组件。

如果您想浏览示例应用程序库,请参阅 快速入门:浏览示例应用程序库。

在你开始之前

在执行此动手项目中的步骤之前,请确保完成“ 快速入门:闪电Web组件”。该徽章将引导您完成在Salesforce DX开发环境中的设置和工作。

注意

要创建和开发Lightning Web组件,您需要一套称为Salesforce DX(开发人员体验)的工具。它包括Salesforce命令行界面(CLI)和Visual Studio代码,该代码与Salesforce Extension Pack一起,是在Salesforce平台上开发的推荐代码编辑器。

要克隆包含示例应用程序的存储库,请使用版本控制系统Git。请按照此步骤中的说明安装Git。然后按照示例应用程序自述文件中的说明克隆示例应用程序存储库,并将示例应用程序部署到您的Trailhead Playground。

创建一个新的Trailhead游乐场

对于此项目,您需要创建一个新的Trailhead Playground。滚动到该页面的底部,单击“启动”旁边的向下箭头,然后选择“ 创建Trailhead游乐场”。创建新的Trailhead游乐场通常需要3-4分钟。

注意:是的,我们的意思是全新的Trailhead游乐场!如果您使用现有的组织或游乐场,则可能会遇到无法完成挑战的问题。

获取您的Trailhead Playground用户名和密码

让我们开始吧。转到您的Trailhead游乐场。(如果尚未打开,请滚动至该页面的底部,然后单击启动。)如果您在组织中看到一个标签为Get Your Login Credentials的标签,太好了!跳至步骤1。

否则,请从应用启动器(应用启动器)中找到并打开Playground Starter,然后按照以下步骤操作。如果您没有看到Playground Starter应用程序,请 在Trailhead帮助中签出 查找Trailhead Playground的用户名和密码。

  1. 单击获取您的登录凭据选项卡,并记下您的用户名。
  2. 单击重置我的密码。这会将电子邮件发送到与您的用户名关联的地址。
  3. 单击电子邮件中的链接。
  4. 输入新密码,确认,然后单击 更改密码

获取Git命令行

  1. 从https://git-scm.com/downloads安装Git 。接受所有默认安装设置。
  2. 确认已安装Git。在终端(macOS)或命令提示符(Windows)中,输入以下命令:
    git
    输出应为git命令列表。

部署应用

现在,您已经安装并集成了所有工具,现在可以使用Visual Studio Code将Visualforce部署到Trailhead Playground中的LWC示例应用程序。

  1. 打开Visual Studio代码。
  2. 打开命令面板:单击 查看| 命令面板
    或者,按Ctrl + Shift + P(Windows)或Cmd + Shift + P(macOS)
  3. 打开终端窗口:单击 终端| 新航站楼
    在此处输入或粘贴以下说明中提供的命令。
  4. 按照项目自述文件中的说明将应用程序部署到您的Trailhead Playground组织中 ,跳过步骤3。(您无需为标准Trailhead Playground注册“我的域”。)

适用于Visualforce开发人员的Lightning Web组件 – 使用导航服务并重新使用Visualforce

学习目标 

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

  • 说明如何在Lightning Web组件中实现导航模式。
  • 评估是将特定的Visualforce功能移至Lightning还是将其保留在Visualforce中。
  • 描述Lightning Web组件如何与Visualforce页面交互。

我们已经看到了如何使用一些Visualforce概念来理解Lightning Web Components基础。我们还看到了如何有效使用Salesforce数据。在本单元中,我们涵盖两个剩余的概念:导航和Visualforce重用。最后,我们用一些建议的后续步骤包装了此模块。

URLFOR与导航服务

执行导航任务的模式在Visualforce中很常见。Visualforce页面通常使用URLFOR带有<apex:commandButton><apex:commandLink>标记的功能来导航到Salesforce内部或外部的页面。Apex控制器方法还可以通过返回来简化导航PageReferences。 

以编程方式从Lightning Web组件导航到其他任何地方的首选方法是使用 Lightning Navigation Service。该服务允许您生成URL,导航到页面引用,使用URL参数以及打开文件。支持许多 页面引用类型,例如App,Lightning Component,Navigation Item(选项卡)和Record Page。

导航服务通过使用有意义的PageReference对象来执行导航,从而消除了硬编码的URL 。如果Salesforce更改了特定的URL,则链接到该URL的代码不会中断。

要使用导航服务:

  1. lightning/navigationJavaScript模块导入Lightning Web组件。
  2. 使Lightning Web组件的类扩展NavigationMixin
  3. 调用该Navigate方法,传递要导航到的页面的页面引用。

注意

混入是一种特殊类型的JavaScript类的。其他类可以在不继承mixin类的情况下调用mixin中的方法。

考虑此示例,该示例使用导航服务导航到联系人列表页面。

clientSideNavigation.js

import { LightningElement } from 'lwc';
import { NavigationMixin } from 'lightning/navigation';
export default class ClientSideNavigation extends NavigationMixin(LightningElement) {
    handleButtonClick() {
        this[NavigationMixin.Navigate]({
            type: 'standard__objectPage',
            attributes: {
                objectApiName: 'Contact',
                actionName: 'list'
            }
        });
    }
}

代码重点:

  • 第2行:我们NavigationMixinlightning/navigation模块导入。
  • 第3行:ClientSideNavigation定义组件的类扩展了NavigationMixin
  • 第4-10行:当handleButtonClick方法运行时(在用户单击按钮之后),导航服务将用户重定向到listContact对象的页面。这可以通过调用mixinNavigate方法来实现。

在Lightning体验中重用Visualforce

假设您想继续在Lightning Experience中使用Visualforce页面。你可以做到的。许多低代码工具都支持Visualforce页面,包括Lightning页面,Utility栏和Quick Actions。该 Visualforce和闪电体验模块解释了如何配置你的Visualforce页面在闪电体验使用。Visualforce和Lightning Web组件也可以共存于同一页面上并进行交互。

如果要在Visualforce页面上的特定位置包含Lightning Web组件,请使用 Visualforce JavaScript库的Lightning组件。该技术使用iframe,并为您提供了在组件和Visualforce页面之间进行通信的工具。

Visualforce的Lightning组件适用于Aura组件和Lightning Web组件。

使用Lightning Message Service可以促进DOM的不同层次结构中的Lightning组件和Visualforce页面之间的通信。LWC Recipes示例应用程序演示了如何使用Lightning Message Service发布和订阅消息。

重建与重用

在开始开发Lightning Web组件时,需要确定何时在Lightning Experience中重新使用Visualforce页面以及何时将其重建为Lightning Web组件。认真考虑在需要时进行重建:

  • 更具吸引力和响应能力的用户体验。
  • 易于针对多种设备尺寸进行优化的体验。
  • 在您的应用程序中获得更好的性能。

对于新开发,我们始终建议使用Lightning Experience低代码工具和Lightning Web组件。它们提供了各种好处并简化了开发过程。

包起来

恭喜你!除了学习Lightning Web组件的体系结构和编码概念,访问数据以及处理服务器错误之外,您还创建并部署了四个Lightning Web组件。 

现在您已经了解了Visualforce与Lightning Web Components的比较方式,我们希望从Visualforce过渡到Lightning Web Components的开发似乎没有那么艰巨。通过Trailhead上的这些学习资源,继续您的Lightning Experience UI开发之旅。

适用于Visualforce开发人员的Lightning Web组件 – 使用Salesforce数据

学习目标

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

  • 意识到根据特定用例选择最佳方式使用Salesforce数据的重要性。
  • 描述闪电数据服务如何与Visualforce中的标准控制器进行比较。
  • 说明在Lightning Web组件中使用Apex与在Visualforce中使用Apex有何不同。

Visualforce与Lightning Web组件中的数据访问

作为Visualforce开发人员,您熟悉在页面中使用标准控制器和绑定Apex控制器方法以使用Salesforce数据的情况。在Lightning Web Components中,您的JavaScript代码与Lightning Data Service(LDS)或Apex代码进行交互。

传统的Visualforce数据访问 闪电Web组件数据访问
客户端如何在Visualforce中访问服务器上的数据 客户端如何在Lightning Web Components中访问服务器上的数据

检索或修改数据的Visualforce页面使用标准控制器或Apex控制器。传统上,客户端在页面加载或作为操作时调用控制器方法。方法运行后,Visualforce引擎将生成最终标记并将其发送给客户端。

检索或修改数据的Lightning Web组件使用Lightning Data Service或Apex方法。客户端使用JavaScript调用Lightning Data Service或Apex方法。在运行Lightning Data Service或Apex方法之后,Lightning Web Components引擎会将所需的最少数据返回给客户端。客户端上的JavaScript处理数据并生成最终标记。

闪电数据服务与StandardController

Lightning Data Service 是在Lightning Web组件中使用Salesforce数据的首选(也是最简单)方式。闪电数据服务是与Visualforce标准控制器类似的概念。在JavaScript中使用Lightning Data Service在不编写Apex代码的情况下读取,创建或修改单个记录,或读取某些元数据。Lightning Data Service提供了高级功能,例如组件之间的缓存和同步。

注意

要使用Lightning Data Service,您有两个选择:使用允许您构建表单的基本组件,或使用LDS电线适配器或功能。使用Lightning Data Service的代码非常具体,并且在Lightning Web组件和Salesforce数据 模块中的“使用Lightning Data Service来处理数据”中进行了详细说明 。

Visualforce中的Apex与Lightning Web Components中的Apex

Lightning Data Service不能满足所有用例的要求。例如,当您要自定义单记录数据事务或对单个事务执行多记录操作时,需要Apex。在将Apex与Lightning Web组件一起使用之前,请注意在Lightning Web组件中使用Apex与在Visualforce中使用Apex是不同的。主要区别在于:

  • 方法是无状态的。
  • 方法必须是@AuraEnabled,并且可以标记为可缓存。
  • 您导入Apex方法,然后调用它们。
  • 您绑定组件以在元数据xml文件中记录页面,并在JavaScript文件中访问记录ID。
  • 正确的错误处理涉及引发异常,而不是使用页面消息。

让我们进一步探讨这些差异。

查看状态与无状态方法

Visualforce使用视图状态来维护服务器请求之间的状态。视图状态将重新创建页面,并将状态传递到向导和指导工作流程中的不同页面。在Lightning Web组件中,服务器请求是无状态的。这对您编写Apex调用的方式具有重要意义。每次进行Apex调用时,都必须传递该方法所需的所有信息,并且该方法必须返回组件所需的所有信息。此外,要从Lightning Web组件调用Apex方法,该方法必须带有注释@AuraEnabled

让我们研究一下Visualforce Apex控制器。

AccountListControllerVisualforce.cls

public with sharing class AccountListControllerVisualforce {
    public List<Account> accounts { get; private set; }
    public Integer numberOfEmployees { get; set; }
    public void queryAccounts() {
        // In real world, probably more complex logic here
        this.accounts = [
            SELECT Name
            FROM Account
            WHERE NumberOfEmployees = :numberOfEmployees
        ];
    }
}

代码重点:

  • 第2至3行:accounts和 numberOfEmployees属性定义为实例变量,它们是控制器视图状态的一部分。
  • 第6至9行:该queryAccounts方法numberOfEmployees在 accounts变量中存储了由过滤的帐户列表,我们可以在Visualforce页面中引用该列表。

以下是将该AccountListController for Visualforce转换为Lightning Web组件的控制器的方法。

  1. 使用@AuraEnabled,使用cacheable属性或不使用属性注释Apex方法。(默认情况下,数据 不可在客户端中缓存。)
  2. 通过使其成为无状态static且独立于所有实例变量和属性的方法,确保它们是无状态的。
  3. 将方法需要的所有内容作为参数传递。
  4. 确保每种方法都返回组件所需的一切。

这是适用于Lightning Web组件的控制器。

AccountListControllerLwc.cls

public with sharing class AccountListControllerLwc {
    @AuraEnabled(cacheable=true)
    public static List<Account> queryAccounts(Integer numberOfEmployees) {
        return [ // Return whatever the component needs
            SELECT Name
            FROM Account
            WHERE NumberOfEmployees >= :numberOfEmployees
        ];
    }
}

代码重点:

  • 第2行:使用注释queryAccounts方法 @AuraEnabled,并将其cacheable属性设置为true。
  • 第3行:创建queryAccounts方法static,并将其定义numberOfEmployees为Integer参数。
  • 第4-8行:该queryAccounts方法返回过滤后的帐户列表。

注意

将方法标记为可缓存时,避免重复调用服务器。但是,在刷新缓存之前,可能不会返回新添加或更改的记录版本。要了解缓存Apex方法的含义以及如何刷新缓存,请参阅Lightning Web Components和Salesforce数据 模块中的“使用Apex处理数据” 。

在Visualforce vs Lightning Web组件中调用Apex

在Visualforce中,要在组件标记中引用Apex方法,可以通过将Apex控制器指定为<apex:page>标签中的属性来将其绑定到Visualforce页面。在Lightning Web Components中,我们没有绑定控制器并引用页面中的Apex方法,而是将这些方法导入JavaScript文件,然后在JavaScript中调用这些方法。

import queryAccounts from '@salesforce/apex/AccountListControllerLwc.queryAccounts;

与Lightning Web组件中的Apex方法进行交互的方式有两种:连接方法或强制调用方法。接线方法将控件委派给Lightning Web Components引擎并创建响应服务。强制调用Apex会导致一次性调用。确切地说,何时以及如何使用每个选项超出了本模块的范围。要了解更多信息,请参阅 Lightning Web Components和Salesforce数据 模块。

在Visualforce vs Lightning Web组件中访问记录ID

在Visualforce中,访问Apex控制器中的记录ID非常简单。使用标准控制器,您可以IdApexPages.StandardController对象中检索记录 。

例如,考虑使用此Apex控制器,该控制器通过扩展使用“客户”标准控制器的页面来显示与客户相关的联系人。

AccountControllerVisualforce.cls

public with sharing class AccountControllerVisualforce {
    public List<Contact> contacts { get; private set; }
    private ApexPages.StandardController standardController;
    public AccountController(ApexPages.StandardController standardController) {
        this.standardController = standardController;
        this.contacts = new List<Contact>();
    }
    public void queryRelatedContacts() {
        this.contacts = [
            SELECT Name, Title, Email, Phone
            FROM Contact
            WHERE AccountId = :standardController.getId() // (2)
        ];
   }
}

代码重点:

  • 第4行:standardController因为页面使用Account标准控制器,所以我们在构造函数中收到一个对象。
  • 第12行:要获取Id页面引用的Account记录,我们getIdstandardController对象上调用方法 。这样,我们可以查询联系人以获取相关的客户记录,并为其过滤Id

在Lightning Web组件中,访问Apex中的记录ID不太简单。要访问记录ID:

  1. 公开组件,使其在记录页面上可用。
  2. 在JavaScript中,声明recordId为公共属性。父组件(记录Flexipage)填充recordId属性的值 。
  3. recordId在Apex方法调用中将as作为参数传递。

让我们来看一个例子。

accountDetails.js-meta.xml

<?xml version="1.0" encoding="UTF-8" ?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>48.0</apiVersion>
    <isExposed>true</isExposed>
    <targets>
        <target>lightning__RecordPage</target>
    </targets>
</LightningComponentBundle>

accountDetails.js

import { LightningElement, wire } from 'lwc';
import queryRelatedContacts from '@salesforce/apex/AccountControllerLwc.queryRelatedContacts';
export default class AccountInfo extends LightningElement {
    @api recordId;
    @wire(queryRelatedContacts, { accountId: '$recordId' })
    contacts;
}

AccountControllerLwc.cls

public with sharing class AccountControllerLwc {
    @AuraEnabled(cacheable=true)
    public static List<Contact> queryRelatedContacts(Id accountId) {
        return [
            SELECT Name, Title, Email, Phone
            FROM Contact
            WHERE AccountId = :accountId
        ];
    }
}

代码重点:

accountDetails.js-meta.xml

  • 第4-7行:我们将其设置isExposed为true并添加 lightning__RecordPage为该组件的目标,以使该组件在记录页面上可用。

accountDetails.js

  • 第4行:我们声明该recordId属性,并使用修饰它以使其公开@api。Flexipage会填充 recordId属性。
  • 第5-6行:我们将recordId属性作为参数传递给 queryRelatedContactsApex方法的 accountId参数。(在这种情况下,我们使用了 @wire,但是我们可以强制性地调用Apex。)结果存储在contacts属性中。

AccountControllerLwc.cls

  • 第3行:queryRelatedContactsApex方法接收 accountId作为参数。请记住,该方法是无状态的。
  • 第4-8行:该queryRelatedContacts方法用于 accountId返回客户的联系人。

Visualforce与Lightning Web组件中的服务器错误

在Visualforce中,您使用诸如<apex:pageMessages>和之类的 标记 <apex:pageMessage>以在Visualforce页面上以不同方式显示错误。为了使这些标记正常工作,必须在Apex控制器中处理异常并将消息添加 到页面,如下所示:

try {
    // Perform logic that may throw an exception.
} catch (Exception e) {
    ApexPages.addMessages(e);
}

在Lightning Web组件中,我们处理JavaScript文件中的异常。作为开发人员,您可以决定是引发AuraHandledException 异常还是通过引发异常或自定义异常来让异常传播或更好地控制向用户显示的内容 。引发这样的自定义异常:

try {
    // Perform logic that may throw an exception.
} catch (Exception e) {
    throw new MyCustomException('Records could not be retrieved at this time. Try again later');
}

Lightning Web组件和Salesforce数据 模块 中更详细地介绍了处理服务器错误 。

调用Apex以检索过滤的记录

在您创建的accountSearch组件中,让我们检索按提供的员工数量过滤的帐户列表。

    1. 创建一个AccountListControllerLwc Apex类:
      1. 在Visual Studio Code命令面板中,选择(或输入) SFDX:Create Apex Class,然后按 Enter
      2. 输入文件名,AccountListControllerLwc然后按Enter
      3. 接受默认位置(类),然后按 Enter
    2. 用以下代码替换AccountListControllerLwc类的内容:
public with sharing class AccountListControllerLwc {
    @AuraEnabled(cacheable=true)
    public static List<Account> queryAccountsByEmployeeNumber(Integer numberOfEmployees) {
        return [
            SELECT Name
            FROM Account
            WHERE NumberOfEmployees >= :numberOfEmployees
        ];
   }
}
    1. 保存AccountListControllerLwc类。
    2. 在您的accountSearch.js文件中,通过使用以下代码替换第一行代码,导入wire装饰器和queryAccountsByEmployeeNumberApex方法:
import { LightningElement, wire } from 'lwc';
import queryAccountsByEmployeeNumber from '@salesforce/apex/AccountListControllerLwc.queryAccountsByEmployeeNumber';
  1. 最后,在reset方法之后,添加以下代码:
    @wire(queryAccountsByEmployeeNumber, { numberOfEmployees: '$numberOfEmployees' })
    accounts;
  2. 保存accountSearch.js文件。
  3. 在accountSearch.html文件中的之后<lightning-button>,添加以下代码:
    <template if:true={accounts.data}>
        <template for:each={accounts.data} for:item="account">
             <p key={account.Id}>{account.Name}</p>
        </template>
    </template> 
  4. 保存accountSearch.html文件。
  5. 将AccountListControllerLwc类文件部署到您的Trailhead游乐场:右键单击classes文件夹,然后选择 SFDX:将源部署到Org
  6. 将accountSearch组件文件部署到Trailhead Playground:右键单击accountSearch文件夹,然后选择 SFDX:将源部署到Org
  7. 如果您的Trailhead Playground尚未打开,请打开它。(在命令选项板中,选择(或输入)SFDX:Open Default Org。)
  8. 导航到LWC Visualforce Devs页面并通过在“员工人数”字段中输入值来测试您的组件。当您更改员工人数时,应更新帐户列表。

您只是从Lightning Web组件中的Salesforce组织访问数据。做得好!现在,通过完成动手练习来自己尝试一个。

适用于Visualforce开发人员的Lightning Web组件 – 处理JavaScript中的用户操作

学习目标

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

  • 创建一个SFDX项目。
  • 创建一个闪电Web组件。
  • 应用架构和编码概念。

在Visualforce中,要执行UI更改,有时您需要在服务器上重新呈现页面。如您所知,在Lightning Web Components架构中,重新渲染发生在客户端上。您学习了如何在JavaScript中设置属性以更改组件状态,从而使Lightning Web Components引擎重新呈现组件。您还学习了如何响应JavaScript中的用户交互。让我们观察一下这些概念。考虑此示例Visualforce页面。

accountSearch.page

<apex:page controller="InputController" docType="html-5.0">
    <apex:form>
        <apex:input type="number" label="Number of Employees" value="{!numberOfEmployees}"/>
        <apex:commandButton value="Reset" action="{!reset}"/>
    </apex:form>
</apex:page>

AccountSearchController.cls

public class AccountSearchController {
    public Integer numberOfEmployees {get; set;}
    public void reset() {
        this.numberOfEmployees = null;
    }
}

重置按钮清除输入值,然后页面在服务器上重新呈现。在Lightning Web组件中,您可以单独使用JavaScript进行相同的UI更改,如下所示:

accountSearch.html

<template>
    <lightning-card>
        <lightning-input
            type="number"
            label="Number of Employees"
            value={numberOfEmployees}
            onchange={handleChange}>
        </lightning-input>
        <lightning-button
            label="Reset"
            onclick={reset}>
        </lightning-button>
    </lightning-card>
</template>

accountSearch.js

import { LightningElement } from 'lwc';
export default class AccountSearch extends LightningElement {
    numberOfEmployees = null;
    handleChange(event) {
        this.numberOfEmployees = event.detail.value;
    }
    reset() {
        this.numberOfEmployees = null;
    }
}

代码重点:

accountSearch.html

  • 第3-8行:我们使用一个lightning-input组件来接收用户输入。
  • 第6行:我们将numberOfEmployeesJavaScript属性绑定到lightning-input组件的value属性。
  • 第7行:我们将handleChange方法绑定到lightning-input组件的change事件。
  • 第9至12行:我们定义了lightning-button 基本组件
  • 第11行:当用户单击按钮时,Lightning Web Components引擎将调用该reset方法。

accountSearch.js 

  • 第5行:该handleChange方法读取lightning-input组件的change事件,获取用户输入的值,并将其存储在numberOfEmployees属性中。
  • 第7–9行:reset方法清空numberOfEmployees属性。通常,我们使用handleEventName约定来命名事件处理程序,但是在reset这里我们用来强调它与Apex控制器reset方法的相似性。

将传递valuelightning-input会导致组件重新呈现。与Visualforce实现的区别在于,重新渲染发生在客户端上,从而避免了对服务器的额外调用。

回应用户互动

现在,我们已经探索了Lightning Web Components和您熟悉的Visualforce开发之间的一些区别,让我们来看一个示例。

在你开始之前

Visualforce开发人员非常喜欢在开发人员控制台中工作。但是,Lightning Web Components的编程模型需要另一套称为Salesforce DX(开发人员体验)的开发人员工具。它包括Salesforce命令行界面(CLI)和Visual Studio代码,该代码与Salesforce Extension Pack一起,是在Salesforce平台上开发的推荐代码编辑器。Salesforce DX环境旨在:

  • 简化整个开发生命周期
  • 促进自动化测试
  • 支持持续集成
  • 使发布周期更加敏捷和高效

在开始本模块的动手练习和动手挑战之前,请确保您已完成《 快速入门:闪电Web组件》。该徽章的前两个步骤将逐步设置Salesforce DX开发环境。

创建一个新的Trailhead游乐场

对于此项目,您需要创建一个新的Trailhead Playground。滚动到该页面的底部,单击“启动”旁边的向下箭头,然后选择“创建Trailhead游乐场”。创建新的Trailhead游乐场通常需要3-4分钟。

注意:是的,我们的意思是全新的Trailhead游乐场!如果您使用现有的组织或游乐场,则可能会遇到无法完成挑战的问题。

获取您的Trailhead Playground用户名和密码

转到您的Trailhead游乐场。(如果尚未打开,请滚动至该页面的底部,然后单击启动。)如果您在组织中看到一个标签为Get Your Login Credentials的标签,太好了!跳至步骤1。 

否则,请从应用启动器(应用启动器)中找到并打开Playground Starter,然后按照以下步骤操作。如果您没有看到Playground Starter应用程序,请在Trailhead帮助中签出 查找Trailhead Playground的用户名和密码

  1. 单击获取您的登录凭据选项卡,并记下您的用户名。
  2. 单击重置我的密码。这会将电子邮件发送到与您的用户名关联的地址。
  3. 单击电子邮件中的链接。
  4. 输入新密码,确认,然后单击更改密码

准备好动手了吗?我们走吧。

在本练习中,您将创建一个Lightning Web组件,以响应用户交互而重新渲染。

    1. 创建一个新项目:
      1. 打开Visual Studio代码。
      2. 打开命令面板:单击查看命令面板
      3. 在命令面板中,选择SFDX:创建项目。(如果您没有在列表中看到它,请键入SFDX: Create Project,然后按Enter。)
      4. 接受标准模板。
      5. 输入项目名称,lwcForVisualforceDevs然后按Enter。
      6. 选择新项目的位置,然后单击“创建项目”
    2. 授权您的Trailhead游乐场:
      1. 在命令选项板中,选择(或输入)SFDX:授权组织
      2. 选择生产:login.salesforce.com
      3. 对于别名,请输入lwc_for_vf_devs,然后按Enter
      4. 使用您的Trailhead Playground用户名和密码登录。
      5. 登录到Trailhead Playground后,将其保持打开状态并返回到Visual Studio Code。
    3. 在Visual Studio Code中,打开一个终端窗口:单击Terminal |。新航站楼
    4. 在终端中,将Trailhead Playground设置为该项目的默认设置:输入此命令,然后按Enter
sfdx config:set defaultusername=lwc_for_vf_devs
    1. 创建一个闪电Web组件:
      1. 在“资源管理器”窗格中,展开“  force-app / main / default”。
      2. 右键单击lwc文件夹,然后选择SFDX:Create Lightning Web Component
      3. 输入组件名称,accountSearch然后按Enter键
      4. 再次按Enter接受默认目录。
    2. 用以下代码替换accountSearch.html文件的内容:
<template>
  <lightning-card>
      <lightning-input
          type="number"
          label="Number of Employees"
          value={numberOfEmployees}
          onchange={handleChange}>
      </lightning-input>
      <lightning-button
          label="Reset"
          onclick={reset}>
      </lightning-button>
  </lightning-card>
</template>
    1. 用以下代码替换accountSearch.js文件的内容:
import { LightningElement } from 'lwc';
export default class AccountSearch extends LightningElement {
    numberOfEmployees = null;
    handleChange(event) {
        this.numberOfEmployees = event.detail.value;
    }
    reset() {
        this.numberOfEmployees = null;
    }
}
    1. 要使此组件在组织中的应用程序页面上可用,请使用以下代码替换accountCreator.js-meta.xml文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>48.0</apiVersion>
    <isExposed>true</isExposed>
    <targets>
        <target>lightning__AppPage</target>
    </targets>
</LightningComponentBundle>
  1. 保存您编辑的三个文件:accountSearch.html,accountSearch.js和accountSearch.js-meta.xml。
  2. 将项目文件部署到Trailhead Playground:右键单击lwc文件夹,然后选择SFDX:将源部署到Org
  3. 如果您的Trailhead Playground尚未打开,请打开它。(在命令选项板中,选择(或输入)SFDX:Open Default Org。)
  4. 在您的Trailhead游乐场中,点击 设定,然后点击设置
  5. 在“快速查找”框中,输入Lightning App Builder,然后选择Lightning App Builder
  6. 创建一个新的闪电页面:
    1. 点击新建
    2. 选择应用程序页面,然后单击下一步
    3. 对于标签,输入LWC Visualforce Devs,然后单击下一步
    4. 对于布局,选择Header和Left Sidebar
    5. 点击完成
  7. accountSearch组件拖动到页面侧栏。
  8. 保存页面。
  9. 激活页面:
    1. 点击激活
    2. 保留默认的应用程序名称(LWC Visualforce Devs),然后单击保存
    3. 当提示您将页面添加到导航菜单时,点击完成
  10. 退出Lightning App Builder。
  11. 打开新页面:在App Launcher搜索中,输入lwc,然后在Items下选择LWC Visualforce Devs
  12. 在输入字段中输入一个值,然后单击“重置”按钮。
    您实现的JavaScript代码应清除输入字段,并使Lightning Web Components引擎重新呈现该组件。

看那个!您创建了一个Lightning Web组件并将其添加到组织中的页面。现在尝试动手挑战中的另一只手。

适用于Visualforce开发人员的Lightning Web组件 – 了解编码概念如何应用于Lightning Web Components

学习目标 

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

  • 解释Visualforce和Lightning Web组件之间的体系结构差异。
  • 将Visualforce编码概念映射到Lightning Web Components。

在本单元中,您将学习Visualforce知识如何应用于Lightning Web Components体系结构和编码概念。

闪电Web组件架构

Visualforce是服务器端的模板语言。当客户端(浏览器)请求Visualforce页面时,服务器将呈现该页面,并将其以HTML格式发送给客户端。当用户界面需要更改时(例如,响应链接单击页面),客户端将向服务器请求一个新呈现的页面。服务器处理UI更改并将整个页面发送回客户端。

在Lightning Web组件中,客户端承担了大部分繁重的工作。要渲染Lightning Web组件,它将向服务器请求组件文件,处理这些文件以生成适当的标记,然后渲染组件UI。因为客户端可以处理逻辑,所以有时它可以执行UI更改,而无需完全回调服务器。它仅在需要时(例如,组件需要新数据时)才调用服务器。即使这样,客户端仍需要最少数量的数据。

传统的Visualforce请求 闪电Web组件请求
传统的Visualforce请求图 Lightning Web组件请求图
  1. 用户请求页面。
  2. 服务器执行页面的基础代码,并将结果HTML发送到浏览器。
  3. 浏览器显示页面。
  4. 当用户再次与页面交互时,该循环从第一步开始重复。
  1. 用户请求组件。
  2. 组件定义作为已编译的JavaScript文件返回到客户端。
  3. JavaScript应用程序生成UI。
  4. 当用户再次与页面交互时,JavaScript会修改客户端上的UI。

JavaScript在Lightning Web组件中起着重要作用。每个组件都有一个JavaScript文件,可在需要时重新生成UI。组件还可以在需要时使用JavaScript调用服务器以检索或修改Salesforce数据。我们将在本模块的后面部分介绍数据访问。

闪电Web组件编码概念

Visualforce和Lightning Web组件有很大的不同,但是有一些Visualforce概念有助于理解JavaScript和HTML在Lightning Web组件中的交互方式。

使用属性跟踪状态

在Visualforce中,属性在Apex控制器(Apex类文件)中定义,并在页面标记(Visualforce页面)中引用。在Lightning Web组件中,属性在组件的JavaScript文件中定义,并在页面标记(组件的HTML文件)中引用。属性跟踪Visualforce页面和Lightning Web组件的状态。这是语法的基本示例。

hello.html

<template>
    {greeting}
</template>

hello.js

import { LightningElement } from 'lwc';
export default class Hello extends LightningElement {
    greeting = 'Hello World';
}

greeting可以从JavaScript读取值,但也可以例如响应用户操作来写入。当标记中引用的属性的值更改时,Lightning Web Components引擎将重新渲染该组件。用户操作和所导致的重新呈现完全发生在客户端上。不需要服务器请求。

使用Getter和Setter跟踪状态

您在Visualforce中知道的getter和setter也存在于Lightning Web组件中。您可以在JavaScript文件中定义它们。读取属性时,getter将执行逻辑。设置器在写入属性时执行逻辑。这是扩展属性功能的便捷方法。 

要定义吸气剂,请创建一个包含逻辑并在其前面加上get关键字的方法。要定义设置器,请使用进行相同的操作set。定义设置器是可选的。

在此示例中,我们itemName使用getter和setter定义属性。每次itemName设置属性时,设置器都会将值转换为大写。uppercaseItemName更改值时,Lightning Web Components引擎将为计算新值itemName,然后重新呈现该组件。

todoItem.html

<template>
    {itemName}
</template>

todoItem.js

import { LightningElement } from 'lwc';
export default class TodoItem extends LightningElement {
    uppercaseItemName;
    get itemName() {
        return this.uppercaseItemName;
    }
    set itemName(value) {
        this.uppercaseItemName = value.toUpperCase();
    }
}

注意: Lightning Web组件的标记不支持计算值的表达式。而是考虑使用getter来计算JavaScript文件中的值。 

有条件的渲染

在Visualforce中,您可以使用该rendered属性有条件地呈现标记。要在Lightning Web组件中有条件地呈现标记,请使用if:true|false template指令HTML模板指令是特殊属性,可为模板添加动态行为。其他知名的前端框架(例如Angular和Vue)也使用模板指令。

在此示例中,该areDetailsVisible属性在控制器(未显示)中定义。我们使用areDetailsVisible属性的值来控制页面上某个部分的可见性,如下所示:

helloConditionalRendering.html

<template>
    <template if:true={areDetailsVisible}>
        These are the details!
    </template>
</template>

包含“这些就是细节!”的模板 仅在areDetailsVisible属性值为时显示true

渲染清单

在Visualforce中,您可以使用<apex:repeat>标签来遍历列表。在Lightning Web组件中,两个模板指令执行迭代: for:eachiterator:iteratorName。在此示例中,我们遍历contacts 控制器中的 属性。

compositionIteration.html

<template>
    <template for:each={contacts} for:item="contact">
        <p key={contact.Id}>
            {contact.Name}
        </p>
    </template>
</template>

代码重点:

  • 第2行:我们使用for:eachtemplate指令一次遍历所有联系人。然后,我们使用for:itemtemplate指令创建contact变量,该变量在每次迭代中一次包含一个单独的联系人。
  • 第3行:的所有直接子代for:item必须包含唯一的key模板指令。

调用JavaScript

在Visualforce页面中,当用户与页面交互时,页面可以执行JavaScript。例如,页面可能包含<apex:commandButton>,以响应按钮click事件执行JavaScript逻辑。您可以通过将JavaScript逻辑绑定到onclick按钮的属性来实现。在Lightning Web组件中调用JavaScript的方式相同。但是,必须在JavaScript文件的方法中定义逻辑,并且该方法必须绑定到事件,如下所示:

eventHandler.html

<template>
    <a onclick={handleButtonClick}></a>
</template>

eventHandler.js

import { LightningElement } from 'lwc';
export default class EventHandler extends LightningElement {
    handleButtonClick(event) {
        // Do whatever...
    }
}

代码重点:

eventHandler.html

  • 第2行:我们使用standardonclick 属性为标准click DOM事件指定处理程序。大括号{}表示事件处理程序是handleButtonClickJavaScript文件中的方法。

eventHandler.js

  • 第3行:我们定义了handleButtonClick处理程序,以接收event作为参数。

当您的处理程序需要访问事件所携带的状态或数据时,请使用事件对象。在这种情况下,您可以使用事件对象来查找将事件调度到的对象或单击事件的次数。我们将在本模块的后面部分详细讨论事件。

标准件

《 Visualforce开发人员指南》中的“ 标准组件参考”是标准Visualforce组件的库。同样,《 Lightning开发人员指南》 组件参考 是基础(标准)Lightning组件的库。

提示:要在参考中仅查看基础的Lightning Web组件,请展开“过滤器” ,然后 在“编程模型”下选择“ Lightning Web组件”。

使用基本组件快速轻松地开发应用程序。Salesforce维护基本组件,并创建您自动接收的新功能。

基础Lightning Web组件反映了Salesforce的外观。他们具有由Salesforce闪电设计系统(SLDS)提供的集成样式 。设计系统包括所有基本组件的蓝图以及可以在自己的组件中使用的CSS类。使用SLDS网站了解在构建自定义组件时适用的样式指导。

注意

一些基本组件已 开源。如果您需要的定制远远超出基本组件的允许范围,请克隆开源组件并将您自己的版本实现为定制组件。

要了解哪些基础Lightning Web组件与某些标准Visualforce组件相匹配,请参阅“资源”部分中的Visualforce标准组件和基础Lightning Web组件并排。

组成

在Visualforce中,您使用诸如<apex:component>和的标记<apex:include>来实现合成。当Visualforce页面包含Visualforce组件时,使用<apex:attribute>标签很容易将信息传递到该组件 。但是,将信息传递回页面涉及更复杂的模式,例如 Apex控制器的层次结构

Lightning Web组件中的组成相似。父级Lightning Web组件可以包括子级组件并与其通信。 

用户界面,其中“帐户搜索”组件包含“员工人数”输入字段组件。

简化了组成和通信机制,以便正确封装了每个组件的逻辑,并与其他组件进行松散耦合。

要将子组件包含在父组件中,请在kebab情况下使用子组件名称实例化该组件(是的,看起来像kebab),其后是其名称空间。自定义组件的默认名称空间是c。基本组件使用lightning名称空间。

在此示例中,contactTile定制组件和lightning-badge 基础组件作为compositionBasics组件的子代包括在内。

compositionBasics.html

<template>
    <c-contact-tile contact={contact}></c-contact-tile>
    <lightning-badge label="LWC rocks!"></lightning-badge>
<template>

要将信息从父组件传递到子组件,请使用 public属性 和 public方法@api在JavaScript文件中带有装饰器的属性或方法之前,会将其公开,以便其他组件可以访问它。要将信息从子级传递到其父级组件,请从标记中分派标准DOM事件或自定义事件(请参见 CustomEvent)。自定义事件不在此模块的范围内。父组件必须具有一个侦听事件的事件处理程序。让我们考虑一个示例,在该示例中,每当用户更改其值时,lightning-input 基本组件都会通知其父组件。

accountSearch.html

<template>
    <lightning-input
        type="number"
        label="Number of Employees"
        value={numberOfEmployees}
        onchange={handleChange}>
    </lightning-input>
</template>

accountSearch.js

import { LightningElement } from 'lwc';
export default class AccountSearch extends LightningElement {
    numberOfEmployees = null;
    handleChange(event) {
        this.numberOfEmployees = event.detail.value;
    }
}

代码重点:

accountSearch.html

  • 第2-7行:我们使用lightning-input 基本组件读取用户在输入字段中输入的值。lightning-input是的孩子c-account-search
  • 第5行:通过将父级属性绑定到子级属性,将numberOfEmployees属性值从c-account-search(父级组件)传递到lightning-input(子级组件)。我们可以执行此操作,因为基本组件具有名为的公共属性。numberOfEmployeesvaluelightning-inputvalue
  • 第6行:我们将一个名为处理程序handleChangechange事件绑定到该lightning-input组件触发的事件,将信息传递给父级。change标准的DOM事件。这是lightning-input组件将用户输入发送到的方式c-account-search

accountSearch.js

  • 第5行:我们从中读取用户输入event.detail.value

要了解有关这些通信模式的更多信息,请参阅Lightning Web Components基础 模块中的Lightning Web Components中的处理事件 。