Как визуализировать конкретный объект в массиве при нажатии на компонент в React? - PullRequest
0 голосов
/ 18 февраля 2019

Ссылка Codesandbox.

Хорошо, поэтому высокоуровневая функциональность того, что я хочу, чтобы это приложение делало:

  1. При загрузке вы представленыс символами слева и справа на экране заставки.
  2. Когда пользователь нажимает, например, на первый символ (Облако), экран заставки заменяется статистикой Облака.Если пользователь нажимает на второй, третий и т. Д. Символ, то же самое.Экран вступления справа заменяется специфическими характеристиками этого персонажа.

Вот и все.По некоторым причинам я нахожу это действительно трудным делом.

Для разбивки / компоненты / папки (я перейду к важным):

  • / components /Контент / - это место, где живет информация персонажей, размещенная в штате.Каждый символ уникально идентифицируется с помощью идентификатора.
  • / компоненты / боковая панель / - это компонент боковой панели
  • / компоненты / обзор карты / - это отдельный компонент, повторяетсянесколько раз, в котором содержится «обзор» каждого символа (изображение, имя персонажа), который вы видите на самой боковой панели
  • / components / card-detail / - здесь он получает массив объектов из/ components / content /, фильтрует и отображает персонажа, которого вы сейчас видите, в DOM.Проблема в том, что в строке 13 этого компонента вы увидите, что я жестко запрограммирован в id #.Очевидно, я хочу, чтобы это изменилось на любой символ, на который пользователь нажимает, затем он загружает информацию об этом персонаже в DOM.Я просто не знаю, как это сделать.

Короче, что я пытаюсь сделать:

  • Когда нажимается символ слева, скрытьчто угодно справа и замените его информацией этого персонажа.

1 Ответ

0 голосов
/ 18 февраля 2019

Я сделал ваше намерение, работая здесь: https://codesandbox.io/s/l2lqm76z0q

Как указывал Крис, путь состоит в использовании состояния реакции.Поэтому я ввел состояние с выбранным по умолчанию элементом 4 и создал функцию handleClick, которая должна срабатывать при нажатии на один элемент на боковой панели.Оба они были созданы в App.js:

  state = {
    selected: 4
  };

  handleClick = id => {
    this.setState({ selected: id });
  };

Теперь я перенес функцию handleClick туда, где это необходимо, в данном случае в Sidebar.js:

<Sidebar onClick={this.handleClick} />

Итекущий выбранный элемент должен быть перенесен в ваш контент (опять же, где это необходимо).

<Content selected={this.state.selected} />

На боковой панели я снова отправляю функцию handleClick дочернему элементу CardOverview со связанным идентификатором (*):

<CardOverview
  image={cloudImage}
  name="Cloud Strife"
  onClick={() => this.props.onClick(1)}
/>

И, наконец, в CardOverview мы используем функцию, которую мы передали по дороге:

<section className="card-overview" onClick={this.props.onClick}>
...
</section>

(работает она или нет, мы видим в консоли- при нажатии на элемент он должен показывать состояние с текущим выбранным идентификатором элемента.)

Теперь в content.js мы используем значение selected и передаем его в CardDetailed, где мы его используем.следующим образом:

// Grab the 'characters' object from App.js, and assign it to 'this.props'
const { characters, selected } = this.props;

// Filter the chracters and return only whose 'id' belongs to that of the selected one
const filteredCharacters = characters
  .filter(character => character.id === selected)
  .map(character => (
     <div className="characters" key={character.id}>
       <p>Name: {character.Name}</p>
       <p>Job: {character.Job}</p>
       <p>Age: {character.Age}</p>
       <p>Weapon: {character.Weapon}</p>
       <p>Height: {character.Height}</p>
       <p>Birthdate: {character.Birthdate}</p>
       <p>Birthplace: {character.Birthplace}</p>
       <p>Bloodtype: {character.Bloodtype}</p>
       <p>Description: {character.Description}</p>
      </div>
));
...

Вот и все.

(*) Знайте, я не улучшил ваш код, я просто заставил его работать.Я вижу несколько вопросов, которые вы должны решить.Например, нет необходимости перечислять все символы на боковой панели вручную.Я бы предложил создать файл, содержащий ваш список символов, и использовать его на боковой панели и в контенте.Таким образом, вы сократите свой код и сохраните список символов (и всю относящуюся к нему информацию, такую ​​как идентификатор) в одном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...