首先,常遇的一个棘手问题是:在使用 ExtJS 的 gridPanel 时,经常需要对 store 内的数据进行过滤操作,此时 gridPanel 自带的滚动条很容易突然失灵——无论你如何拖动,表格中的数据始终停留在最初那几行,无法滚动。

实际上,滚动条失效的根本原因在于:gridPanel 内部为滚动条预设了一个固定的列宽。当过滤导致数据动态变化时,这个预留列宽与实际内容无法匹配,滚动条便与真实数据“脱节”。至于更深层的机制,官方并未给出明确解释。早年在 ExtJS 论坛和 StackOverflow 上,许多开发者都曾反馈过类似问题,主要集中在 4.1 之前的版本。ExtJS 团队声称从 4.1 版本开始已经修复了此缺陷(本人未亲自验证,使用 4.1 版本的朋友可以尝试确认)。
那么,如果遇到这个问题,该如何绕过?
xtype: 'gridpanel',
// autoScroll:true,
scroll:false,
viewConfig: {
style: { overflow: 'auto', overflowX: 'hidden' }
}
核心解决思路是:关闭 autoScroll,将 scroll 设置为 false,然后在 viewConfig 中手动控制溢出行为——仅保留纵向滚动条,同时禁用横向滚动条。效果立竿见影:

仔细观察截图可以看到,滚动条不再独占一整列,而是紧贴在 grid 最后一列的旁边。这样一来,gridPanel 自带的滚动条就被彻底屏蔽,从而绕开了这个潜在的 bug。
当然,这种调整有一个前提条件:最好为所有列设定固定宽度,并加上 resizable: false 属性。否则,如果不小心拖拽列宽导致横向内容溢出,禁用横向滚动条反而会引发新的布局问题。
