コミットはEditorContainerreact-data-grid
によって処理されます。コミット ロジックは単純です。エディターは、次の場合に値をコミットします。
- エディタがアンマウントします
- エンターが押された
- タブが押された
- 場合によっては、矢印が押されたとき (この部分はスキップしますが、必要ない場合があります。EditorContainer でこのロジックを確認できます)。
それに基づいて、自動保存を行うために推奨する方法は次のとおりです。
自動保存をオンにするエディターの EditorWrapper (HOC) を作成します。
const editorWrapper(WrappedEditor) => {
return class EditorWrapper extends Component {
constructor(props) {
base(props);
this._changeCommitted = false;
this.handleKeyDown.bind(this);
}
handleKeyDown({ key, stopPropagation }) {
if (key === 'Tab' || key === 'Enter') {
stopPropagation();
this.save();
this.props.onCommit({ key });
this._changeCommitted = true;
}
// If you need the logic for the arrows too, check the editorContainer
}
save() {
// Save logic.
}
hasEscapeBeenPressed() {
let pressed = false;
let escapeKey = 27;
if (window.event) {
if (window.event.keyCode === escapeKey) {
pressed = true;
} else if (window.event.which === escapeKey) {
pressed = true;
}
}
return pressed;
}
componentWillUnmount() {
if (!this._changeCommitted && !this.hasEscapeBeenPressed()) {
this.save();
}
}
render() {
return (
<div onKeyDown={this.handleKeyDown}>
<WrappedComponent {...this.props} />
</div>);
}
}
}
エディターをエクスポートするときは、EditorWrapper でそれらをラップするだけです
const Editor = ({ name }) => <div>{ name }</div>
export default EditorWrapper(Editor);