Если вы только что наткнулись на это руководство, обязательно сначала прочитайте часть 1 здесь: https://medium.com/@nerdic.coder/stencil-tutorial-tour-of-heroes-832a09ef3d82

Если вы еще не прошли часть 1, вы можете взять код отсюда, чтобы следовать второй части руководства: https://github.com/nerdic-coder/stencil-tour-of-heroes/tree /v1.1

Показать список героев

Теперь мы расширим приложение Tour of Heroes, чтобы отображать список героев и позволять пользователям выбирать героя и отображать сведения о герое.

Создавайте мнимых героев

Создайте файл с именем mock-heroes.ts в папке src/components/heroes/. Определите константу HEROES как массив из десяти героев и экспортируйте ее. Файл должен выглядеть так:

Отображение героев

Откройте файл компонента Heroes и импортируйте макет HEROES.

import { HEROES } from './mock-heroes';

Добавьте в класс свойство heroes, которое предоставляет этих героев для привязки.

private heroes: Hero[] = HEROES;

Список героев с оператором карты JSX

Откройте файл компонента Heroes и внесите следующие изменения в результат рендеринга:

  • Добавьте <h2> вверху,
  • Под ним добавьте неупорядоченный список HTML (<ul>)
  • Вставьте <li> в <ul>, который отображает свойства hero.
  • Добавьте несколько классов CSS для стилизации (в ближайшее время вы добавите стили CSS).
  • Добавьте оператор map вокруг элемента <li>.

Сделайте так, чтобы это выглядело так:

Может быть не так чисто, как Angulars *ngFor, но здесь очень ясно, что является частью цикла.

Стиль героев

Добавьте следующий код css в файл heroes.css:

Как и в Angular, таблицы стилей, указанные в метаданных @Component, привязаны к этому конкретному компоненту.

Мастер/деталь

Когда пользователь щелкает героя в основном списке, компонент должен отображать подробности выбранного героя внизу страницы.

В этом разделе вы будете прослушивать событие клика по элементу героя и обновлять детали героя.

Добавить привязку события клика

Добавьте привязку события клика к <li> следующим образом:

<li onClick={ () => this.onSelect(hero)}>

Здесь мы используем событие html onClick по умолчанию вместо Angular (щелчок), в остальном это почти то же самое.

Добавьте обработчик события клика

Переименуйте свойство hero компонента в selectedHero, но не назначайте его. При запуске приложения нет выбранного героя.

Добавьте следующий метод onSelect(), который присваивает выбранный герой из шаблона компоненту selectedHero.

@State() private selectedHero: Hero;
onSelect(hero: Hero): void {
  this.selectedHero = hero;
}

Обновите шаблон сведений

Шаблон по-прежнему ссылается на старое свойство hero компонента, которого больше не существует. Переименуйте hero в selectedHero.

Скройте пустые данные с помощью тернарного оператора JavaScript

После обновления браузера приложение не работает.

Откройте инструменты разработчика браузера и найдите в консоли сообщение об ошибке, подобное этому:

TypeError: Cannot read property ‘name’ of undefined

Что случилось?

Когда приложение запускается, selectedHero становится undefined предназначенным.

Выражения привязки в шаблоне, которые ссылаются на свойства selectedHero — такие выражения, как {this.selectedHero.name}должны завершаться ошибкой, поскольку герой не выбран.

Исправление

Компонент должен отображать сведения о выбранном герое, только если существует selectedHero.

В Stencil мы исправим это, обернув детали тернарным оператором следующим образом:

Таким образом, выражение начинается с проверки того, определено ли this.selectedHero, и если оно определено, оно отображает первые скобки после вопросительного знака, если оно не определено, оно показывает содержимое вторых скобок. Если вы не хотите ничего показывать, если selectedHero не определено, вы можете просто установить null во вторых скобках.

Стиль выбранного героя

Этот цвет выбранного героя является работой класса .selected CSS в стилях, которые вы добавили ранее. Вам просто нужно применить класс .selected к <li>, когда пользователь щелкнет по нему.

Добавьте этот условный атрибут класса в список героев <li>element:

<li class={(this.selectedHero === hero ? ‘selected’ : ‘’)} onClick={ () => this.onSelect(hero)}>

Основные/детальные компоненты

Теперь мы собираемся выделить часть сведений о герое в отдельный компонент Stencil, чтобы его можно было использовать, например, повторно.

Создайте новую папку hero-details внутри папки components и создайте в новой папке следующие файлы,

  • герой-details.css
  • герой-details.spec.ts
  • герой-details.tsx

Добавьте следующий код в hero-details.spec.ts :

Удалите детали компонента heroes и добавьте его к компоненту hero-details, чтобы он выглядел примерно так:

Добавьте свойство героя @Prop()

Реквизиты — это настраиваемые атрибуты/свойства, публично доступные для элемента, для которых разработчики могут указывать значения. Мы добавляем параметр mutable в Prop(), чтобы компонент знал, что ему разрешено обновлять переменную hero, например, когда мы редактируем имя в поле ввода.

Покажи HeroDetails Component

Теперь, чтобы иметь возможность снова отображать информацию о герое на странице героев, просто добавьте следующий html-тег в файл heroes.tsx под списком героев:

<app-hero-details hero={this.selectedHero}></app-hero-details>

Два компонента будут иметь отношение родитель/потомок. Родительский компонент Heroes будет управлять дочерним HeroDetails, отправляя ему нового героя для отображения всякий раз, когда пользователь выбирает героя из списка.

Вывод

На этом вторая часть этого урока завершена. В следующей части мы рассмотрим, как мы можем добавить поставщиков услуг для доставки данных героев компонентам.

Вы можете проверить результат этого руководства в теге репозитория Github v2.0: https://github.com/nerdic-coder/stencil-tour-of-heroes/tree/v2.0

Вы можете продолжить часть 3 здесь: https://medium.com/@nerdic.coder/stencil-tutorial-tour-of-heroes-part-3-9b0e128ee664

Надеюсь, вам понравилась эта часть, и дайте мне знать в комментариях, что вы думаете об этом руководстве.