vue3通过组合键实现换行操作的示例详解

 更新时间:2024年03月01日 11:18:42   作者:赵小川  
这篇文章主要为大家详细介绍了vue3如何通过组合键,例如command+Enter、shift+Enter、alt + Enter,实现换行操作,感兴趣的可以了解下

需求背景

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

效果图

原生使用Enter 换行

实现自定义组合键换行效果图

实现过程分析

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

代码实现

template模版

<el-input
        ref="editorRef"
        v-model="valueHtml"
        type="textarea"
        :rows="4"
        placeholder="请输入内容"
        @keydown="handleKeyDown"
      >
      </el-input>

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
  }
}

细节优化

组合键实现了换行,但是按下Enter 也会触发换行,要阻止掉他的默认行为

else if (event.key === 'Enter') {
    // 阻止掉 Enter 的默认换行行为
    event.preventDefault()
}

文本内容换行后,高度有限,需要自动滚动到最下面,保证内容始终可见

const editor = editorRef.value.textarea
editorRef.value.textarea.scrollTop = editor.scrollHeight

到此这篇关于vue3通过组合键实现换行操作的示例详解的文章就介绍到这了,更多相关vue3换行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue2 中如何实现动态表单增删改查实例

    vue2 中如何实现动态表单增删改查实例

    本篇文章主要介绍了vue2 中如何实现动态表单增删改查实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Vue使用watch同时监听多个值的实现方法示例

    Vue使用watch同时监听多个值的实现方法示例

    这篇文章主要为大家介绍了Vue中使用watch同时监听多个值的实现方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • vue实现商品详情页功能之商品选项卡

    vue实现商品详情页功能之商品选项卡

    这篇文章主要为大家详细介绍了vue实现商品详情页功能之商品选项卡,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • vue项目中播放rtmp视频文件流的方法

    vue项目中播放rtmp视频文件流的方法

    这篇文章主要介绍了vue项目中播放rtmp视频文件流 ,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • vue+elementUI的select下拉框回显为数字问题

    vue+elementUI的select下拉框回显为数字问题

    这篇文章主要介绍了vue+elementUI的select下拉框回显为数字问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • vue等框架对Tabs、Moda等设置固定高度后没有滚动条问题

    vue等框架对Tabs、Moda等设置固定高度后没有滚动条问题

    这篇文章主要介绍了vue等框架对Tabs、Moda等设置固定高度后没有滚动条问题,解决方法很简单,只需要一行简短代码就可以解决,下面小编给大家详细讲解,需要的朋友可以参考下
    2023-05-05
  • 使用vue深度选择器修改ElementUI组件内样式的示例代码

    使用vue深度选择器修改ElementUI组件内样式的示例代码

    在带有scoped属性的style中书写样式时,无法作用影响到子组件中的样式,此时我们会使用到deep深度选择器,来解决此问题,我们在使用less预处理器,能正常使用,但是在scss预处理器中会报错,下面通过本文介绍vue深度选择器修改ElementUI组件内样式,需要的朋友可以参考下
    2022-12-12
  • Vue实战记录之登陆页面的实现

    Vue实战记录之登陆页面的实现

    最近学习过程中常碰到让用户登录注册这种,这篇文章主要给大家介绍了关于Vue实战记录之登陆页面实现的相关资料,需要的朋友可以参考下
    2021-06-06
  • Vue ElementUI table实现表格斜线分隔线

    Vue ElementUI table实现表格斜线分隔线

    这篇文章主要为大家详细介绍了Vue ElementUI table实现表格斜线分隔线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • vue插件tab选项卡使用小结

    vue插件tab选项卡使用小结

    这篇文章主要为大家详细介绍了vue插件tab选项卡的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10

最新评论