Передача реквизита в другой компонент по нажатию кнопки - PullRequest
0 голосов
/ 19 января 2019

В моем приложении nextJS я хочу передать реквизиты одного компонента другому, который не является ни родителем, ни потомком первого компонента. Как я могу это сделать?

Существует компонент Order внутри элемента div на странице Orders и OrderViewer в другом элементе div. Я хочу, чтобы при нажатии кнопки «Просмотреть заказ» orderno этого порядка передавался OrderViewer компонент.

orders.js

<div>
   <div><Order 
     orderno='abc'
 title='abc'
 status='abc'
 entity='abc'
 po='abc'
 duedate='abc' /></div>
</div>
<div><OrderViewer /></div>

Order.js

<div>
<button>View Order</button>
    <p><span>{this.props.orderno}</span> 
    <span>{this.props.title}</span></p>
    <p>{this.props.entity} - {this.props.po}</p>
    <p>Due {this.props.duedate}</p>
</div>

OrderViewer.js

<div>//should display the orderno of clicked `order`</div>

Как только orderno пройдено, Orderviewer отображает его. Я видел здесь столько вопросов типа "прохождения подпорки", но ни у одного из них не было такого рода ситуации. Любой совет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

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

Объявите функцию обработчика событий в orders.js, которая устанавливает значение orderId в состояние при нажатии кнопки в компоненте orders.js и передает эту функцию обработчика события компоненту Order в качестве подпорок и передает orderId в качестве подпорки дляКомпонент OrderViewer

orders.js

  constructor(props){
      super(props);
      this.state = {
           orderId: null
      }
  }
  handleViewOrder = orderId = {
      this.setState({
          orderId
      });
  }
  render(){
    return(<div>
     <div><Order 
       orderno='abc'
       title='abc'
      status='abc'
      entity='abc'
      po='abc'
      duedate='abc' handleViewOrder={this.handleViewOrder} /></div>
  </div>
  <div><OrderViewer orderId={this.state.orderId} /></div>)}

Теперь в order.js получите доступ к функции получателя, используя реквизиты, и назначьте ее кнопке onClick, передавая orderId

   <div>
      <button onClick={() => this.props.handleViewOrder(this.props.orderno)}>View Order</button>
      <p><span>{this.props.orderno}</span> 
     <span>{this.props.title}</span></p>
     <p>{this.props.entity} - {this.props.po}</p>
     <p>Due {this.props.duedate}</p>
 </div>

Теперь вы можете получить доступ к orderId с помощью this.props.orderId в компоненте OrderViewer и отобразить его

OrderViewer.js

   <div>{this.props.orderId}</div>

Таким образом, имея функцию-обработчик события в родительском компоненте и передавая его как реквизитыдочернему компоненту и присваиванию дочернему компоненту кнопки onClick, а при щелчке изменение родительского состояния вызывает так называемые обратные вызовы в реакцииЕсли вы понимаете, что я пытаюсь объяснить в моем ответе, вы можете легко приступить к работе

Редактировать:

В компоненте Order.js

Изменить

  <button onClick={() => this.handleViewOrder(this.props.orderno)}>View Order</button>

To

   <button onClick={() => this.props.handleViewOrder(this.props.orderno)}>View Order</button>

Вы также вызываете компонент Order в цикле, но не устанавливаете уникальный ключ для компонента Order, поэтому

Изменить

            { Orders.map((order) => <Order 
                 orderno={order.orderno}
            title={order.title}
                 status={order.status}
                entity={order.entity}
                po={order.po}
            duedate={order.duedate}
            handleViewOrder={this.handleViewOrder}/> )}

На

            { Orders.map((order) => <Order 
            orderno={order.orderno}
            title={order.title}
            status={order.status}
                entity={order.entity}
            po={order.po}
                            key={order.orderno}
            duedate={order.duedate}
            handleViewOrder={this.handleViewOrder}/> )}
0 голосов
/ 19 января 2019

Итак, рассуждение таково:

  1. у вас есть родительский компонент / экран. Давайте назовем это OrdersPage
  2. в пределах OrdersPage у вас есть 2 компонента: Order и OrdersViewer
  3. В контексте родительских компонентов (OrdersPage) вы заинтересованы в том, чтобы узнать, в каком порядке была нажата кнопка, и показать это в другом дочернем элементе
  4. очевидно, вам нужно state для вашего OrdersPage компонента
  5. когда вы нажимаете на какой-то заказ, вы переводите его в состояние
  6. ваш другой компонент получит state как props и покажет выбранный компонент
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...