Ich habe eine Material UI <Table>
, und in jedem <TableRow>
(die dynamisch wiedergegeben wird) für die <TableBody>
, würde Ich mag, einen Knopf haben (<FlatButton>
) für eine der Spalten. Und sobald der Knopf angeklickt ist, öffnet sich ein <Dialog>
und im Inneren wäre ein funktionierender <Tabs>
.ReactJS + Material-UI: Wie werden FlatButton und Dialog von Material-UI in jedem TableRow verwendet?
So wie kann ich zeige ein <FlatButton>
für jede Zeile für eine bestimmte Spalte, und wenn die Taste angeklickt wird, zeigen Sie die <Dialog>
zusammen mit einem Arbeits <Tabs>
auf der Innenseite als Inhalt? Und lassen Sie die <Dialog>
schließen, wenn Sie draußen geklickt haben?
Bisher habe ich die folgende haben, kam aber über die folgenden Themen: das eröffnet, aber es ist langsam und klicken außerhalb des <Dialog>
schließt es nicht, die <Tabs>
ist sichtbar, aber es funktioniert nicht:
Haupt Tabelle:
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>
)
}
}
Rendered Tabellenzeile:
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>
)
}
}
Vielen Dank im Voraus und akzeptiert/upvote Antwort.
Was wird im Dialog angezeigt? Für jede Zeile generieren Sie einen neuen Dialog - ist das notwendig? Wie du bereits erwähnt hast, wird es sehr langsam sein. Besserer Ansatz ist es, ein Dialog-Element in der Haupttabelle zu haben und die notwendigen Requisiten zu übergeben. – szymonm
Ich würde den Dialog außerhalb der Tabelle verschieben, einen Callback an eine Schaltfläche in der Tabellenzeile übergeben, die beim Klicken öffnet, öffnet Dialog und übergibt die ausgewählte Zeile daran – Mateusz
@szymonm Unterschiedlicher Inhalt für jede Zeile, aber es wird angezeigt von Verwenden '' '' innerhalb des Dialogs, aber zur Zeit funktionieren die Tabs nicht. Der Grund, warum ich es für jede Zeile gemacht habe, liegt darin, dass jeder Dialog für jede Zeile unterschiedlich dargestellt wird. Wie kann ich das umgehen? –