【发布时间】:2017-06-02 08:54:35
【问题描述】:
我有一个 Material-UI 的<Table>,并且在每个<TableRow>(动态渲染)中为<TableBody>,我想为其中一列设置一个按钮(<FlatButton>)。一旦点击按钮,它会打开一个<Dialog>,在里面会有一个工作的<Tabs>。
那么,如何为特定列的每一行显示<FlatButton>,并在单击按钮时,在内部显示<Dialog> 以及工作中的<Tabs> 作为内容?并在外部单击时关闭<Dialog>?
到目前为止,我有以下问题,但遇到了以下问题:打开但速度很慢,在 <Dialog> 之外单击并没有关闭它,<Tabs> 可见但不起作用:
主表:
import React, { Component } from 'react'
import {
Subheader,
Table,
TableBody,
TableHeader,
TableHeaderColumn,
TableRow,
} from 'material-ui'
import RenderedTableRow from ‘./RenderedTableRow'
export default class MainTable extends Component {
constructor() {
super()
}
render() {
return (
<div>
<div>
<Subheader>Table</Subheader>
<Table
multiSelectable={true}
>
<TableHeader
displaySelectAll={true}
enableSelectAll={true}
>
<TableRow>
<TableHeaderColumn>
Col 1
</TableHeaderColumn>
<TableHeaderColumn>
Col 2
</TableHeaderColumn>
<TableHeaderColumn>
Col 3
</TableHeaderColumn>
</TableRow>
</TableHeader>
<TableBody
deselectOnClickaway={false}
stripedRows
>
<RenderedTableRow {...this.props}/>
</TableBody>
</Table>
</div>
</div>
)
}
}
渲染的表格行:
import React, { Component } from 'react'
import { Dialog, FlatButton, Tabs, Tab, TableRow, TableRowColumn } from 'material-ui'
import ContentAdd from 'material-ui/svg-icons/content/add';
export default class RenderedTableRow extends Component {
constructor(props) {
super(props)
this.state = {
open: false,
}
this._handleOpen = this._handleOpen.bind(this)
this._handleClose = this._handleClose.bind(this)
}
_handleOpen() {
this.setState({
open: true
})
}
_handleClose() {
this.setState({
open: false
})
}
render() {
const {
children,
...rest
} = this.props
const actions = [
<FlatButton
label="Cancel"
primary={true}
onClick={this._handleClose}
/>,
]
return (
<TableRow {...rest}>
{children[0]}
<TableRowColumn>Red</TableRowColumn>
<TableRowColumn>John, Joshua</TableRowColumn>
<TableRowColumn>
<FlatButton
icon={<ContentAdd/>}
onClick={this._handleOpen}
/>
</TableRowColumn>
<Dialog
actions={actions}
autoScrollBodyContent={true}
open={this.state.open}
onRequestClose={this._handleClose}
modal={false}
title='Test'
>
<Tabs>
<Tab label="Item One" >
<div>
<h2 >Tab One</h2>
<p>
This is an example tab.
</p>
</div>
</Tab>
<Tab label="Item Two" >
<div>
<h2>Tab Two</h2>
<p>
This is another example tab.
</p>
</div>
</Tab>
</Tabs>
</Dialog>
</TableRow>
)
}
}
提前感谢您,我们会接受/支持答案。
【问题讨论】:
-
对话框中会显示什么?对于每一行,您正在生成一个新对话框 - 是否有必要?正如你提到的,它会很慢。更好的方法是在主表格组件中有一个 Dialog 元素并传递必要的道具。
-
我会将对话框移到表格之外,将回调传递给表格行中的按钮,单击该按钮,打开对话框并将所选行传递给它
-
@szymonm 每行内容不同,但会在对话框中使用
<Tabs>显示,但目前选项卡不起作用。我对每一行都这样做的原因是因为每一行的每个对话框都以不同的方式表示。我怎样才能解决这个问题? -
@Mateusz 您介意显示作为澄清的答案吗?所以我也可以接受并投票。
-
@philippspo 更新了他的答案,这正是您所需要的 ;-)
标签: javascript html reactjs react-jsx material-ui