小编典典

单击按钮将道具传递到另一个组件

reactjs

在我的nextJS应用中,我想将一个组件的道具传递给另一个既不是第一个组件的父项又不是子组件的道具,该怎么办?

OrderOrders页面的div内和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显示出来。我在这里看到了很多这样的``通过道具’‘问题,但没有一个出现这种情况。任何提示都值得赞赏。


阅读 179

收藏
2020-07-22

共1个答案

小编典典

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

在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中,使用prop访问接收到的处理函数,并通过传递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并显示它

OrderViewer.js

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

因此,在父组件中具有事件处理函数,并将其作为道具传递给子组件,然后将其分配给子组件按钮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}/> )}
2020-07-22