React Table过滤后无数据时表头宽度异常变化解决方案求助
解决方案:React-Table空数据时表头宽度收缩问题
我之前也碰到过react-table在筛选后无数据时表头宽度收缩的情况,本质就是你分析的——tbody为空后,表头失去了tbody单元格的宽度参照。结合你的代码,这里有两个直接有效的解决办法:
方案一:给表头列直接绑定对应宽度(最直接的CSS修复)
你现在的SCSS只给tbody的td设置了min-width,但thead的th只有第4列(Task Title)设置了min-width,其他列的表头没有宽度约束。只要让表头的th和tbody的td使用一致的宽度规则,就能确保空数据时表头不会收缩。
修改你的SCSS代码:
table { width: 100%; thead { position: sticky; top: 0; background-color: white; tr { text-align: left; text-transform: uppercase; color: #91a4c3; font-weight: 400; font-size: 12px; th { padding-left: 10px; padding-bottom: 10px; // 添加这部分:给表头对应列设置min-width,和tbody单元格对齐 &.id-header, &.category-header, &.subcategory-header, &.priority-header, &.status-header, &.type-header { min-width: 140px; } &.summary-header { min-width: 360px; } // 原有样式... .sort-container { margin-left: 25px; position: absolute; } .filter-container { margin-left: 30px; position: absolute; } .icon-can-sort, .filter-component-hide { display: none; } .filter-component-show { display: block; } &:hover { .icon-can-sort, .filter-component-hide { display: block; } } @include relative(); } } } // 原有tbody样式不变... tbody { overflow-y: auto; @include scrollBar(); tr { box-shadow: 0px 1px 5px 0 rgba(104, 105, 111, 0.09); height: 45px; color: #6a7097; text-transform: capitalize; td { padding-left: 10px; } .id-cell, .category-cell, .subcategory-cell, .priority-cell, .status-cell, .type-cell { min-width: 140px; } .summary-cell { min-width: 360px; } } } }
然后在列配置中给每个表头添加对应的类名:
比如ID列:
{ Header: 'ID', accessor: 'key', className: 'id-header', // 添加这个类名 // 原有Filter、Cell配置... }
Category列添加className: 'category-header',以此类推,Task Title列添加className: 'summary-header',Task Type列添加className: 'type-header'。
这样表头和单元格的宽度规则完全一致,不管tbody有没有数据,表头都会保持固定宽度。
方案二:添加空数据占位行(保持表格结构完整性)
如果不想修改太多CSS,可以在tbody为空时渲染一个占位行,让表格始终保持完整的行列结构,这样表头就有了宽度参照。
修改你的TaskManagerTable组件的tbody部分:
<tbody {...getTableBodyProps}> {rows.length > 0 ? ( rows.map(row => { prepareRow(row) const {key, ...restRowProps} = row.getRowProps(); return ( <tr key={key} {...restRowProps}> {row.cells.map(cell => { const {key, ...restCellProps} = cell.getCellProps(); return ( <td key={key} {...restCellProps}> {cell.render('Cell')} </td> ); })} </tr> ) }) ) : ( // 空数据时渲染占位行 <tr className={CLASS_NAMES.EMPTY_ROW}> {headerGroups[0].headers.map((column, index) => { // 根据列的accessor匹配对应的单元格类名 let cellClass = ''; switch(column.accessor) { case 'key': cellClass = CLASS_NAMES.ID_CELL; break; case 'category': cellClass = CLASS_NAMES.CATEGORY_CELL; break; case 'subCategory': cellClass = CLASS_NAMES.SUBCATEGORY_CELL; break; case 'summary': cellClass = CLASS_NAMES.SUMMARY_CELL; break; case 'priority': cellClass = CLASS_NAMES.PRIORITY_CELL; break; case 'status': cellClass = CLASS_NAMES.STATUS_CELL; break; case 'type': cellClass = CLASS_NAMES.TYPE_CELL; break; default: cellClass = ''; } return <td key={index} className={cellClass}> </td> })} </tr> )} </tbody>
可选:给空行添加样式(让它看起来更友好)
在SCSS里添加:
.empty-row { height: 45px; color: #91a4c3; td { text-align: center; &:first-child { text-align: left; // 也可以合并单元格显示统一提示: // 把上面的map替换成:<td colspan={headerGroups[0].headers.length}>无匹配数据</td> } } }
这个方案的好处是不需要修改表头的CSS,通过保持tbody的结构完整性来让表头维持原有宽度,同时还能给用户显示空数据提示。
内容的提问来源于stack exchange,提问作者Monika
相关产品推荐
相关产品推荐

