Мой вопрос в первую очередь вращается вокруг этого утверждения в документах w.r.t. компонент реакции:
Параметры cellEditor
onKeyDown Обратный вызов, чтобы сообщить сетке, что была нажата клавиша - полезно для передачи событий управляющих клавиш (табуляция, стрелки и т. д.) обратно в сетку - однако вам не нужно вызывать это, поскольку сетка уже прослушивает события по мере их распространения. Это требуется только в том случае, если вы предотвращаете распространение события.
Я понимаю, что параметры cellEditor существуют как реквизиты, передаваемые в ответную версию компонента, но я не могу найти, как подключиться к onKeyDown, как указано в документации. В моем конструкторе для моего cellEditor функция onKeyDown существует и соответствует onKeyDown
, указанному в cellEditorParams
внутри моего определения столбца (если он существует).
constructor(props) {
super(props);
// console.log(typeof props.onKeyDown == 'function') => 'true'
}
Но он никогда не достигается, если он просто существует в компоненте
onKeyDown(event) {
console.log('not reached');
}
Он вызывается, если я помещаю onKeyDown={this.props.onKeyDown}
внутри div верхнего уровня, обертывающего мой ввод, но он все равно не ловит нажатие Enter.
Я попытался прослушать ячейку, содержащую мой пользовательский редактор ячеек
this.props.eGridCell.addEventListener('keyup', (event) => {
console.log(event.keyCode === 13)
})
Какой фиксирует нажатие ввода, но, кажется, отключается при нажатии ввода, прежде чем я смогу зафиксировать последнее нажатие ввода внутри поля? Я видел поведение, когда это тоже не работает, поэтому я очень запутался.
В настоящее время у меня есть простой редактор ячеек MyCellEditor, в котором я пытаюсь сфокусироваться и выбрать следующую ячейку при нажатии клавиши ввода в дополнение к простой вкладке. У меня уже есть возможность извлечь нужные мне свойства rowIndex
и column
из rowRenderer в this.props.api.rowRenderer
, которые я затем использую, например:
this.props.api.rowRenderer.moveFocusToNextCell(rowIndex, column, false, false, true);
Моя проблема в том, где предотвратить распространение события по умолчанию при нажатии Enter.
Ниже мой редактор ячеек и его использование.
import React from 'react';
import _ from 'lodash';
class MyCellEditor extends React.Component {
constructor(props) {
super(props);
this.state = {
value: props.value,
};
}
getValue() {
return this.state.value;
}
isPopup() {
return false;
}
isCancelBeforeStart() {
return false;
}
afterGuiAttached() {
const eInput = this.input;
eInput.focus();
eInput.select();
}
onKeyDown(event) {
// Never invoked!
}
onChangeListener = (e) => {
this.setState({ value: e.target.value });
}
render() {
return (
<input
ref={(c) => { this.input = c; }}
className="ag-cell-edit-input"
type="text"
value={this.state.value}
onChange={this.onChangeListener} />
);
}
}
export default MyCellEditor;
Определение столбца:
columnDefs = [{
headerName: 'CustomColumn',
field: 'customField',
editable: true,
cellClass: 'grid-align ag-grid-shop-order-text',
sortable: false,
cellEditorFramework: MyCellEditor,
// Do I need cellEditorParams?
cellEditorParams: {
// onKeyDown: (event) => console.log('does not output')
}
},
...
}
Реагировать:
<AgGridReact
columnDefs={columnDefs}
rowData={this.props.rows}
enableColResize="false"
rowSelection="single"
enableSorting="false"
singleClickEdit="true"
suppressMovableColumns="true"
rowHeight="30"
// onKeyDown also does nothing here
onGridReady={this.onGridReady}
onGridResize={() => console.log('grid resized')}
onColumnResize={() => console.log('column resized')} />