首页 > 解决方案 > 当 React AgGrid 中的数据更改时更改状态栏组件

问题描述

当道具更改时,我需要更改我在自定义状态栏中显示的值。所以假设我得到了:

const CustomGrid = ({
   data, lastUpdate, framweworkComponents, columns
}) => {

  const [gridApi, setGridApi] = useState(null);
  const [gridColumnApi, setGridColumnApi] = useState(null);
  const [gridParams, setGridParams] = useState(null);

  const onGridReady = (params) => {
     setGridApi(params.api);
     setGridColumnApi(params.columnApi);
     setGridParams(params);
  }
 };

  
  const renderLastUpdateStatusBar = () => (
      <div>
         {lastUpdate}
      </div>
  );

  return(
    <div className={theme || 'ag-theme-balham'} style={style}>
      <AgGridReact
        modules={AllModules}
        onGridReady={onGridReady}
        columnDefs={columns}
        rowData={data}
        defaultColDef={defaultColDef || {
          resizable: true,
          menuTabs: [],
        }}
        frameworkComponents={{
          ...frameworkComponents,
          lastUpdateStatusBarComponent: renderLastUpdateStatusBar,
        }}
        statusBar={{
          statusPanels: [
            {
              statusPanel: 'lastUpdateStatusBarComponent',
              key: 'lastUpdateStatusBarKey',
              align: 'left',
            },
          ],
        }
      />
    </div>

 )
}

当“lastUpdate”更改时,它会正确传递给 CustomGrid 组件,但状态栏不会重新呈现,所以我永远看到第一个值。我的目标是在每次“lastUpdate”更改时更新状态栏。我尝试创建一个包含我的框架组件的状态,并在 lastUpdate 更改时将其设置为 useEffect,然后将此状态放入 agGrid 中的 frameworkComponents 道具中,但它不起作用:

  const [frameworkC, setFrameworkC] = useState(null);

  useEffect(() => {
    setFrameworkC({
      ...frameworkComponents,
      lastUpdateStatusBarComponent: renderLastUpdateStatusBar,
    })
  }, [lastUpdate]);

  ...
  <AgGridReact
     ...
     frameworkComponents={frameworkC}
     ...
  >

我还尝试在 onGridReady 函数中设置此状态,结果相同。我也试过在useState中调用api.redrawRows(gridParams),没办法。

是否有一些 API 可以用来更新状态栏组件?或者一些任何方法?

标签: javascriptreactjsecmascript-6ag-grid-react

解决方案


您需要为要重新渲染的组件添加密钥

 <AgGridReact
        key={lastUpdate}
        modules={AllModules}
        onGridReady={onGridReady}
        columnDefs={columns}
        rowData={data}
        defaultColDef={defaultColDef || {
          resizable: true,
          menuTabs: [],
        }}
        frameworkComponents={{
          ...frameworkComponents,
          lastUpdateStatusBarComponent: renderLastUpdateStatusBar,
        }}
        statusBar={{
          statusPanels: [
            {
              statusPanel: 'lastUpdateStatusBarComponent',
              key: 'lastUpdateStatusBarKey',
              align: 'left',
            },
          ],
        }
      />

推荐阅读