如何在 react-bootstrap-table 中有条件地渲染按钮? (每行的按钮)
How to conditionally render the button in react-bootstrap-table ? (The button for each row)
我试图通过比较 row.id 和我数据库中的 item.id 来有条件地呈现 react-bootstrap-table
中的按钮。
我设法使用 dataFormat
道具添加了一个按钮,但我无法有条件地显示按钮
- 我正在使用 table 来显示我从数据库中获取的组。
- 获取所有组后,我将它们的 ID (row.id) 与数据库中的组进行比较。
- 如果匹配我显示
Button1
- 如果不匹配我显示
Button2
我尝试了很多次,但我的解决方案没有给我想要的结果
这是我的代码:
- 如果我在数据库中已经有 8 个组,这 8 个组的按钮应该
red
与其他按钮的文本不同。
如果组不在数据库中,它的按钮应该是blue
class App extends Component {
constructor() {
super()
this.state = {
json: [], // json(coming from the Meetup-api)
jsonFromDatabase: [],
}
this.cellButton = this.cellButton.bind(this);
}
cellButton(cell, row, enumObject, rowIndex) {
let theButton
for(var group in this.state.jsonFromDatabase){
if (this.state.jsonFromDatabase[group].id !== row.id){
// Display this button if the group is not in the database
theButton = <button style={{ backgroundColor: "blue"}}
type="button"
onClick={() => this.onClickGroupSelected(cell, row, rowIndex)}>
Process the group
</button>
} else {
// Display this button if the group is already in the database
theButton = <button style={{ backgroundColor: "red" }}
type="button"
onClick={() => this.onClickGroupToUpdate(cell, row, rowIndex)}>
Update the group
</button>
}
}
return theButton
}
render() {
return (
<BootstrapTable data={this.state.json} options={ this.options } >
<TableHeaderColumn isKey dataField='id' width='100'>ID</TableHeaderColumn>
<TableHeaderColumn dataField='name' width='300'>Group Name</TableHeaderColumn>
<TableHeaderColumn dataField='button' width='100' dataFormat={this.cellButton}>Generate Group Page</TableHeaderColumn>
</BootstrapTable>
)
}
}
我尝试的另一个不成功的变体:
cellButton(cell, row, enumObject, rowIndex) {
let theButton
Object.keys(this.state.jsonFromDatabase).map((key) => {
if (this.state.jsonFromDatabase[key].id !== row.id){
return (
<button style={{ backgroundColor: "blue"}}
type="button"
onClick={() => this.onClickGroupSelected(cell, row, rowIndex)}>
Process the group
</button>
)
} else {
....
....
}
})
}
问题是您是 returning
单元格格式化程序的一个按钮 function
。
使用这个:
cellButton(cell, row, enumObject, rowIndex) {
let uiItems = [];
for(var group in this.state.jsonFromDatabase){
if (this.state.jsonFromDatabase[group].id !== row.id){
uiItems.push(<button style={{ backgroundColor: "blue"}}
type="button"
onClick={() => this.onClickGroupSelected(cell, row, rowIndex)}>
Process the group
</button>)
}else{
uiItems.push(<button style={{ backgroundColor: "red" }}
type="button"
onClick={() => this.onClickGroupToUpdate(cell, row, rowIndex)}>
Update the group
</button>)
}
}
return uiItems;
}
或使用map
,像这样:
cellButton(cell, row, enumObject, rowIndex) {
return this.state.jsonFromDatabase.map((group, i) => {
if (group.id !== row.id){
return <button style={{ backgroundColor: "blue"}}
type="button"
onClick={() => this.onClickGroupSelected(cell, row, rowIndex)}>
Process the group
</button>
}else{
return <button style={{ backgroundColor: "red" }}
type="button"
onClick={() => this.onClickGroupToUpdate(cell, row, rowIndex)}>
Update the group
</button>
}
})
}
你的逻辑似乎是正确的,但实现起来有点错误。
cellButton(cell, row, enumObject, rowIndex) {
let theButton;
let groupExistsInDatabase = false;
for(var group in this.state.jsonFromDatabase){
if (this.state.jsonFromDatabase[group].id === row.id){
// make groupExistsInDatabase true if the group is found in the database
groupExistsInDatabase = true;
break;
}
}
if(groupExistsInDatabase === true) {
theButton = <button style={{ backgroundColor: "red" }} type="button" onClick={() => this.onClickGroupToUpdate(cell, row, rowIndex)}>
Update the group
</button>
} else {
theButton = <button style={{ backgroundColor: "blue" }} type="button" onClick={() => this.onClickGroupSelected(cell, row, rowIndex)}>
Process the group
</button>
}
return theButton;
}
此解决方案应该有效。让我知道是否有一些修改。
我试图通过比较 row.id 和我数据库中的 item.id 来有条件地呈现 react-bootstrap-table
中的按钮。
我设法使用 dataFormat
道具添加了一个按钮,但我无法有条件地显示按钮
- 我正在使用 table 来显示我从数据库中获取的组。
- 获取所有组后,我将它们的 ID (row.id) 与数据库中的组进行比较。
- 如果匹配我显示
Button1
- 如果不匹配我显示
Button2
我尝试了很多次,但我的解决方案没有给我想要的结果
这是我的代码:
- 如果我在数据库中已经有 8 个组,这 8 个组的按钮应该
red
与其他按钮的文本不同。 如果组不在数据库中,它的按钮应该是
blue
class App extends Component { constructor() { super() this.state = { json: [], // json(coming from the Meetup-api) jsonFromDatabase: [], } this.cellButton = this.cellButton.bind(this); } cellButton(cell, row, enumObject, rowIndex) { let theButton for(var group in this.state.jsonFromDatabase){ if (this.state.jsonFromDatabase[group].id !== row.id){ // Display this button if the group is not in the database theButton = <button style={{ backgroundColor: "blue"}} type="button" onClick={() => this.onClickGroupSelected(cell, row, rowIndex)}> Process the group </button> } else { // Display this button if the group is already in the database theButton = <button style={{ backgroundColor: "red" }} type="button" onClick={() => this.onClickGroupToUpdate(cell, row, rowIndex)}> Update the group </button> } } return theButton } render() { return ( <BootstrapTable data={this.state.json} options={ this.options } > <TableHeaderColumn isKey dataField='id' width='100'>ID</TableHeaderColumn> <TableHeaderColumn dataField='name' width='300'>Group Name</TableHeaderColumn> <TableHeaderColumn dataField='button' width='100' dataFormat={this.cellButton}>Generate Group Page</TableHeaderColumn> </BootstrapTable> ) } }
我尝试的另一个不成功的变体:
cellButton(cell, row, enumObject, rowIndex) {
let theButton
Object.keys(this.state.jsonFromDatabase).map((key) => {
if (this.state.jsonFromDatabase[key].id !== row.id){
return (
<button style={{ backgroundColor: "blue"}}
type="button"
onClick={() => this.onClickGroupSelected(cell, row, rowIndex)}>
Process the group
</button>
)
} else {
....
....
}
})
}
问题是您是 returning
单元格格式化程序的一个按钮 function
。
使用这个:
cellButton(cell, row, enumObject, rowIndex) {
let uiItems = [];
for(var group in this.state.jsonFromDatabase){
if (this.state.jsonFromDatabase[group].id !== row.id){
uiItems.push(<button style={{ backgroundColor: "blue"}}
type="button"
onClick={() => this.onClickGroupSelected(cell, row, rowIndex)}>
Process the group
</button>)
}else{
uiItems.push(<button style={{ backgroundColor: "red" }}
type="button"
onClick={() => this.onClickGroupToUpdate(cell, row, rowIndex)}>
Update the group
</button>)
}
}
return uiItems;
}
或使用map
,像这样:
cellButton(cell, row, enumObject, rowIndex) {
return this.state.jsonFromDatabase.map((group, i) => {
if (group.id !== row.id){
return <button style={{ backgroundColor: "blue"}}
type="button"
onClick={() => this.onClickGroupSelected(cell, row, rowIndex)}>
Process the group
</button>
}else{
return <button style={{ backgroundColor: "red" }}
type="button"
onClick={() => this.onClickGroupToUpdate(cell, row, rowIndex)}>
Update the group
</button>
}
})
}
你的逻辑似乎是正确的,但实现起来有点错误。
cellButton(cell, row, enumObject, rowIndex) {
let theButton;
let groupExistsInDatabase = false;
for(var group in this.state.jsonFromDatabase){
if (this.state.jsonFromDatabase[group].id === row.id){
// make groupExistsInDatabase true if the group is found in the database
groupExistsInDatabase = true;
break;
}
}
if(groupExistsInDatabase === true) {
theButton = <button style={{ backgroundColor: "red" }} type="button" onClick={() => this.onClickGroupToUpdate(cell, row, rowIndex)}>
Update the group
</button>
} else {
theButton = <button style={{ backgroundColor: "blue" }} type="button" onClick={() => this.onClickGroupSelected(cell, row, rowIndex)}>
Process the group
</button>
}
return theButton;
}
此解决方案应该有效。让我知道是否有一些修改。