使用Lightning Web Components开源构建您的第一个应用程序 – 创建会话详细信息Web组件

创建会话详细信息Web组件

在此步骤中,您将创建一个新的Web组件,该组件显示特定会议会话的详细信息。您还实现了一个简单的导航系统,该系统允许用户在会话列表和会话详细信息之间来回导航。

创建sessionDetails Web组件

首先,让我们创建Web组件的JavaScript文件。

  1. 在现有my文件夹下,创建一个名为的新文件夹sessionDetails
  2. sessionDetails文件夹中,创建一个名为的新文件sessionDetails.js
  3. 实现sessionDetails类,如下所示:
    import { LightningElement, api } from 'lwc';
    import { getSession } from 'data/sessionService';
    export default class SessionDetails extends LightningElement {
      session;
      @api
      set sessionId(id) {
        this._sessionId = id;
        this.session = getSession(id);
      }
      get sessionId() {
        return this._sessionId;
      }
    }

    我们使用@api装饰器将sessionIdsetter方法定义为public。这样,您就可以提供标签sessionId 的属性my-session-details。带注释的属性@api是反应性的:当其值更改时,组件将自动重新呈现。

  4. 保存sessionDetails.js文件。

现在,让我们在Web组件模板中创建用户界面。

  1. sessionDetails文件夹中,创建一个名为的新文件sessionDetails.html
  2. 实施模板,如下所示:
    <template>
      <template if:true={session}>
        <h2>{session.name}</h2>
        <p class="icon time">{session.dateTime}</p>
        <p class="icon room">{session.room}</p>
        <h3>Abstract</h3>
        <div class="abstract">{session.description}</div>
      </template>
    </template>
    
  3. 保存sessionDetails.html文件。

接下来,让我们创建Web组件的CSS文件,以确保一切看起来都不错。

  1. sessionDetails文件夹中,创建一个名为的新文件sessionDetails.css
  2. 定义以下样式:
    :host {
      width: 100%;
      margin: 2rem;
      color: #080707;
    }
    p {
      margin: 0;
    }
    .icon {
      color: #039be5;
      background-repeat: no-repeat;
      background-size: contain;
      padding-left: 24px;
    }
    .icon.time {
      background-image: url(https://developer.salesforce.com/files/js-dev/icons/clock.svg);
      margin-top: .6rem;
    }
    .icon.room {
      background-image: url(https://developer.salesforce.com/files/js-dev/icons/location.svg);
      margin-top: .4rem;
    }
    h2 {
      font-weight: 600;
      font-size: 1.4rem;
    }
    h2 a, h2 a:visited {
      color: #039be5;
      text-decoration: none;
    }
    h2 a:hover {
      color: #017bb7;
    }
    h3 {
      font-weight: bold;
      font-size: 1.1rem;
      margin: 1.5rem 0 0.5rem 0;
    }
    .list-wrapper {
      display: flex;
      flex-direction: column;
    }
    .speaker-list {
      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
      margin: 0 -0.5rem;
    }
  3. 保存sessionDetails.css文件。

而已!您创建了一个显示会议会话详细信息的Web组件。

将组件添加到应用程序

要查看它的实际效果,您需要将其添加到应用程序中。

  1. 打开app.html该文件app的文件夹。
  2. 在标签之后添加以下<my-session-list></my-session-list>标签:
    <my-session-details session-id={sessionId}></my-session-details>
  3. 保存app.html文件。
  4. 打开app.js文件。
  5. 在App类定义中定义一个属性:
    import { LightningElement } from 'lwc';
    export default class App extends LightningElement {
      sessionId;
    }
  6. 保存app.js文件。

返回浏览器,请注意该sessionDetails组件未出现。这是因为sessionId您刚刚定义的 属性app.js尚未指向实际的sessionId。换句话说,应用程序不知道要显示哪个会话。这就提出了一个很好的问题:sessionDetails 组件应实际显示哪个会话?答案是:用户在sessionList组件中单击的会话!sessionList组件如何通知应用程序单击了特定会话?通过调度自定义DOM事件。

一起布线

现在,您已经创建了所有不同的组件,您需要在应用程序的不同方面显示它们,并确保不同的组件相互反应。首先,让我们修改sessionList组件,使其在单击会话时触发一个事件。

  1. 打开sessionList.html文件。
  2. 将以下属性添加<a>标签:data-index={index} onclick={handleSessionClick}它看起来像 
    <a key={session.id} class="session" data-index={index} onclick={handleSessionClick}>
  3. 保存sessionList.html文件。
  4. 打开sessionList.js文件。
  5. handleSessionClick函数SessionList之后,将事件处理程序添加到类中handleSearchKeyInput
    handleSessionClick(event) {
      const index = event.currentTarget.dataset.index;
      const navigateEvent = new CustomEvent('navigate', {
        detail: {
          sessionId: this.sessions[index].id
        }
      });
      this.dispatchEvent(navigateEvent);
    }
  6. 保存sessionList.js文件。

接下来,让我们在appWeb组件中监听该事件。

  1. 打开app.html文件。
  2. onnavigatemy-session-list标签上添加一个属性:
    <my-session-list onnavigate={handleNavigate}></my-session-list>
  3. 保存app.html文件。
  4. 打开app.js文件。
  5. handleNavigate之后添加事件处理程序sessionId;
    handleNavigate(event) {
      this.sessionId = event.detail.sessionId;
    }
  6. 保存app.js文件。

返回浏览器,然后单击其中一个会话。现在,该会话的详细信息应出现在列表之后。 

在会话列表下呈现对话信息的应用程序。

一切正常,但是滚动到列表底部以查看详细信息并不是很好的用户体验。您可以在列表的右侧显示详细信息,但这可能不适用于移动设备。在下一部分中,您将实现一个基本的导航系统,该系统允许用户导航到不同的视图。

添加导航

导航是单页应用程序的重要组成部分。在此项目中,您将为应用程序使用两个状态(“列表”和“详细信息”)实现最小导航系统,并使用自定义事件在这些状态之间进行导航。

  1. 打开app.js文件。
  2. 声明一个state产权后sessionId;
    state = 'list';
  3. 修改handleNavigate事件处理程序更改应用程序的基础上,自定义导航事件值的状态。
    handleNavigate(event) {
      this.state = event.detail.state;
      this.sessionId = event.detail.sessionId;
    }
  4. 添加两个可以在组件模板中使用的getter函数,以检查应用程序的当前状态。
    get isStateList() {
      return this.state === 'list';
    }
    get isStateDetails() {
      return this.state === 'details';
    }
  5. 保存app.js文件。
  6. 打开app.html文件。
  7. <my-session-list>在一个if:true指令时,应用程序的状态是“清单”,只显示它:
    <template if:true={isStateList}>
      <my-session-list onnavigate={handleNavigate}>
      </my-session-list>
    </template>
    
  8. <my-session-details>在一个if:true指令时,应用程序的状态是“细节”,只显示它:
    <template if:true={isStateDetails}>
      <my-session-details session-id={sessionId}>
      </my-session-details>
    </template>
  9. onnavigatemy-session-details标签上添加一个属性:
    <my-session-details onnavigate={handleNavigate} session-id={sessionId}>
    </my-session-details>
  10. 保存app.html文件。

接下来,让我们确保选择会话时更改状态。

  1. 打开sessionList.js文件。
  2. handleSessionClick事件处理函数替换为:
    handleSessionClick(event) {
      const index = event.currentTarget.dataset.index;
      const navigateEvent = new CustomEvent('navigate', {
        detail: {
          state: 'details',
          sessionId: this.sessions[index].id
        }
      });
      this.dispatchEvent(navigateEvent);
    }
  3. 保存sessionList.js文件。

接下来,让我们确保用户可以返回到会话列表。

    1. 打开sessionDetails.html文件。
    2. 将会话标题替换<h2>{session.name}</h2>
<h2><a href="#" onclick={handleSessionsClick}>Sessions</a> &gt; {session.name}</h2>
  1. 保存sessionDetails.html文件。
  2. 打开sessionDetails.js文件。
  3. handleSessionsClick事件处理程序添加sessionDetails类中,紧接在sessionIdgetter函数之后:
    handleSessionsClick() {
      const navigateEvent = new CustomEvent('navigate', {
        detail: {
          state: 'list'
        }
      });
      this.dispatchEvent(navigateEvent);
    }
    
  4. 保存sessionDetails.js文件。

返回浏览器,然后单击其中一个会话。现在,会话列表显示单击的会话的详细信息视图。如果单击会话标题旁边的“会话”链接,则返回到会话列表。

Web组件介绍的会话详细信息视图

很好!会议与会者单击特定的会议时,可以查看会议列表并导航到详细信息视图。为了将您学到的东西付诸实践,创建一个最终的Web组件,该组件在会话详细信息视图上显示扬声器卡。

添加扬声器卡

首先,让我们创建Web组件的JavaScript文件。

  1. 在现有my文件夹下,创建一个名为的新文件夹speakerCard
  2. speakerCard文件夹中,创建一个名为的新文件speakerCard.js
  3. 实现SpeakerCard该类,如下所示:
    import { LightningElement, api } from 'lwc';
      export default class SpeakerCard extends LightningElement {
        @api speaker;
    }
  4. 保存speakerCard.js文件。

接下来,让我们创建Web组件的HTML模板。

  1. speakerCard文件夹中,创建一个名为的文件speakerCard.html
  2. 实施模板,如下所示:
    <template>
      <div class="card">
        <div class="header">
          <img src={speaker.pictureUrl} alt="Speaker picture">
          <div>
            <p class="title">{speaker.name}</p>
            <p class="icon email">{speaker.email}</p>
          </div>
        </div>
        {speaker.bio}
      </div>
    </template>
  3. 保存speakerCard.html文件。

接下来,让我们添加一些样式以确保一切都看起来不错。

  1. speakerCard文件夹中,创建一个名为的文件speakerCard.css
  2. 添加以下样式:
    :host {
      margin: 0.5rem;
      flex: 1;
      color: #080707;
    }
    .card {
      border: 1px solid #dddbda;
      border-radius: 0.25rem;
      padding: 1rem;
    }
    .card .header {
      display: flex;
      align-items: center;
      margin-bottom: 1rem;
    }
    .card img {
      border-radius: 50%;
      height: 5rem;
      margin-right: 1rem;
    }
    .card .title {
      font-weight: 600;
    }
    .card .icon {
      color: #039be5;
      background-repeat: no-repeat;
      background-size: contain;
      padding-left: 24px;
    }
    .card .icon.email {
      background-image: url(https://developer.salesforce.com/files/js-dev/icons/email.svg);
      margin-top: 0.4rem;
    }
    p {
      margin: 0;
    }
  3. 保存speakerCard.css文件。
将发言人添加到会话详细信息

最后,让我们将扬声器卡添加到会话详细信息视图中。

  1. 打开sessionDetails.html文件。
  2. abstractdiv之后添加以下标记:
    <h3>Speakers</h3>
      <div class="speaker-list">
        <template if:true={session.speakers}>
          <template for:each={session.speakers} for:item="speaker">
            <my-speaker-card key={speaker.id} speaker={speaker}>
            </my-speaker-card>
        </template>
      </template>
    </div>
  3. 保存sessionDetails.html文件。

返回浏览器窗口,然后单击列表中的会话。会话详细信息视图现在应该看起来像这样,包括扬声器卡。

 Web组件模式和最佳实践的会话详细信息视图,每个会话发言人都需要额外的卡片

恭喜,您已经成功创建了第一个Lightning Web Component开源应用程序!请查看本系列的下一个项目,在该项目中您可以修改应用程序以使用REST服务从Salesforce获取会议数据。您无需了解Salesforce即可执行下一个项目。我们将指导您完成所有步骤。

使用Lightning Web Components开源构建您的第一个应用程序 – 创建数据服务模块

创建数据服务模块

在JavaScript或Web组件应用程序中,有许多访问数据的策略。在此步骤中,您将创建一个简单的数据服务模块,可以将其导入任何Web组件中以检索会议会话列表。该模块使我们可以通过REST服务访问云中托管的示例数据。您可以使用 此链接在浏览器中调用端点来浏览数据。由于数据以JSON格式存储,因此我们的浏览器无法以漂亮的方式呈现信息。

JSON格式的会话数据视图

注意

我们将在本系列的其他项目中探索其他数据访问策略。例如,在本系列的下一个项目中,我们使用REST服务从Salesforce获取会议列表。

要使此数据可用,请创建一个sessionService模块,该模块封装数据访问逻辑以检索会议会话列表。

  1. src/client/modules文件夹中,创建一个名为的新文件夹data
  2. data文件夹中,创建一个名为的文件夹sessionService
  3. sessionService文件夹中,创建一个名为的文件sessionService.js
  4. 在中sessionService.js,如下执行数据服务。
    const URL = 'https://conference-lwc-app.herokuapp.com/api/sessions';
    let sessions = [];
    export const getSessions = () => fetch(URL)
      .then(response => {
        if (!response.ok) {
          throw new Error('No response from server');
        }
        return response.json();
      })
      .then(result => {
        sessions = result.data;
        return sessions;
      });
    export const getSession = sessionId => {
      return sessions.find(session => {
        return session.id === sessionId;
      });
    }

    该 getSession() 函数允许您从缓存的sessions 阵列中检索特定的会话 。创建会话详细信息Web组件时,可以在此项目的后面使用此功能。

  5. 保存sessionService.js文件。

而已!您创建了一个数据服务模块,可用于检索会议应用程序中任何位置的数据。在下一步中,您将创建一个Web组件,该组件使用 sessionService数据服务来显示会议列表。

使用Lightning Web Components开源构建您的第一个应用程序 – 创建数据服务模块

创建数据服务模块

在JavaScript或Web组件应用程序中,有许多访问数据的策略。在此步骤中,您将创建一个简单的数据服务模块,可以将其导入任何Web组件中以检索会议会话列表。该模块使我们可以通过REST服务访问云中托管的示例数据。您可以使用 此链接在浏览器中调用端点来浏览数据。由于数据以JSON格式存储,因此我们的浏览器无法以漂亮的方式呈现信息。

JSON格式的会话数据视图

注意

我们将在本系列的其他项目中探索其他数据访问策略。例如,在本系列的下一个项目中,我们使用REST服务从Salesforce获取会议列表。

要使此数据可用,请创建一个sessionService模块,该模块封装数据访问逻辑以检索会议会话列表。

  1. src/client/modules文件夹中,创建一个名为的新文件夹data
  2. data文件夹中,创建一个名为的文件夹sessionService
  3. sessionService文件夹中,创建一个名为的文件sessionService.js
  4. 在中sessionService.js,如下执行数据服务。
    const URL = 'https://conference-lwc-app.herokuapp.com/api/sessions';
    let sessions = [];
    export const getSessions = () => fetch(URL)
      .then(response => {
        if (!response.ok) {
          throw new Error('No response from server');
        }
        return response.json();
      })
      .then(result => {
        sessions = result.data;
        return sessions;
      });
    export const getSession = sessionId => {
      return sessions.find(session => {
        return session.id === sessionId;
      });
    }

    该 getSession() 函数允许您从缓存的sessions 阵列中检索特定的会话 。创建会话详细信息Web组件时,可以在此项目的后面使用此功能。

  5. 保存sessionService.js文件。

而已!您创建了一个数据服务模块,可用于检索会议应用程序中任何位置的数据。在下一步中,您将创建一个Web组件,该组件使用 sessionService数据服务来显示会议列表。

使用Lightning Web Components开源构建您的第一个应用程序 – 修改默认应用

修改默认应用

更新index.html文件

在上一步中,您使用该create-lwc-app 工具创建了样板应用程序 。在此步骤中,您将修改默认应用程序并将其变成会议管理应用程序。

您可以使用自己喜欢的代码编辑器完成此项目。我们建议使用 Visual Studio Code,但这不是必需的。我们以VS Code为将来的指示。

    1. 打开Visual Studio代码
    2. 在菜单中选择文件>打开
    3. 选择您的conference-app文件夹,然后单击“打开”

Visual Studio Code中的会议应用程序视图

  1. 在VS Code文件资源管理器中,展开src文件夹,然后展开client文件夹。
  2. 打开index.html文件。
  3. 现有内容替换为以下HTML代码:
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <title>Lightning Conference</title>
        <style>
          body {
            font-family: Helvetica, Arial, sans-serif;
            margin: 0;
            padding: 0;
          }
        </style>
        <meta name="viewport" content="width=device-width,initial-scale=1" />
        <link rel="shortcut icon" href="/resources/favicon.ico" />
      </head>
      <body>
        <div id="main"></div>
      </body>
    </html>
  4. 保存index.html文件。

在此新版本中,您更改了页面标题和嵌入式CSS以支持我们应用程序的要求。在div与IDmain为您的应用程序使用了JavaScript中的入口点index.js文件使用追加了第一个Web组件createElement来创建组件。

import { createElement } from 'lwc';
import MyApp from 'my/app';
const app = createElement('my-app', { is: MyApp });
document.querySelector('#main').appendChild(app);

<my-app>是表示我们第一个Web组件的自定义元素:my是映射到文件系统上我的文件夹的名称空间,并且app是Web组件名称。所述appWeb组件被用作应用程序的容器。

修改应用程序Web组件

让我们修改 app Web组件以显示会议管理应用程序的标题。该组件可协调应用程序中的所有事件和数据。

  1. 在VS代码文件浏览器中,展开app文件夹下src/client/modules/my。该文件夹包含组成Lightning Web组件的三个文件:一个html文件(模板),一个js文件(类定义)和一个css文件(样式)。
  2. 打开app.html文件。
  3. 以下标记替换现有内容:
    <template>
      <header>
        <img src="resources/lwc.png" alt="App logo">
        <h2>Lightning Conference</h2>
      </header>
      <main class="content">
        <!-- Add components here -->
      </main>
    </template>

    该 <template> 标签是定制元素说明书的一部分,包括用于网络组件的HTML标记。

  4. 保存app.html文件。
设置Web组件的样式
  1. 闪电Web组件的样式看起来最好。打开文件app.css
  2. 以下样式替换现有内容:
    .content {
      padding: 0 3rem;
    }
    header {
      padding: 1rem;
      display: flex;
      color: #ffffff;
      background: #0288d1;
      box-shadow: 0 4px 3px rgba(1, 87, 155, 0.5);
      align-items: center;
    }
    header img {
      height: 3rem;
      margin-right: 0.3rem;
    }
    header h2 {
      font-size: 1.75rem;
      font-weight: 300;
    }
  3. 保存app.css文件。

返回浏览器窗口以查看更改。该应用程序应如下所示:

在本地运行的Lightning Conference应用程序的视图。

注意

如果您看不到更改,则可能已watch在命令行上终止了该过程。在这种情况下,请返回命令行,确保您位于正确的文件夹(conference-app)中,然后键入:npm run watch。打开浏览器窗口,然后导航到 Mac的http:// localhost:3001或 Windows的http://0.0.0.0:3001来访问您的应用程序。

做得好!您修改了默认的“应用程序” Web组件,并准备好主持会议应用程序。在下一步中,您将创建用于检索会议会话的数据服务。

使用Lightning Web Components开源构建您的第一个应用程序 创建应用程序

学习目标

在此项目中,您将:

  • 安装使用Lightning Web Components Open Source所需的工具。
  • 使用Lightning Web Components Open Source创建数据服务模块。
  • 使用Web组件和最新的Web标准创建示例会议管理应用程序。
介绍

Web标准的创新水平达到了前所未有的高度,令人兴奋。现在,需要框架的许多功能已成为标准配置。您不再需要专有的组件模型,专有的语言扩展,专有的模块等等。核心堆栈的标准化为新型框架打开了大门:这些框架的主要任务不再是填补核心堆栈中的空白,而是在标准堆栈的顶部提供薄薄的专业服务。现在适合大型应用程序开发。好处是巨大的。

  • 通用且可互操作的组件模型
  • 通用编程模型
  • 可转让的技能使寻找和发展开发人员更加容易
  • 更好的性能,因为核心功能是在Web引擎中本地实现的,而不是在JavaScript中编写的框架抽象中实现的

Lightning Web Components Open Source是基于Web标准构建的新型轻量级框架的实现。它使用自定义元素,模板,影子DOM,装饰器,模块和ECMAScript 6及更高版本中可用的其他新语言构造。

在此项目中,您将使用Lightning Web Components Open Source创建示例会议管理应用程序。此项目是向您介绍Lightning Web Components的三个项目系列中的第一个。

你建造什么

要创建会议管理应用程序,您需要构建并组装多个Web组件:应用程序容器,会议会话列表(以下屏幕截图),特定会话的详细信息等等。

让我们看看您将要创建什么:https : //conference-lwc-app.herokuapp.com。

最终的闪电会议应用程序的屏幕截图

既然您知道了Lightning Web Components框架是什么以及正在构建什么,那么该开始了!

创建闪电Web组件应用程序

使用Lightning Web Components Open Source创建应用程序的最快方法是使用 create-lwc-app CLI(命令行界面)。

重要笔记

  • 确保在系统上安装了LTS版本的Node.js。create-lwc-app依赖npx于npm 5.2中引入的Node包运行器()。如果您的系统上未安装Node.js,则可以在此处https://nodejs.org/安装 。
  • 确保已git安装。您可以在这里https://git-scm.com/downloads安装 。
  • create-lwc-app创建Lightning Web Components开源应用程序不是必需的。Lightning Web Components Open Source作为 npm模块提供https://github.com/salesforce/lwc/tree/master/packages/%40lwc,您可以使用Webpack或Rollup创建自己的构建过程。

要创建名为的应用程序conference-app,请打开命令行,然后键入:

npx create-lwc-app conference-app --yes -o express

如果使用Windows操作系统,并且要使用非基于Chromium的Edge浏览器,请键入以下命令:

npx create-lwc-app conference-app --yes -o edge,express

此命令创建默认的项目结构和一个简单的应用程序以帮助您入门。作为该过程的一部分,CLI将安装框架,工具依赖项并创建应用程序。

应用程序创建过程完成后,您应该看到以下消息:

🎉在/ YOUR / FILE / STRUCTURE / conference-app中创建了会议应用程序。检出package.json的scripts部分开始。

运行新应用

在命令行上,键入:

  1. cd conference-app
  2. npm run watch

    注意

    注意

    watch过程将自动跟踪您的代码更改,在浏览器中重新编译和刷新应用程序。您无需手动编译更改并在浏览器中重新加载应用程序。

  3. 在浏览器窗口中,对于Mac ,导航至http:// localhost:3001; 对于Windows ,导航至 http://0.0.0.0:3001,以访问默认应用程序。

本地托管网页的图像,显​​示有闪电和文字,显示为:编辑src / modules / client / my / app / app.html并保存以供实时重新加载。

恭喜你!您已经创建了第一个Lightning Web Component开源应用程序。在下一步中,您将修改默认应用程序。

我们不会检查您的任何本地开发。单击 验证步骤转到项目的下一步。