单击按钮将props传递给另一个组件

IT技术 reactjs react-props
2021-05-18 19:04:21

在我的 nextJS 应用程序中,我想将一个组件的 props 传递给另一个既不是第一个组件的父组件也不是子组件的组件。我该怎么做?

页面中Order的 divOrdersOrderViewer另一个div 中有一个组件。我想要的是,当我单击“查看订单”按钮时,orderno该订单应该传递给OrderViewer组件。

订单.js

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

订单.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>

订单查看器.js

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

一旦orderno通过,Orderviewer显示它。我在这里看到了很多这种“通过props”的问题,但没有一个有这种情况。任何提示都非常感谢..

2个回答

在您的情况下,您需要处理回调。回调是react中的一个概念。

在 orders.js 中声明一个事件处理函数,它将 orderId 设置为在 orders.js 组件中单击按钮时的状态,并将该事件处理函数作为props传递给 Order 组件,并将 orderId 作为props传递给 OrderViewer 组件

订单.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 中使用 props 访问接收到的处理函数,并通过传递 orderId 将其分配给按钮 onClick

   <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>

现在,您可以在 OrderViewer 组件中使用 this.props.orderId 访问 orderId 并显示它

订单查看器.js

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

因此,在父组件中有一个事件处理函数,并将其作为props传递给子组件并分配给子组件按钮 onClick 和单击时更改父状态,这就是所谓的react中的回调。如果您理解我在回答中要解释的内容,您就可以轻松开始

编辑:

在 Order.js 组件中

改变

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

   <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}/> )}

所以,推理是:

  1. 你有一些父组件/屏幕。让我们称之为OrdersPage
  2. OrdersPage你有2个部分组成:OrderOrdersViewer
  3. 在父组件 ( OrdersPage) 的上下文中,您感兴趣的是知道点击了哪个订单并在其他子组件中显示
  4. 显然,你需要state在你的OrdersPage组件上
  5. 当您单击某个订单时,您会将其置于状态
  6. 你的其他组件将收到stateprops,并显示点击的组件