React中使用map处理状态并为BootstrapTable列加样式失效问题
问题:React中使用BootstrapTable时样式无法生效
我看了你写的代码,问题主要出在对BootstrapTable的columnClassName属性理解不对,还有函数逻辑的几个小问题,咱们一步步来修正:
核心错误分析
columnClassName的作用理解错了:这个属性需要返回的是CSS类名字符串,用来给整个列的单元格加样式,而不是直接返回<span>这种JSX元素。如果要自定义单元格的渲染内容,应该用dataFormat属性。- 没必要遍历整个events数组:BootstrapTable会自动为每一行数据调用格式化函数,你直接用当前行的
row参数就能拿到该行的event_type,不用自己去map整个数组。 - 函数返回值和绑定问题:你的map函数里没有return任何内容,而且
bind(this)的位置也不对,会导致this指向混乱。
修正方案一:用dataFormat自定义带样式的单元格内容
如果你想让event_status列的内容显示成带Bootstrap标签样式的文本,应该这么写:
第一步:定义格式化函数
// 用箭头函数自动绑定this,不用手动bind formatStatusCell = (cellValue, row) => { let labelClass = ''; switch(row.event_type) { case 'A': labelClass = 'label label-danger'; break; case 'W': labelClass = 'label label-warning'; break; case 'I': default: labelClass = 'label label-info'; } // 返回带样式的span元素 return <span className={labelClass}>{cellValue}</span>; }
第二步:在BootstrapTable中使用dataFormat
<BootstrapTable data={this.state.Event.events} // 注意:这里要传数组this.state.Event.events,不是对象 exportCSV title='Infravision-Report' pagination search > <TableHeaderColumn dataField='event_title' isKey={true}>Description</TableHeaderColumn> <TableHeaderColumn dataField='time' dataSort={true}>Date time</TableHeaderColumn> <TableHeaderColumn dataField='event_status' dataFormat={this.formatStatusCell} // 用dataFormat绑定自定义渲染函数 >Status</TableHeaderColumn> </BootstrapTable>
修正方案二:用columnClassName给单元格加类名
如果你只是想给整个列的单元格加统一的类(比如调整背景色),可以用columnClassName,返回类名字符串即可:
getColumnClass = (cellValue, row) => { switch(row.event_type) { case 'A': return 'danger-cell'; case 'W': return 'warning-cell'; default: return 'info-cell'; } }
然后在TableHeaderColumn里配置:
<TableHeaderColumn dataField='event_status' columnClassName={this.getColumnClass} >Status</TableHeaderColumn>
记得在CSS里定义这些类:
.danger-cell { background-color: #f2dede; } .warning-cell { background-color: #fcf8e3; } .info-cell { background-color: #d9edf7; }
额外注意点
- 确保
data属性传入的是数组类型(this.state.Event.events),BootstrapTable需要数组作为数据源,不能直接传包含events的对象。 - 如果不用箭头函数,记得在组件构造函数里手动绑定函数:
constructor(props) { super(props); this.state = { /* 你的数据 */ }; this.formatStatusCell = this.formatStatusCell.bind(this); }
内容的提问来源于stack exchange,提问作者Mohamad reza1987
相关产品推荐
相关产品推荐

