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

适用于Aura开发人员的Lightning Web Components – 迁移JavaScript

学习目标

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

  • 将JavaScript从Aura组件迁移到Lightning Web组件。
  • 在Aura组件和Lightning Web组件之间共享代码。

使用JavaScript模块

JavaScript是Lightning Web组件的心脏。没有JavaScript,组件就是毫无生气的主要是HTML。当我们看到Aura组件中的属性如何映射到JavaScript属性时,我们可以窥见上一个单元中的Lightning Web组件中的JavaScript文件。现在,我们更深入地研究JavaScript文件。

将JavaScript代码从Aura组件中单独的客户端控制器,帮助程序和渲染器文件迁移到Lightning Web组件中的一个JavaScript文件。

Aura组件中的客户端控制器是对象文字表示形式的JavaScript对象,其中包含名称-值对的映射。好多话。让我们看一下PropertyPaginatorController.js文件中的示例:

({
	previousPage : function(component) {
        var pageChangeEvent = component.getEvent("pagePrevious");
        pageChangeEvent.fire();
	},
    
	nextPage : function(component) {
        var pageChangeEvent = component.getEvent("pageNext");
        pageChangeEvent.fire();
	}
})

Aura组件中JavaScript文件的格式是在将ES6标准(例如JavaScript类和模块)用于功能标准化之前设计的。

Lightning Web组件中的JavaScript文件是ES6模块,因此您使用的是标准JavaScript,而不是Aura组件中使用的专有格式。您编写的JavaScript看起来与您为其他任何现代JavaScript框架编写的JavaScript相似。

这是类似的JavaScript 分页器 闪电网络组件。

import { LightningElement, api } from 'lwc';
export default class Paginator extends LightningElement {
    /** The current page number. */
    @api pageNumber;
    /** The number of items on a page. */
    @api pageSize;
    /** The total number of items in the list. */
    @api totalItemCount;
    previousHandler() {
        this.dispatchEvent(new CustomEvent('previous'));
    }
    nextHandler() {
        this.dispatchEvent(new CustomEvent('next'));
    }
    get currentPageNumber() {
        return this.totalItemCount === 0 ? 0 : this.pageNumber;
    }
    get isFirstPage() {
        return this.pageNumber === 1;
    }
    get isLastPage() {
        return this.pageNumber >= this.totalPages;
    }
    get totalPages() {
        return Math.ceil(this.totalItemCount / this.pageSize);
    }
}

我们不会看每一行代码。主要的收获是Lightning Web组件使用标准的JavaScript模块。这是好事!

在Aura组件和Lightning Web组件之间共享代码

要在Lightning Web组件和Aura组件之间共享JavaScript代码,请将代码放在ES6模块中。两种编程模型都可以访问共享代码。即使您没有将所有代码都移至Lightning Web组件,您仍然可以访问在Aura组件的ES6模块中编写的新功能。

让我们看一个utils.js ES6模块的示例。

/* utils.js */
/**
 * Returns whether provided value is a function
 * @param {*} value - the value to be checked
 * @return {boolean} true if the value is a function, false otherwise
 */
export function isFunction(value) {
    return typeof value === 'function';
}

的 实用程序 模块导出一个 isFunction() 返回提供的参数是否为函数的函数。

这是一个 c-libcaller 使用以下内容的Lightning Web组件 实用程序 模块。

/* libcaller.js */
import { LightningElement } from 'lwc';
// import the library
import { isFunction } from 'c/utils';
export default class LibCaller extends LightningElement {
    result;
    
    checkType() {
        // Call the imported library function
        this.result = isFunction(
            function() {
                console.log('I am a function');
            }
        ); 
    }
}

的 c-libcaller 组件导入 实用程序 模块并调用 isFunction模块导出的函数。论点传递给isFunction 是一个函数,因此结果设置为 真正

现在,让我们看一个libcallerAura.cmp文件,该文件也使用实用程序 模块。

<aura:component>
    <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
    <p>Aura component calling the utils lib</p>
    <!-- add the lib component -->
    <c:utils aura:id="utils" />
</aura:component>

的 libcaller光环 光环组件包括对 c:工具ES6模块。我们添加了一个光环:id 这样我们就可以在JavaScript代码中获得对该模块的引用。

这是libcallerAuraController.js文件。

({
    doInit: function(cmp) {
        // Call the lib here
        var libCmp = cmp.find('utils');
        var result = libCmp.isFunction(
            function() {
                console.log(" I am a function");
            }
        );
        console.log("Is it a function?: " + result);
    }
})

组件的控制器使用 cmp.find(’utils’) 匹配 光环:id在标记中并获得对该模块的引用。的实用程序 ES6模块导出 isFunction(),由Aura组件调用。论点传递给isFunction() 是一个函数,因此结果设置为 真正

使用第三方JavaScript库

要在Aura组件或Lightning Web组件中使用第三方JavaScript库,必须将库作为静态资源上载。在两种编程模型中,使用静态资源的语法不同。

在Aura组件中,使用 <ltng:require> 在标记中添加标签以加载静态资源。

<ltng:require scripts="{!$Resource.resourceName}"
    afterScriptsLoaded="{!c.afterScriptsLoaded}" />

resourceName是静态资源的名称。的afterScripts已加载 加载脚本并呈现组件后,将调用客户端控制器中的action。

在Lightning Web组件中,使用JavaScript导入静态资源。

import resourceName from '@salesforce/resourceUrl/resourceName';

然后,您使用 loadScript 和 loadStyle 加载第三方库。

有关使用导入的库的详细信息,请参阅《 Lightning Web Components开发人员指南》中的“使用第三方JavaScript库

动态创建组件

在Aura组件中,您可以使用以下方式在JavaScript中动态创建组件: $ A.createComponent()。在Lightning Web组件中没有动态创建组件的等效项。

这个体系结构的决定是有意的。不在Lightning Web组件中复制此模式的主要原因是Aura组件中的模式导致错误和混乱的代码。

Lightning Web组件中更好的替代方法是为您的组件创建多个HTML模板。组件的render()该方法可以根据组件需求切换模板。这种模式更类似于其他JavaScript框架中使用的路由拆分。

重构的机会

迁移JavaScript代码时,请注意,它不是逐行转换。这是重新审视组件设计的好机会。

迁移到新的编程模型就像走一条新路径,将您带到相同的目的地。一路上的视觉和声音(以及您编写的代码)是不同的。

迁移组件也是使用Aura组件中可能未使用的ES6新功能(例如JavaScript模块)的绝佳机会。

在现代JavaScript开发的Trailhead模块为您提供了这些新功能很好的概述。

你可能也会喜欢...