vue3 中组合键 command+Enter / shift+Enter / alt + Enter 实现换行,详细实现

vue3 中组合键实现换行

需求背景

  • 有一个聊天室功能,采用输入框的形式,输入完毕使用Enter可以直接进行发送 。使用一些组合键 比如 command+Enter / shift+Enter / alt + Enter ... 可以实现换行操作 。但现实的情况是,原生 Enter 天然支持换行,但是我们需要阻止掉。但是组合键又需要自己去实现换行

效果图

  • 原生使用Enter 换行
  • 实现自定义组合键换行效果图

实现过程分析

  1. 根据需求定义组合键 Map
  2. 换行是根据光标位置进行换行,所以首先要获取到光标的位置
  3. 根据光标的位置,拆分成两段文本
  4. 合并两端文本为带有换行符的新文本
  5. 重新设置光标位置

代码实现

  • template模版
js 复制代码
<el-input
        ref="editorRef"
        v-model="valueHtml"
        type="textarea"
        :rows="4"
        placeholder="请输入内容"
        @keydown="handleKeyDown"
      >
      </el-input>

js逻辑

js 复制代码
import { ref, nextTick } from 'vue'
const currentEvent = ref()
const valueHtml = ref('')
const editorRef = ref()

const handleKeyDown = ($event: Event) => {
  const event = $event as KeyboardEvent
  currentEvent.value = event.target as HTMLInputElement
  // 定义组合键 Map
  const shortCutKeys: (keyof KeyboardEvent)[] = ['metaKey', 'altKey', 'ctrlKey', 'shiftKey']
  const isEnterKey = event.key === 'Enter'
  const isShortcutKeys = shortCutKeys.some((item) => event[item])
  if (isEnterKey && isShortcutKeys) {
    // 获取光标位置
    const cursorPosition = currentEvent.value.selectionStart

    // 拆分成两段文本
    const textBeforeCursor = valueHtml.value.slice(0, cursorPosition)
    const textAfterCursor = valueHtml.value.slice(cursorPosition)

    // 合并为带有换行符的新文本
    const newText = textBeforeCursor + '\n' + textAfterCursor

    // 更新输入框的值
    valueHtml.value = newText
    // 文本编辑器的高度发生变化后
    nextTick(() => {
      // 高度变化 自动滚动到底部
      const editor = editorRef.value.textarea
      editorRef.value.textarea.scrollTop = editor.scrollHeight
      // 设置光标位置为: start 和 end 相同,光标会移动到换行符后面的新行首
      currentEvent.value.setSelectionRange(cursorPosition + 1, cursorPosition + 1)
    })
  } else if (event.key === 'Enter') {
    // 阻止掉 Enter 的默认换行行为
    event.preventDefault()
    // do yourself things for example  send
  }
}

细节优化

  1. 组合键实现了换行,但是按下Enter 也会触发换行,要阻止掉他的默认行为
js 复制代码
else if (event.key === 'Enter') {
    // 阻止掉 Enter 的默认换行行为
    event.preventDefault()
}
  1. 文本内容换行后,高度有限,需要自动滚动到最下面,保证内容始终可见
js 复制代码
const editor = editorRef.value.textarea
editorRef.value.textarea.scrollTop = editor.scrollHeight
相关推荐
Summer不秃2 分钟前
Flutter之使用mqtt进行连接和信息传输的使用案例
前端·flutter
旭日猎鹰6 分钟前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
Viktor_Ye13 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm15 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
乐闻x42 分钟前
Vue.js 性能优化指南:掌握 keep-alive 的使用技巧
前端·vue.js·性能优化
一条晒干的咸魚43 分钟前
【Web前端】创建我的第一个 Web 表单
服务器·前端·javascript·json·对象·表单
花海少爷1 小时前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript
Amd7941 小时前
Nuxt.js 应用中的 webpack:compiled 事件钩子
前端·webpack·开发·编译·nuxt.js·事件·钩子
生椰拿铁You1 小时前
09 —— Webpack搭建开发环境
前端·webpack·node.js
狸克先生1 小时前
如何用AI写小说(二):Gradio 超简单的网页前端交互
前端·人工智能·chatgpt·交互