# RichEditor组件实现自定义换行键

#### 问题现象

在2in1设备上，将Enter键功能设置为非换行类型后，对于RichEditor类的输入组件，如何将Shift+Enter组合键设为换行功能？

#### 背景知识

ArkUI提供的文本输入组件有TextArea、TextInput、RichEditor、Search等。这些组件均具有enterKeyType属性，用于设置输入法回车键类型。按键事件是组件通用事件，可以监听键盘的输入按键进行处理。

#### 解决方案

使用onKeyPreIme监听按键事件，该方法返回值为true时，视作该按键事件已被消费，后续的事件回调不会触发。在按键事件中监听Shift和Enter，实现Shift+Enter按下为换行的逻辑。上述文本输入组件的实现方式相同，示例代码以TextArea为例：Shift+Enter为换行，Enter将清空TextArea并在Text中显示内容。

```
import { KeyCode } from '@kit.InputKit';

@Entry
@Component
struct ShiftEnterNewline {
  @State texts: Array<string> = [];
  @State text: string = '';
  private isShiftPressed: boolean = false;

  build() {
    Column({ space: 12 }) {
      ForEach(this.texts, (item: string) => {
        Text(item)
          .padding({
            left: '12vp',
            top: '4vp',
            right: '12vp',
            bottom: '4vp'
          })
          .width('90%')
          .borderRadius('12vp')
          .backgroundColor('#F1F3F5');
      }, (item: string) => item);
      TextArea({ text: $$this.text, placeholder: '请输入内容' })
        .onChange((value: string) => {
          this.text = value; // 同步输入框中的文本
        })
        .onKeyPreIme((event: KeyEvent) => {
          const keyCode: KeyCode = event.keyCode; // 获取按键码
          // 监听Shift键
          if (keyCode === KeyCode.KEYCODE_SHIFT_LEFT || keyCode === KeyCode.KEYCODE_SHIFT_RIGHT) {
            this.isShiftPressed = (event.type === KeyType.Down); // 记录Shift按下的状态
            return true;
          }
          // 监听Enter键
          if ((keyCode === KeyCode.KEYCODE_ENTER || keyCode === KeyCode.KEYCODE_NUMPAD_ENTER) &&
            event.type === KeyType.Down) {
            if (this.isShiftPressed) {
              // shift+enter的处理逻辑
              this.text += '\n'; // 添加换行符
            } else {
              // 只按下enter的处理逻辑
              this.texts.push(this.text);
              this.text = '';
              return true;
            }
          }
          return false;
        })
        .width('90%')
        .height(100);
    }.padding({ top: 12 })
    .width('100%').height('100%');
  }
}
```

此方法适用于物理键盘输入，不适用于虚拟键盘。