data to specify the data that you want to display on the table. This prop is required and you should give it an array // with es6 const data = [ ... ]; //... <BootstrapTable data={ data }> //... </BootstrapTable> keyField to tell table which column is unique. This is same as isKey in <TableHeaderColumn> Tips: react-bootstrap-table support data manipulation(CRUD) so that we need to fetch correct row by a unique column. <BootstrapTable data={ data } keyField='account'> <TableHeaderColumn dataField='account'>Account</TableHeaderColumn> <TableHeaderColumn dataField='name'>Name</TableHeaderColumn> </BootstrapTable> As mentioned, following is equivalent <BootstrapTable data={ data }> <TableHeaderColumn isKey dataField='account'>Account</TableHeaderColumn> <TableHeaderColumn dataField='name'>Name</TableHeaderColumn> </BootstrapTable> react-bootstrap-table default handle the data changing(like sorting, filtering insert or pagination etc) in a data store, call TableDataStore. So this prop is false by default, if you enable remote, which means you need to handle the all data manipulation on your application(flux implement or something like that). Therefore, react-bootstrap-table support following event hooks so that you can interact to your server or local store with the data changing onSortChangeonSearchChangeonPageChangeonSizePerPageListonAddRowonDeleteRowonExportToCSVonFilterChangeonCellEdit remote(remoteObj) { // Only cell editing, insert and delete row will be handled by remote store remoteObj.cellEdit = true; remoteObj.insertRow = true; remoteObj.dropRow = true; return remoteObj; } // ... <BootstrapTable data={ data }> <TableHeaderColumn isKey dataField='account'>Account</TableHeaderColumn> <TableHeaderColumn dataField='name'>Name</TableHeaderColumn> </BootstrapTable> To use remote pagination properly you need to pass fetchInfo property.remote mode. height to adjust the height of table. You need give a string with an unit(px) value like following: Tips: react-bootstrap-table display all the data without fixed header, because height is auto by default. If you give a height, the header will fixed when data is too long. <BootstrapTable data={ data } height='120px'> //... </BootstrapTable> maxHeight to set the maximum height of table. You need give a string with an unit(px) value like height: <BootstrapTable data={ data } maxHeight='120px'> //... </BootstrapTable> <BootstrapTable data={ data } striped> //... </BootstrapTable> <BootstrapTable data={ data } hover> //... </BootstrapTable> <BootstrapTable data={ data } condensed> //... </BootstrapTable> <BootstrapTable data={ data } bordered={ false }> //... </BootstrapTable> pagination to true, default is false. Default pagination have a dropdown for choosing size per page and a pages list with next and previous page button <BootstrapTable data={ data } pagination > //... </BootstrapTable> Following is the default pagination view:
row and rowIndex as arguments and should return a string for the presenting class. for examples: trClassFormat(row, rowIndex) { // row is the current row data return rowIndex % 2 === 0 ? "tr-odd" : "tr-even"; // return class name. } render() { return ( <BootstrapTable data={ data } trClassName={ this.trClassFormat }> //... </BootstrapTable> ); } insertRow to true, default is false. react-bootstrap-table support a row insert feature by a pop modal. If you enable row insertion, there's a <BootstrapTable data={ data } insertRow > //... </BootstrapTable> Following is the pop modal for row insertion:
deleteRow to true, default is false. react-bootstrap-table support a row deletion feature but you need to enable the row selection by selectRow .Because react-bootstrap-table will drop rows the according to the selected row by user select. If you enable row dropping, there's a render() { const selectRow = { mode: 'radio' //radio or checkbox }; return ( <BootstrapTable data={ data } selectRow={ selectRow } deleteRow> //... </BootstrapTable> ); } react-bootstrap-table If enabled, there're input text fields per column under the table, user can input your filter condition by each column. However, react-bootstrap-table have a better column filter which have multiple filter type. You can check this <BootstrapTable data={ data } columnFilter > //... </BootstrapTable> search to true, default is false. If enabled, there is a input field on the upper left side of the table and user can type their search text on it. <BootstrapTable data={ data } search > //... </BootstrapTable> searchPlaceholder to change the placeholder in search field, default is Search <BootstrapTable data={ data } search searchPlaceholder='input something...' > //... </BootstrapTable> multiColumnSearch, default is false. If you want to use multi search, you must enable search at first. Tips: Use space to delimited search text. EX: 3 4, which means match all 3 or 4 datas in table. <BootstrapTable data={ data } search multiColumnSearch> //... </BootstrapTable> exportCSV as true, default is false. If you enable, there's a <BootstrapTable data={ data } exportCSV> //... </BootstrapTable> <BootstrapTable data={ data } exportCSV csvFileName='table-export'> //... </BootstrapTable> <BootstrapTable data={ data } pagination ignoreSinglePage> //... </BootstrapTable> Top and Bottom <BootstrapTable data={ data } scrollTop={ 'Bottom' }> //... </BootstrapTable> react-bs-table-container class <BootstrapTable data={ data } containerStyle={ { background: '#00ff00' } }> //... </BootstrapTable> react-bs-table class <BootstrapTable data={ data } tableStyle={ { background: '#00ff00' } }> //... </BootstrapTable> react-bs-container-header class <BootstrapTable data={ data } headerStyle={ { background: '#00ff00' } }> //... </BootstrapTable> react-bs-container-body class <BootstrapTable data={ data } bodyStyle={ { background: '#00ff00' } }> //... </BootstrapTable> react-bs-table-container class <BootstrapTable data={ data } containerClass='my-custom-class'> //... </BootstrapTable> react-bs-table class <BootstrapTable data={ data } tableContainerClass='my-custom-class'> //... </BootstrapTable> react-bs-container-header class <BootstrapTable data={ data } headerContainerClass='my-custom-class'> //... </BootstrapTable> react-bs-container-body class <BootstrapTable data={ data } bodyContainerClass='my-custom-class'> //... </BootstrapTable> react-bootstrap-table separate two table element as header and body. So the tableHeaderClass is for the table element in the header. <BootstrapTable data={ data } tableHeaderClass='my-custom-class'> //... </BootstrapTable> react-bootstrap-table separate two table element as header and body. So the tableBodyClass is for the table element in the body. <BootstrapTable data={ data } tableBodyClass='my-custom-class'> //... </BootstrapTable> <BootstrapTable data={ data } multiColumnSort={ 2 }> //... </BootstrapTable> react-bootstrap-table support the remote pagination feature, when you enable this feature, react-bootstrap-table will check fetchInfo to generate pagination. fetchInfo accept an object which have the following props: render() { const fetchInfo = { dataTotalSize: 100 // or checkbox }; return( <BootstrapTable data={ data } remote={ true } pagination={ true } fetchInfo={ fetchInfo }> //... </BootstrapTable> ); } render() { const fetchInfo = { dataTotalSize: 100 }; return( <BootstrapTable data={ data } remote={ true } pagination={ true } fetchInfo={ fetchInfo}> //... </BootstrapTable> ); } react-bootstrap-table support the row selection feature, when you enable this feature, react-bootstrap-table will add a selection column at first position. selectRow accept an object which have the following props: selectRow, you should tell react-bootstrap-table which the mode you wanted. Following is a most simple example for configuring the selectRow render() { const selectRow = { mode: 'radio' // or checkbox }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } radio assigned, there's a radio button in the selection column; likewise, the checkbox is same. render() { const selectRow = { mode: 'radio' // single select }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } render() { const selectRow = { mode: 'checkbox' // multi select }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } render() { const selectRow = { mode: 'checkbox', // multi select clickToSelect: true }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } render() { const selectRow = { mode: 'checkbox', // multi select clickToSelectAndEditCell: true }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } isExpandableRow(row) { if (row.id < 2) return true; else return false; } expandComponent(row) { return ( ... ); } render() { const selectRow = { mode: 'checkbox', clickToExpand: true // Trigger expand and selection together }; return( <BootstrapTable data={ data } expandableRow={ this.isExpandableRow } expandComponent={ this.expandComponent } selectRow={ selectRow }> //... </BootstrapTable> ); } bgColor, you will have more ability to custom rows background color when selecting. render() { const selectRow = { mode: 'checkbox', // multi select bgColor: '#fefefe' }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } render() { const selectRow = { mode: 'checkbox', // multi select bgColor: function(row, isSelect) { if (isSelect) { const { id } = row; if (id < 2) return 'blue'; else if (id < 4) return 'red'; else return 'yellow'; } return null; } }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } columnWidth. render() { const selectRow = { mode: 'checkbox', // multi select columnWidth: '60px' }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } render() { const selectRow = { mode: 'checkbox', // multi select className: 'custom-select-class' }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } render() { const selectRow = { mode: 'checkbox', // multi select selected: [ 'row1', 'row3' ] }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } render() { const selectRow = { mode: 'checkbox', // multi select unselectable: [ 'row4', 'row5' ] }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } render() { const selectRow = { mode: 'checkbox', // multi select hideSelectColumn: true }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } render() { const selectRow = { mode: 'checkbox', // multi select showOnlySelected: true }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } row is the row data which you wanted to select or unselect.isSelectedis a boolean value which means "whether or not that row will be selected?".eventis the event target object.false, the select or deselect action will not be applied. handleRowSelect(row, isSelected, e) { // ... } render() { const selectRow = { mode: 'checkbox', // multi select onSelect: this.handleRowSelect }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } isSelectedis a boolean value which means "whether or not that row will be selected?".rows is the rows which be selected or unselected. handleRowSelect(isSelected, rows) { // ... } render() { const selectRow = { mode: 'checkbox', // multi select onSelectAll: this.handleSelectAll }; return( <BootstrapTable data={ data } selectRow={ selectRow }> //... </BootstrapTable> ); } customComponent, you can custom your own selection checkbox or radio button. This function take one argument: props and have following properties: react-bootstrap-table support the cell editing feature, when you enable this feature, react-bootstrap-table will make the target cell as editable by clicking or dbclicking. cellEdit accept an object which have the following props: Be carefully, when you enable cellEdit, you should tell react-bootstrap-table which the mode you wanted. Following is a most simple example for configuring the cellEdit render() { const cellEdit = { mode: 'click' // click cell to edit }; return( <BootstrapTable data={ data } cellEdit={ cellEdit }> //... </BootstrapTable> ); } click or dbclick) render() { const cellEdit = { mode: 'click' // click cell to edit }; return( <BootstrapTable data={ data } cellEdit={ cellEdit }> //... </BootstrapTable> ); } render() { const cellEdit = { mode: 'dbclick' // double click cell to edit }; return( <BootstrapTable data={ data } cellEdit={ cellEdit }> //... </BootstrapTable> ); } blurToSave will trigger a saving event on cell when mouse blur on the input field. Default is false. In the default condition, you need to press ENTER to save the cell. render() { const cellEdit = { mode: 'click', // click cell to edit blurToSave: true, }; return( <BootstrapTable data={ data } cellEdit={ cellEdit }> //... </BootstrapTable> ); } nonEditableRows tell react-bootstrap-table which rows should not be edited on all of the columns. Briefly, its a row level limitation Please assign a callback function, and this function is supposed to be return an array of row keys. render() { const cellEdit = { mode: 'click', // click cell to edit nonEditableRows: : function() { // if product id less than 3, will cause the whole row noneditable // this function should return an array of row keys return products.filter(p => p.id < 3).map(p => p.id); } }; return( <BootstrapTable data={ data } cellEdit={ cellEdit }> //... </BootstrapTable> ); } beforeSaveCell(row, cellName, cellValue) { // if you dont want to save this editing, just return false to cancel it. } render() { const cellEdit = { mode: 'click', // click cell to edit beforeSaveCell: this.beforeSaveCell, }; return( <BootstrapTable data={ data } cellEdit={ cellEdit }> //... </BootstrapTable> ); } afterSaveCell(row, cellName, cellValue) { // do your stuff... } render() { const cellEdit = { mode: 'click', // click cell to edit afterSaveCell: this.afterSaveCell, }; return( <BootstrapTable data={ data } cellEdit={ cellEdit }> //... </BootstrapTable> ); } react-bootstrap-table support a lotf of feature, you can configure some options for table. options accept an object which have the following props:| Sort | Search | Pagination | Expanding Row | Customization | Others |
|---|---|---|---|---|---|
|
constructor(props) { super(props); // Manage the sort state in your application this.state = { sortName: undefined, sortOrder: undefined }; this.onSortChange = this.onSortChange.bind(this); } onSortChange(sortName, sortOrder) { this.setState({ sortName, sortOrder }); } render() { const options = { sortName: this.state.sortName, sortOrder: this.state.sortOrder, onSortChange: this.onSortChange }; return ( <BootstrapTable data={ products } options={ options }> <TableHeaderColumn dataField='id' isKey={ true } dataSort={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' dataSort={ true }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } desc and asc. render() { const options = { defaultSortName: 'name' }; return ( <BootstrapTable data={ products } options={ options }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' dataSort={ true }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } desc and asc. render() { const options = { defaultSortName: 'name', defaultSortOrder: 'asc' }; return ( <BootstrapTable data={ products } options={ options }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' dataSort={ true }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } render() { const options = { sortIndicator: false }; return ( <BootstrapTable data={ products } options={ options }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } sortNamesortOrder onSortChange = (sortName, sortOrder) => { // ... } render() { const options = { onSortChange: this.onSortChange }; return ( <BootstrapTable data={ products } options={ options }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' dataSort>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' dataSort>Product Price</TableHeaderColumn> </BootstrapTable> ); } render() { const options = { noDataText: 'Empty Table' }; return ( <BootstrapTable data={ products } options={ options }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } render() { const options = { withoutNoDataText: true }; return ( <BootstrapTable data={ products } options={ options }> // ... </BootstrapTable> ); } render() { const options = { defaultSearch: 'Product 1' }; return ( <BootstrapTable data={ products } options={ options } search> // ... </BootstrapTable> ); } render() { const options = { searchDelayTime: 1500 }; return ( <BootstrapTable data={ products } options={ options }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } editable on <TableHeaderColumn> when row insert. render() { const options = { ignoreEditable: true }; return ( <BootstrapTable data={ products } options={ options } insertRow> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } render() { const options = { clearSearch: true }; return ( <BootstrapTable data={ products } options={ options } search> // ... </BootstrapTable> ); } searchTextcolInfosmultiColumnSearchsearchText. This function almost used on remote, you can check this example. onSearchChange = (searchText, colInfos, multiColumnSearch) => { //... } render() { const options = { onSearchChange: this.onSearchChange }; return ( <BootstrapTable data={ products } options={ options } search> // ... </BootstrapTable> ); } searchTextresult afterSearch = (searchText, result) => { //... } render() { const options = { afterSearch: this.afterSearch }; return ( <BootstrapTable data={ products } options={ options } search> // ... </BootstrapTable> ); } handleTableComplete() { // ... } render() { const options = { afterTableComplete: this.handleTableComplete }; return ( <BootstrapTable data={ products } options={ options }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } rowKeys, which means the row keys you dropped. handleDeletedRow(rowKeys) { // ... } render() { const options = { afterDeleteRow: this.handleDeletedRow }; const selectRow = { mode: 'checkbox', clickToSelect: true }; return ( <BootstrapTable data={ products } selectRow={ selectRow } options={ options } deleteRow> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } row, which means the row object you added. handleInsertedRow(row) { // ... } render() { const options = { afterInsertRow: this.handleInsertedRow }; return ( <BootstrapTable data={ products } options={ options } insertRow> // ... </BootstrapTable> ); } filterCondsresultfilterConds: It's an array object which contain all column filter conditions. result: The results after filtering. This function only work when you enable columnFilter on <BootstrapTable> or define the filter on <TableHeaderColumn> afterColumnFilter(filterConds, result) { console.log('Filter Conditions: '); for (const prop in filterConds) { console.log('Filter column= ' + prop + ', Filter value= ' + filterConds[prop]); } console.log('Result is:'); for (let i = 0; i < result.length; i++) { console.log('Product: ' + result[i].id + ', ' + result[i].name + ', ' + result[i].price); } } render() { const options = { afterColumnFilter: this.afterColumnFilter }; return ( <BootstrapTable data={ products } options={ options } columnFilter> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' filter={ { type: 'TextFilter', delay: 1000 } }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } row which presented as the new row data. onAddRow almost used on remote, you can check this example. onAddRow(row) { // ... } render() { const options = { onAddRow: this.onAddRow }; return ( <BootstrapTable data={ products } options={ options } insertRow> // ... </BootstrapTable> ); } dataField as object key and the value is the filter condition. onFilterChange almost used on remote, you can check this example. onFilterChange(filterObj) { // ... } render() { const options = { onFilterChange: this.onFilterChange }; return ( <BootstrapTable data={ products } options={ options }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' filter={ { type: 'TextFilter', delay: 1000 } }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } onExportToCSV almost used on remote, you can check this example. onExportToCSV(row) { // ... return products; // must return the data which you want to be exported } render() { const options = { onExportToCSV: this.onExportToCSV }; return ( <BootstrapTable data={ products } options={ options } exportCSV> // ... </BootstrapTable> ); } rows which presented as the deleted rows. onDeleteRow almost used on remote, you can check this example. onDeleteRow(rows) { // ... } render() { const options = { onDeleteRow: this.onDeleteRow }; const selectRow = { mode: 'checkbox' } return ( <BootstrapTable data={ products } options={ options } selectRow= { selectRow } deleteRow> // ... </BootstrapTable> ); } row which is the row data which you click on. onRowClick(row) { // ... } render() { const options = { onRowClick: this.onRowClick }; return ( <BootstrapTable data={ products } options={ options }> // ... </BootstrapTable> ); } row which is the row data which you dbclick on. onRowDoubleClick(row) { // ... } render() { const options = { onRowDoubleClick: this.onRowDoubleClick }; return ( <BootstrapTable data={ products } options={ options }> // ... </BootstrapTable> ); } onMouseEnter() { // ... } render() { const options = { onMouseEnter: this.onMouseEnter }; return ( <BootstrapTable data={ products } options={ options }> // ... </BootstrapTable> ); } onMouseLeave() { // ... } render() { const options = { onMouseLeave: this.onMouseLeave }; return ( <BootstrapTable data={ products } options={ options }> // ... </BootstrapTable> ); } row is the row data which mouse over. onRowMouseOver(row) { // ... } render() { const options = { onRowMouseOver: this.onRowMouseOver }; return ( <BootstrapTable data={ products } options={ options }> // ... </BootstrapTable> ); } row is the row data which mouse out. onRowMouseOut(row) { // ... } render() { const options = { onRowMouseOut: this.onRowMouseOut }; return ( <BootstrapTable data={ products } options={ options }> // ... </BootstrapTable> ); } nextrowKeysnext: If you confirm to drop row, call next() to continue the process rowKeys: is the row keys which been deleted, you can call next function to apply this deletion. customConfirm(next, dropRowKeys) { const dropRowKeysStr = dropRowKeys.join(','); if (confirm(`(It's a custom confirm)Are you sure you want to delete ${dropRowKeysStr}?`)) { // If the confirmation is true, call the function that // continues the deletion of the record. next(); } } render() { const options = { handleConfirmDeleteRow: this.customConfirm }; const selectRow = { mode: 'checkbox', clickToSelect: true }; return ( <BootstrapTable data={ products } selectRow={ selectRow } options={ options } deleteRow> // ... </BootstrapTable> ); } jobStatusValidator(value) { const nan = isNaN(parseInt(value, 10)); if (nan) { return 'Job Status must be a integer!'; } return true; } render() { const options = { beforeShowError: (type, msg) => { this.setState({ errType: type, errMsg: msg }); // return false or do not return will not trigger the toastr, // if you want the toastr popup, you should return true always. } }; const cellEditProp = { mode: 'click', blurToSave: true }; return ( <p style={ { color: 'red' } }>{ `[${this.state.errType}]: ${this.state.errMsg}` }</p> <BootstrapTable data={ products } cellEdit={ cellEditProp } options={ options }> <TableHeaderColumn dataField='id' isKey={ true }>Job ID</TableHeaderColumn> <TableHeaderColumn dataField='status' editable={ { validator: this.jobStatusValidator } }>Job Status</TableHeaderColumn> </BootstrapTable> ); } true, you can disable to print the toolbar via false render() { const options = { printToolBar: false }; return ( <BootstrapTable data={ products } options={ options }> <TableHeaderColumn dataField='id' isKey>Job ID</TableHeaderColumn> <TableHeaderColumn dataField='status'>Job Status</TableHeaderColumn> </BootstrapTable> ); } render() { const options = { prePage: 'Previous' }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } render() { const options = { nextPage: 'Next' }; return ( <BootstrapTable data={ products } options={ options } pagination> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } render() { const options = { firstPage: 'First Page' }; return ( <BootstrapTable data={ products } options={ options } pagination> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } render() { const options = { lastPage: 'Last Page' }; return ( <BootstrapTable data={ products } options={ options } pagination> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } render() { const options = { page: 3 // Showing page 3 as default }; return ( <BootstrapTable data={ products } options={ options } pagination> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } 10, 25, 30, 50. render() { const options = { sizePerPageList: [ 5, 15, 30 ] }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } However, you can do more customization like following: render() { const options = { sizePerPageList: [ { text: '5', value: 5 }, { text: '10', value: 10 }, { text: 'All', value: products.length } ] }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } render() { const options = { sizePerPage: 30 // Showing 30 for the size per page as default }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } render() { const options = { paginationSize: 3 }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } render() { const options = { hideSizePerPage: true }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } start: Current start index. to: Current end index. total: The total data volume. render() { const options = { paginationShowsTotal: true // Enable showing total text }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } Following is a customization example renderPaginationShowsTotal(start, to, total) { return ( <p style={ { color: 'blue' } }> From { start } to { to }, totals is { total } (its a customize text) </p> ); } render() { const options = { paginationShowsTotal: this.renderPaginationShowsTotal // custom }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } render() { const options = { pageStartIndex: 0 }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } onPageChange = (page, sizePerPage) => { // ... } render() { const options = { onPageChange: this.onPageChange }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } onSizePerPageList = (sizePerPage) => { // ... } render() { const options = { onSizePerPageList: this.onSizePerPageList }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } false, if true assign, the pagination list will be hide totalliy if only one page. render() { const options = { hidePageListOnlyOnePage: true }; return ( <BootstrapTable data={ products } options={ options } pagination> // ... </BootstrapTable> ); } expandComponent(row) { return ( ... ); } render() { const options = { expandRowBgColor: 'rgb(242, 255, 163)' }; return ( <BootstrapTable data={ products } options= { options } expandableRow={ () => { return true; } } expandComponent={ this.expandComponent }> // ... </BootstrapTable> ); } react-bootstrap-table how to trigger expanding by clicking on row or column level. It value is column, default all the columns are expandable, if you want some column as unexpandable, check expandable. expandComponent(row) { return ( ... ); } render() { const options = { expandBy: 'column' // Currently, available value is row and column, default is row }; return ( <BootstrapTable data={ products } options= { options } expandableRow={ () => { return true; } } expandComponent={ this.expandComponent }> // ... </BootstrapTable> ); } render() { const options = { insertText: 'Custom Insert Text' }; return ( <BootstrapTable data={ products } options={ options } insertRow> // ... </BootstrapTable> ); } render() { const options = { deleteText: 'Custom Delete Text' }; return ( <BootstrapTable data={ products } options={ options } deleteRow> // ... </BootstrapTable> ); } render() { const options = { saveText: 'Custom Save Text' }; return ( <BootstrapTable data={ products } options={ options } insertRow> // ... </BootstrapTable> ); } render() { const options = { closeText: 'Custom Close Text' }; return ( <BootstrapTable data={ products } options={ options } insertRow> // ... </BootstrapTable> ); } render() { const options = { exportCSVText: 'Custom Export CSV Text' }; return ( <BootstrapTable data={ products } options={ options } exportCSV> // ... </BootstrapTable> ); } react-bootstrap-table which rows are able to expand. This props accept a callback function and is suppose to be return an Array of row keys expandableRow always used with expandComponent, both of props are enable the expand row functionality on table. isExpandableRow(row) { if (row.id < 2) return true; else return false; } expandComponent(row) { return ( ... ); } render() { return ( <BootstrapTable data={ products } expandableRow={ this.isExpandableRow } expandComponent={ this.expandComponent }> // ... </BootstrapTable> ); } react-bootstrap-table what's content should be rendered in the expanding content. This props accept a callback function and is suppose to be return JSX or String expandComponent always used with expandableRow, both of props are enable the expand row functionality on table. isExpandableRow(row) { if (row.id < 2) return true; else return false; } expandComponent(row) { return ( ... ); } render() { return ( <BootstrapTable data={ products } expandableRow={ this.isExpandableRow } expandComponent={ this.expandComponent }> // ... </BootstrapTable> ); } expandColumnOptions only have four available property currently. expandColumnVisible: will enable an indicator column at first column if true. Default is false.expandColumnComponent: a callback function for custom the indicator column.columnWidth: set the width of indicator column.expandColumnBeforeSelectColumn: default is true, false will move the expand indicator column after selection column. isExpandableRow(row) { if (row.id < 2) return true; else return false; } expandComponent(row) { return ( ... ); } expandColumnComponent({ isExpandableRow, isExpanded }) { let content = ''; if (isExpandableRow) { content = (isExpanded ? '(-)' : '(+)' ); } else { content = ' '; } return ( <div> { content } </div> ); } render() { return ( <BootstrapTable data={ products } expandableRow={ this.isExpandableRow } expandComponent={ this.expandComponent } expandColumnOptions={ { expandColumnVisible: true, expandColumnComponent: this.expandColumnComponent, columnWidth: 50 } }> // ... </BootstrapTable> ); } handleAddRow to insert an new row to table. var fakeRow = { id: 10, name: 'Product one', price: 240 }; // insert a new row var result = this.refs.table.handleAddRow(fakeRow); // this.refs.table is a ref for BootstrapTable if (result){ // some error happen, ex: doesn't assign row key or row key duplicated console.log(result); } handleAddRowAtBegin to insert an new row as first row on table. var fakeRow = { id: 10, name: 'Product one', price: 240 }; // insert a new row var result = this.refs.table.handleAddRowAtBegin(fakeRow); // this.refs.table is a ref for BootstrapTable if (result){ // some error happen, ex: doesn't assign row key or row key duplicated console.log(result); } handleDropRow to drop rows in table. // Drop row key 2 & 3 this.refs.table.handleDropRow([ 2, 3 ]); // this.refs.table is a ref for BootstrapTable handleFilterData to do column filtering on table. // find name eq 'Allen' && age eq 26 this.refs.table.handleFilterData({ // this.refs.table is a ref for BootstrapTable name: "Allen", age: 26 }); handleSearch with search text for fully searching. // Search table for 'React.js' this.refs.table.handleSearch('React.js'); // this.refs.table is a ref for BootstrapTable handleSort with order and field for sorting. // Force a sort for product_id field by desc this.refs.table.handleSort('desc', 'product_id'); // this.refs.table is a ref for BootstrapTable getPageByRowKey to get the page by a rowkey. // Find the page of product_id this.refs.table.getPageByRowKey('product_id'); // this.refs.table is a ref for BootstrapTable handleExportCSV to export table as csv. // export CSV file this.refs.table.handleExportCSV(); // this.refs.table is a ref for BootstrapTable cleanSelected deselect all rows. this.refs.table.cleanSelected(); // this.refs.table is a ref for BootstrapTable reset to clean all the status on the table currently. this.refs.table.reset(); // this.refs.table is a ref for BootstrapTable <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> isKey to tell table which column is unique. This is same as keyField in <BootstrapTable> Tips: You need choose one of configuration to set the key field: isKey or keyField in <BootstrapTable>. <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' width='150px'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' width='20%'>Product Price</TableHeaderColumn> </BootstrapTable> left, center, right, start and end. <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' dataAlign='right'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> left, center, right, start and end. Tips: If you don't set the headerAlign, default will follow dataAlign. <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' headerAlign='right'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' dataSort>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' dataSort>Product Price</TableHeaderColumn> </BootstrapTable> direction which present the sort order currently. fieldName is the on sorting field name. renderCaret = (direction, fieldName) => { if (direction === 'asc') { return ( up ); } if (direction === 'desc') { return ( down ); } return ( up/down ); } render() { return ( <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' dataSort caretRender={ this.renderCaret }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); } cellrowformatExtraDatarowIdxformatExtraData will be the value which you assign it on <TableHeaderColumn>. You need to return a String or JSX in dataFormat priceFormatter(cell, row) { // String example return `<i class='glyphicon glyphicon-usd'></i> ${cell}`; } render() { return ( <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' dataFormat={ this.priceFormatter }>Product Price</TableHeaderColumn> </BootstrapTable> ); } priceFormatter(cell, row) { // JSX example return ( ... ); } render() { return ( <BootstrapTable data={ products } search> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' dataFormat={ this.priceFormatter }>Product Price</TableHeaderColumn> </BootstrapTable> ); } enumFormatter(cell, row, enumObject) { return enumObject[cell]; } render() { const qualityType = { 0: 'good', 1: 'bad', 2: 'unknown' }; const inStockStatus = { 1: 'yes', 2: 'no' }; return ( <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='quality' dataFormat={ enumFormatter } formatExtraData={ qualityType }>Product Quality</TableHeaderColumn> <TableHeaderColumn dataField='inStock' dataFormat={ enumFormatter } formatExtraData={ inStockStatus }>Product Stock Status</TableHeaderColumn> </BootstrapTable> ); } <BootstrapTable data={ products } search> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' tdAttr={ { 'data-attr': 'test' } }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> <BootstrapTable data={ products } search> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' tdStyle={ { whiteSpace: 'normal' } }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> <BootstrapTable data={ products } search> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' thStyle={ { 'fontWeight': 'lighter' } }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> <BootstrapTable data={ products } search> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' filterFormatted>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' filter={ { type: 'TextFilter' } }>Product Price</TableHeaderColumn> </BootstrapTable> cellrowcsvFormat, you should return a string. csvFormatter(cell, row) { return `${row.id}: ${cell} USD`; } render() { return ( <BootstrapTable data={ products } exportCSV> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' csvFormat={ this.csvFormatter }>Product Price</TableHeaderColumn> </BootstrapTable> ); } <BootstrapTable data={ products } exportCSV> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' csvHeader='product-name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> csvFormat function. csvPriceFormatter(cell, row) { return `${row.id}: ${cell} USD`; } csvQualityFormatter(cell, row, extra) { return extra[cell]; } //... <BootstrapTable data={ products } exportCSV> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' csvHeader='product-name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> <TableHeaderColumn dataField='quality' csvFormat={ this.csvQualityFormatter } csvFormatExtraData={ qualityType }>Product Quality</TableHeaderColumn> </BootstrapTable> export={true} usually be used when you want to export a column which is hidden. Because hidden column can't be export to csv by default. export={false} to tell the react-bootstrap-table do not export this column when exporting csv. <BootstrapTable data={ products } exportCSV> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' export hidden>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> column level.. You can assign which columns are expandable or not by expandable. For example, following we disable Product Name and Product Price as unexpandable, so use click on this both column will not trigger expanding row. expandComponent(row) { return ( ... ); } render() { const options = { expandBy: 'column' // Currently, available value is row and column, default is row }; return ( <BootstrapTable data={ products } options= { options } expandableRow={ () => { return true; } } expandComponent={ this.expandComponent }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' expandable={ false }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' expandable={ false }>Product Price</TableHeaderColumn> </BootstrapTable> ); } <BootstrapTable data={ products } keyField='id' insertRow> <TableHeaderColumn dataField='id' autoValue>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> <BootstrapTable data={ products } search> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' searchable={ false }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> title on each column, default is false. <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' columnTitle>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' columnTitle>Product Price</TableHeaderColumn> </BootstrapTable> <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' headerTitle={ false }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> TableHeaderColumn is a JSX or Object, we prefer to add this prop to describe this column with a pure text(String). <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name' headerText='Product Name'>{ this.renderProductNameContent }</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> abordersortFieldextraDataextraData is the data from the sortFuncExtraData. Tips: This function should return a negative, zero, or positive value, depending on the arguments. revertSortFunc(a, b, order) { // order is desc or asc if (order === 'desc') { return a.price - b.price; } else { return b.price - a.price; } } render() { return ( <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' dataSort sortFunc={ this.revertSortFunc }>Product Price</TableHeaderColumn> </BootstrapTable> ); } String or Function. If a Function given, you should return a String which is the class name you want to add on. customHeaderClass() { return 'custom-header-class'; } render() { return ( <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' className={ this.customHeaderClass }>Product Price</TableHeaderColumn> </BootstrapTable> ); } String or Function. If Function, it taking four arguments: cellrowrowIndexcolumnIndex columnClassNameFormat(fieldValue, row, rowIdx, colIdx) { // fieldValue is column value // row is whole row object // rowIdx is index of row // colIdx is index of column return rowIdx % 2 === 0 ? 'td-column-function-even-example' : 'td-column-function-odd-example'; } render() { return ( <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' columnClassName={ this.columnClassNameFormat }>Product Price</TableHeaderColumn> </BootstrapTable> ); } render() { const cellEditProps = { mode: 'click' }; return ( <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' editColumnClassName='class-for-editing-cell'>Product Price</TableHeaderColumn> </BootstrapTable> ); } priceValidator = (value) => { const nan = isNaN(parseInt(value, 10)); if (nan) { return 'Product price must be a integer!'; } return true; } invalidPrice = (cell, row) => { console.log(`${cell} at row id: ${row.id} fails on editing`); return 'invalid-price-class'; } render() { const cellEditProps = { mode: 'click' }; return ( <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' editable={ { validator: priceValidator } } invalidEditColumnClassName={ this.invalidPrice }>Product Price</TableHeaderColumn> </BootstrapTable> ); } Function given, you have ability to control the editable level on cell instead of column level. For this callback function, you are supposed to be return a bool value to decide this cell editable or not and this callback accept four argument, cell, row, rowIndex, columnIndex. If Object, you can give more customization on editing cell. This object have following properties: type: what edit type on editing cell, available values are textarea, select, checkbox, and datetime readOnly: Default is false, true will make cell can't be edited but still can be insert.validator: give a callback function for validation which takes "cellValue" and "row" as arguments. This function should return a boolean or object value. options.values: options.values means the data in select or checkbox. If checkbox, use a ':' (colon) to separate the values, e.g. Y:N. render() { const cellEdit = { mode: 'click', blurToSave: true }; return ( <BootstrapTable data={ products } cellEdit={ cellEdit }> <TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn> <TableHeaderColumn dataField='name'>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price' editable={ false }>Product Price</TableHeaderColumn> </BootstrapTable> ); } jobNameValidator(value, row) { // If this function return an object, you got some ability to customize your error message const response = { isValid: true, notification: { type: 'success', msg: '', title: '' } }; if (!value) { response.isValid = false; response.notification.type = 'error'; response.notification.msg = 'Value must be inserted'; response.notification.title = 'Requested Value'; } else if (value.length < 10) { response.isValid = false; response.notification.type = 'error'; response.notification.msg = 'Value must have 10+ characters'; response.notification.title = 'Invalid Value'; } return response; } jobStatusValidator(value, row) { const nan = isNaN(parseInt(value, 10)); if (nan) { return 'Job Status must be a integer!'; } return true; } render() { const cellEdit = { mode: 'click', blurToSave: true }; return ( <BootstrapTable data={ products } cellEdit={ cellEdit }> <TableHeaderColumn dataField='id' isKey={ true }>Job ID</TableHeaderColumn> <TableHeaderColumn dataField='status' editable={ { validator: jobStatusValidator } }>Job Status</TableHeaderColumn> <TableHeaderColumn dataField='name' editable={ { type: 'textarea', validator: jobNameValidator } }>Job Name</TableHeaderColumn> <TableHeaderColumn dataField='type' editable={ { type: 'select', options: { values: jobTypes } } }>Job Type</TableHeaderColumn> <TableHeaderColumn dataField='active' editable={ { type: 'checkbox', options: { values: 'Y:N' } } }>Active</TableHeaderColumn> </BootstrapTable> ); } getElement(REQUIRED): Accept a callback function and take two arguments: onUpdate and props. customEditorParameters: Another extra data for custom cell edit component. This is a good example for showing how to use custom cell editing. rowspan and colSpan. Following is a simple example for group header. render() { return ( <BootstrapTable data={ products }> <TableHeaderColumn row='0' rowSpan='2' dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn row='0' colSpan='2'>Product</TableHeaderColumn> <TableHeaderColumn row='1' dataField='name'>Name</TableHeaderColumn> <TableHeaderColumn row='1' dataField='price'>Price</TableHeaderColumn> </BootstrapTable> ); } filter: 1. type: Available value is TextFilter, SelectFilter, NumberFilter, DateFilter, RegexFilter, YOUR_CUSTOM_FILTER(Custom Example) 2. defaultValue: Default value on filter. If type is NumberFilter, the default value will be like { number: xxx, comparator: '>' } If type is DateFilter, the default value will be like { date: xxx, comparator: '>' } 3. condition: Default is eq, you can change to like to search for a specified pattern. This only work for TextFilter, SelectFilter 4. delay: Assign a millisecond for delay when trigger filtering, default is 500. 5. placeholder: Assign the placeholder text on all the filter. 6. numberComparators: Only work on NumberFilter and DateFilter. Accept an array which conatin the filter condition, like: ['<','>','='] 7. options: Only work on SelectFilter or NumberFilter: SelectFilter: you can assign the selection options by an Object which presented as { 0: 'good', 1: 'bad' ... } NumberFilter: you can assign a number range by an array which presented as [1,2,3,4...] cleanNameFilter = () => { this.refs.name.cleanFiltered(); // this.refs.name is the reference to name column } render() { return ( <BootstrapTable data={ products }> <TableHeaderColumn dataField='id' isKey>Product ID</TableHeaderColumn> <TableHeaderColumn ref='name' dataField='name' filter={ { type: 'TextFilter', delay: 1000 } }>Product Name</TableHeaderColumn> <TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn> </BootstrapTable> ); }