Рендеринг ячейки компонента AG grid react framwork не обновляет реквизит

#reactjs #ag-grid #ag-grid-react

#reactjs #ag-grid #ag-grid-реагировать

Вопрос:

Я создаю функциональный компонент react с помощью AgGridReact :

 const DataGrid = (props) =>
{                                                                           
   const [gridRowData, setGridRowData] = useState([]);
   const [columnDefinition, setColumnDefinition] = useState([]);

useEffect(async () =>
    {
      if(props.name amp;amp; props.name !== "")
      {
        ... get grid row data and column definition here according to props.name - working fine
      }
    },[props.name]);

let frameworkComponents = {
  customLoadingOverlay: LoadingOverlayTemplate,
      customNoRowsOverlay: UxDataGridCustomNoRows,
      editButton: params => <ViewAndDeleteSetting {...params}  
          openAddConfigurationsWindow={openAddConfigurationsWindow}
          onDeleteSetting={onDeleteSetting} />
};
.
.
.
const onDeleteSetting = async () =>
{
  console.log("ON DELETE AND NAME IS: "   props.name ); //PRINTS AN EMPTY STRING
   ...
}

return (
  <AgGridReact
            columnDefs={columnDefinition} 
            rowData={gridRowData} 
            frameworkComponents={frameworkComponents}/>
);
 

Как вы можете видеть в комментарии onDeleteSetting , имя пусто при вызове этого обратного вызова. Рендеринг самой ячейки в порядке и ViewAndDeleteSetting действительно отображается, просто кажется, что она отображается только один раз, а не каждый раз, когда меняется имя. Как я могу заставить внутренний ViewAndDeleteSetting компонент повторно отображаться с самым последним frameworkComponents ?

Комментарии:

1. ваша onDeleteSetting функция считывает реквизит компонента agGrid, поэтому, если вы не обновите весь компонент новыми реквизитами, печать имени будет такой же. я не совсем понимаю, почему вы думаете, что имя изменится, но, возможно, попробуйте добавить аргументы к onDeleteSetting методу ViewAndDeleteSetting компонента.

Ответ №1:

Проблема заключалась в том, как я пытался передать реквизит ViewAndDeleteSetting . Если вы хотите передать prop компоненту, отображаемому в ячейке, вы не должны делать это в frameworkComponents , а скорее вам нужно сделать это в определении столбца следующим образом:

 useEffect(() =>
{
  let columns = [{headerName: '', cellRenderer: 'editButton', width: 90, editable: false, 
                  cellRendererParams: {
                    openAddConfigurationsWindow: openAddConfigurationsWindow,
                    onDeleteSetting: onDeleteSetting
                }},
                .. other columns
                ]

  setColumnDefinition(columns);
},[props.name]);
 

Столбцы с cellRendererParams do воссоздаются useEffect при изменении имени, а затем компонент может регулярно обращаться к этим параметрам через свои реквизиты

Комментарии:

1. На какой версии ag-grid вы работаете?

2. @dsh только что установил его сегодня — 24.1.0

3. Я не думаю, что по своей сути невозможно передать реквизит frameworkComponent. Проблема заключалась в том, что ссылка была устаревшей и не обновлялась. Я думаю, вы должны быть в состоянии обойти это с помощью такого геттера, getFrameworkComponents(props) который будет динамически вычисляться при каждом рендеринге. Но ваше решение достигает той же цели.

4. Даже когда я использую useMemo, который в основном реализует запоминаемый геттер, как вы предложили, это не сработало