У меня есть материал-UI's <Table>
, и в каждом <TableRow>
(который динамически отображается) для <TableBody>
, я хотел бы иметь кнопку (<FlatButton>
) для одного из столбцов. И как только кнопка нажата, она откроет <Dialog>
, и внутри она хотела бы иметь рабочий <Tabs>
.ReactJS + Material-UI: Как использовать Flat-UI FlatButton и Dialog в каждом TableRow?
Так как я могу отобразить <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>
)
}
}
Спасибо заранее и будет принимать/upvote ответ.
Что будет отображаться в диалоговом окне? Для каждой строки вы создаете новый диалог - это необходимо? Как вы упомянули, это будет очень медленно. Лучше всего использовать один элемент диалога в компоненте главной таблицы и передать необходимые реквизиты. – szymonm
Я бы переместил диалог за пределы таблицы, передал обратный вызов кнопке в строке таблицы, которая нажимает, открывает диалог и передает выделенную ему строку – Mateusz
@szymonm Разный контент для каждой строки, но он будет отображаться используя '' внутри диалогового окна, но в настоящее время вкладки не работают. Причина, почему я сделал это для каждой строки, состоит в том, что каждый диалог представлен по-разному для каждой строки. Как я могу обойти это? –