В вашем компоненте ShowMore вы можете изменить обработчик событий onClick
так, чтобы он вызывал event.stopPropagation()
. Это остановит дальнейшее распространение текущего события в фазах захвата и всплытия и позволит вам нажать Показать больше / меньше без запуска выбора строки.
const toggleTruncate = (e) => {
e.stopPropagation();
setShowMore(!isShowMore);
}
React фактически определяет событие syntheti c, который будет доступен в вашем обработчике событий click, без необходимости вызывать document.addEventListener()
. Вы можете прочитать больше об обработке событий в React через здесь .
И ответить на вашу вторую часть вопроса, учитывая, что событие rowClicked
является необязательным реквизитом компонента DataGrid
вам нужно будет вручную проверить его на компоненте DataGrid
, чтобы убедиться, что он будет вызываться только в том случае, если он определен. Вот как это можно сделать:
if (rowClicked) {
// do the rest
}
И так должен выглядеть ваш метод rowClick
. Обратите внимание, что у меня деструктурированный объект реквизита во второй строке. Это обеспечит выполнение логи выбора строки c, только если определено rowClicked
.
rowClick = (state, rowInfo) => {
const { rowClicked } = this.props;
if (rowInfo && rowClicked) {
let selectedRows = new Set();
return {
onClick: e => {
e.stopPropagation();
if (e.ctrlKey) {
selectedRows = this.state.selectedRows;
rowInfo._index = rowInfo.index;
if (
selectedRows.filter(row => row._index === rowInfo._index)
.length === 0
)
selectedRows.push(rowInfo);
else
selectedRows = selectedRows.filter(
row => row._index !== rowInfo._index
);
this.setState({
selectedRows
});
} else {
selectedRows = [];
rowInfo._index = rowInfo.index;
selectedRows.push(rowInfo);
}
this.setState(
{
selectedRows
},
() => {
rowClicked(this.state.selectedRows);
}
);
},
style: {
background:
this.state.selectedRows.some(e => e._index === rowInfo.index) &&
"#9bdfff"
}
};
} else {
return "";
}
};