我正在开发一个 React 应用程序,这是我的第一个应用程序,我正在努力解决如何实现用户交互式弹出框。我有一个业务需求,需要有一个带有是/否按钮的弹出框。此弹出框由位于视图中表格中的一行中的按钮(“pobtn”)触发:
+- View ---------------------+ +- View ---------------------+
| +- Table ----------------+ | click | +- Table ----------------+ |
| | +- Row --------------+ | | --> | | +- Row --------------+ | |
| | | ... | | | pobtn | | | ... | | |
| | +--------------------+ | | | | +--------------------+ | |
| | +- Row --------------+ | | ,--------. +- Row --------------+ | |
| | | ... [pobtn] | | | | Yes/No |>| ... [pobtn] | | |
| | +--------------------+ | | `--------' +--------------------+ | |
| | +- Row --------------+ | | | | +- Row --------------+ | |
| | | ... | | | | | | ... | | |
| | +--------------------+ | | | | +--------------------+ | |
| | ... | | | | ... | |
| +------------------------+ | | +------------------------+ |
+----------------------------+ +----------------------------+
View、Table 和 Row 都是组件。表格数据在 View 中获取并通过 props 推送到 Table,然后流入 Row,我理解这是“正确的方法”,并且是有道理的。那里没有多少地方州。
问题来自弹出框。我猜,这样做的“正确方法”似乎包括每个按钮旁边的 Popover 组件,并将道具向下推以隐藏/可见。这似乎不是很好,但在我看来更接近正确的方法。
但是,react-bootstrap 弹出窗口(我使用它是因为时间)似乎并没有以这种方式工作:
var content = <MyRowPopoverContent/>;
<OverlayTrigger trigger='click' placement='left' overlay={<Popover>{content}</Popover>
<button className="btn btn-primary small"><i className="fa fa-trash-o"></i> Delete</button>
</OverlayTrigger>
当您单击触发按钮时,它会创建一个附加到主体的 DIV,并将其自身定位在触发元素旁边,类似于它正常工作的方式(无反应)。看起来我可以将 DIV 附加到另一个容器,但这并没有很好地记录。无论如何,覆盖内容(即 MyRowPopoverContent)类似于:
this.handleNoClick: function(){
// Re-click the button to close; gross.
$('[data-row-id="'+this.props.row.key+'"]').find('.fa-trash-o').parents('button').first().click();
},
this.handleYesClick: function(){
// Do stuff...update store which would re-render the view.
// Re-click the button to close; gross.
$('[data-row-id="'+this.props.row.key+'"]').find('.fa-trash-o').parents('button').first().click();
},
this.render: function(){
<div>
<div>Are you sure?</div>
<input placeholder="Reason"/>
<button onClick={this.handleYesClick}>Yes</button> <button onClick={this.handleNoClick}>No</button>
</div>
}
我开始实现该handleYesClick
功能,尝试进行错误处理、异步事件等,这一切看起来都很粗略,或者至少很脆弱。我想问题是:我需要一个交互式弹出框,我该怎么做?似乎弹出窗口将是按钮或行的本地状态的一部分,或者可能像大多数事情似乎做的那样爬到顶部。
由于 react-bootstrap 已经提供了一个,使用它会很好,但我不确定如何将它与其他所有东西“挂钩”。
更新:如果它是一个简单的静态弹出框,那就太棒了;通过道具显示/隐藏它并点击pobtn
是非常简单的。我纠结的部分是弹出框内的交互式内容——它做一些事情(比如更新商店的事件)、显示一个微调器、确定该操作是否有效、显示错误消息或消失。即使单击“否”按钮并使弹出框消失也不清楚(我目前用 jQuery 和.click()
按钮再次找到它。)通过父级的道具来做这一切似乎很可怕......