在我的nextJS应用中,我想将一个组件的道具传递给另一个既不是第一个组件的父项又不是子组件的道具,该怎么办?
Order在Orders页面的div内和OrderViewer另一个div内都有一个组件。我想要的是,当我单击“查看订单”按钮时,orderno该顺序应传递给OrderViewer组件。
Order
Orders
OrderViewer
orderno
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显示出来。我在这里看到了很多这样的``通过道具’‘问题,但没有一个出现这种情况。任何提示都值得赞赏。
Orderviewer
在您的情况下,您需要处理回调。回调是响应中的一个概念。
在orders.js中声明一个事件处理程序函数,该函数将orderId设置为单击orders.js组件中的按钮时的状态,并将该事件处理函数作为道具传递给Order组件,并将orderId作为道具传递给OrderViewer组件
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并显示它
<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}/> )}