#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, который в основном реализует запоминаемый геттер, как вы предложили, это не сработало