Как передавать состояния / реквизиты между компонентами - PullRequest
0 голосов
/ 12 марта 2019

У меня есть все компоненты, перечисленные в App.js.Я в некотором роде забочусь о том, как передавать значения из одного компонента в другой.

Вот как это должно работать:

Когда элемент выбран в первом компоненте (ItemList), детали загружаются во второй компонент (ItemDetails).Затем во втором компоненте, если я нажимаю «добавить», он добавляется в третий компонент (ItemSelection).

Как передать выбранный элемент в ItemList в ItemDetails, а затем передать его вItemSelection при нажатии кнопки?

App компонент:

// dummy selectedItems array
let selectedItems = [
  {
    'name': 'item 3',
    'type': ['car'],
    'details': [ 'Detail 1', 'Detail 2', 'Detail 3' ]
  },
  {
    'name': 'item 6',
    'type': ['bike'],
    'details': [ 'Detail 5', 'Detail 1']
  }
]

<Container>
  <ItemList/>
  <ItemDetails/>
  <ItemSelection selected={selectedItems}/>
</Container>

ItemList компонент:

const LIST_ITEMS = require('./LIST_ITEMS.json');

const myList = 
  LIST_ITEMS.data.Items.map((Item) => (
    <li key={Item.id} onClick={() => loadItem(Item.name)}>
      {Item.name.toUpperCase()}
    </li>
  ))
;

function loadItem(name){
  console.log(name);
}

class ItemList extends Component {

  render() {
    return (
      <div id="item-list-wrapper">
        <h3>Select an Item</h3>
        <ul id="item-list">{myList}</ul>
      </div>
    );
  }
}

ItemDetails компонент:

import React, { Component } from 'react';

class ItemDetails extends Component {
  render() {
    <div id="item-details">
      // Additional details about the item
      <button>Add to selection</button>
    </div>
  }
}

ItemSelection компонент:

import React, { Component } from 'react';

class ItemSelection extends Component {
  render() {
    <div id="item-selection">
      // List selected items
      <h3>Selected Items</h3>
      <div className="item-slot">
        {this.props.selected[0] ? (
            <div className="selected-details">
                <h4>{this.props.selected[0].name}</h4>
                <ul>
                  <li>{this.props.selected[0].details[0]}</li>
                  <li>{this.props.selected[0].details[1]}</li>
                  <li>{this.props.selected[0].details[2]}</li>
                </ul>
            </div>
        ) : (
          <p>empty</p>
        )}
    </div>
    </div>
  }
}

1 Ответ

2 голосов
/ 12 марта 2019

Во-первых, я бы порекомендовал статью "Поднятие состояния вверх", на которую ссылается @codekaizer в комментариях .

Основной принцип, который вы хотите взять из статьи, это

Должен быть один «источник правды» для любых данных, которые изменяются в приложении React.

В вашей ситуации этот единственный «источник истины» должен быть вашим App компонентом - тем, который общается с ItemList, ItemDetails и ItemSelection.

Поток связи между компонентами должен выглядеть следующим образом:

ItemList

  • Какие предметы я должен показывать? App скажет мне в опоре.
  • Что мне делать, если щелкнуть по одному из элементов моего списка? App скажет мне в опоре.

ItemDetails

  • Для какого элемента я должен отображать детали? App скажет мне в опоре
  • Что делать при нажатии кнопки «Выбрать этот элемент»? App скажет мне в опоре.

ItemSelection

  • Какие предметы я должен показывать? App скажет мне в опоре.

App

  • Какие пункты я должен сказать ItemList для отображения? Я передам то, что я получаю от LIST_ITEMS.json
  • Какой пункт мне нужно указать ItemDetails для отображения деталей? Я сохраню это в моем state как currentItem. Первоначально, детали не будут отображаться.
    • Если щелкнуть по одному из элементов в ItemList, мне нужно изменить currentItem моего состояния, чтобы он был выбран. (СОВЕТ: App нужна функция, и обратный вызов этой функции должен быть передан в ItemList)
  • Какие пункты я должен сказать ItemSelection для отображения? Я сохраню это в моем state как selectedItems. Изначально не будет выбрано ни одного элемента.
    • Если элемент, показанный в ItemDetails в данный момент, «выбран», то мне нужно добавить отображаемый в данный момент элемент в мой массив selectedItems. (СОВЕТ: App нужна функция, и обратный вызов этой функции должен быть передан ItemDetails)

Ключевые выносы

  • App должен поддерживать state с currentItem, который будет отображаться в деталях элемента, и selectedItems, который будет отображаться в списке выбора элемента.
  • App требуется несколько функций, управляющих состояниями currentItem и selectedItems.
  • App необходимо передать обратные вызовы функций дочерним элементам.
  • Дети, по сути, выступают в роли манекенов для показа: «Просто скажите мне, что мне нужно отобразить, и скажите мне, что я должен делать, если кто-то щелкнет здесь».

Я привел основной пример того, как все это выглядит в действии. Изучив его и применив к вашей ситуации, вы должны лучше понять, как заставить компоненты «общаться друг с другом».

Edit maintaining state between components

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