[javascript] Draft.js를 이용한 엔터 키와 백스페이스 키의 동작 제어하기

Draft.js는 React 기반의 풍부한 기능을 제공하는 웹 텍스트 편집기입니다. 이 편집기를 사용하면 엔터 키와 백스페이스 키의 동작을 커스터마이징할 수 있습니다. 이 글에서는 Draft.js를 이용하여 엔터 키와 백스페이스 키의 동작을 제어하는 방법에 대해 알아보겠습니다.

엔터 키의 동작 제어하기

Draft.js에서 엔터 키의 기본 동작은 새로운 블록을 생성하고 커서를 그 블록으로 이동시키는 것입니다. 때로는 이 동작을 변경하고 싶을 수 있는데, 예를 들어 Shift + 엔터 키를 눌렀을 때 새로운 블록을 생성하고 아닌 경우에는 줄바꿈을 수행하도록 하고 싶을 수 있습니다.

이를 구현하기 위해서는 Draft.js에서 제공하는 keyBindingFn 함수를 사용해야 합니다. 이 함수는 키 입력 이벤트를 받아서 해당 키의 동작을 제어하는데 사용됩니다. 다음은 엔터 키를 눌렀을 때의 동작을 커스터마이징하는 예제 코드입니다.

const handleKeyCommand = (command, editorState) => {
  if (command === 'my-custom-enter') {
    // 새로운 블록 생성 로직 작성
    return 'handled';
  }
  return 'not-handled';
};

const keyBindingFn = (e) => {
  if (e.keyCode === 13 && e.shiftKey) {
    return 'my-custom-enter';
  }
  return getDefaultKeyBinding(e);
};

// Editor 컴포넌트에서 keyBindingFn 함수와 handleKeyCommand 함수를 props로 전달
<Editor
  keyBindingFn={keyBindingFn}
  handleKeyCommand={handleKeyCommand}
/>

위 코드에서 keyBindingFn 함수는 shift + 엔터 키를 눌렀을 때 ‘my-custom-enter’를 반환하도록 설정하고, handleKeyCommand 함수에서는 ‘my-custom-enter’ 명령에 대한 로직을 작성하면 됩니다.

백스페이스 키의 동작 제어하기

백스페이스 키의 동작을 제어하는 방법도 비슷합니다. 예를 들어, 백스페이스 키를 눌렀을 때 특정 조건을 만족하지 않으면 삭제를 막고 싶을 수 있습니다.

Draft.js에서 제공하는 keyBindingFn 함수와 handleKeyCommand 함수를 이용하여 백스페이스 키의 동작을 제어할 수 있습니다. 다음은 백스페이스 키를 눌렀을 때의 동작을 커스터마이징하는 예제 코드입니다.

const handleKeyCommand = (command, editorState) => {
  if (command === 'my-custom-backspace') {
    // 삭제 로직을 수행하기 전에 특정 조건을 체크
    if (myCheckCondition()) {
      // 삭제 로직 작성
      return 'handled';
    } else {
      return 'not-handled';
    }
  }
  return 'not-handled';
};

const keyBindingFn = (e) => {
  if (e.keyCode === 8) {
    return 'my-custom-backspace';
  }
  return getDefaultKeyBinding(e);
};

// Editor 컴포넌트에서 keyBindingFn 함수와 handleKeyCommand 함수를 props로 전달
<Editor
  keyBindingFn={keyBindingFn}
  handleKeyCommand={handleKeyCommand}
/>

위 코드에서 keyBindingFn 함수는 백스페이스 키를 눌렀을 때 ‘my-custom-backspace’를 반환하도록 설정하고, handleKeyCommand 함수에서는 ‘my-custom-backspace’ 명령에 대한 로직을 작성하면 됩니다. 특정 조건을 만족하지 않는 경우 ‘not-handled’를 반환하면 삭제 동작이 막히게 됩니다.

Draft.js를 사용하면 엔터 키와 백스페이스 키의 동작을 자유롭게 커스터마이징할 수 있습니다. 위 예제 코드를 참고하여 필요한 동작을 제어해보세요!