最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3通過組合鍵實(shí)現(xiàn)換行操作的示例詳解

 更新時(shí)間:2024年03月01日 11:18:42   作者:趙小川  
這篇文章主要為大家詳細(xì)介紹了vue3如何通過組合鍵,例如command+Enter、shift+Enter、alt + Enter,實(shí)現(xiàn)換行操作,感興趣的可以了解下

需求背景

有一個(gè)聊天室功能,采用輸入框的形式,輸入完畢使用Enter可以直接進(jìn)行發(fā)送。使用一些組合鍵 比如 command+Enter / shift+Enter / alt + Enter ... 可以實(shí)現(xiàn)換行操作。但現(xiàn)實(shí)的情況是,原生 Enter 天然支持換行,但是我們需要阻止掉。但是組合鍵又需要自己去實(shí)現(xiàn)換行

效果圖

原生使用Enter 換行

實(shí)現(xiàn)自定義組合鍵換行效果圖

實(shí)現(xiàn)過程分析

  • 根據(jù)需求定義組合鍵 Map
  • 換行是根據(jù)光標(biāo)位置進(jìn)行換行,所以首先要獲取到光標(biāo)的位置
  • 根據(jù)光標(biāo)的位置,拆分成兩段文本
  • 合并兩端文本為帶有換行符的新文本
  • 重新設(shè)置光標(biāo)位置

代碼實(shí)現(xiàn)

template模版

<el-input
        ref="editorRef"
        v-model="valueHtml"
        type="textarea"
        :rows="4"
        placeholder="請(qǐng)輸入內(nèi)容"
        @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) {
    // 獲取光標(biāo)位置
    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
    // 文本編輯器的高度發(fā)生變化后
    nextTick(() => {
      // 高度變化 自動(dòng)滾動(dòng)到底部
      const editor = editorRef.value.textarea
      editorRef.value.textarea.scrollTop = editor.scrollHeight
      // 設(shè)置光標(biāo)位置為: start 和 end 相同,光標(biāo)會(huì)移動(dòng)到換行符后面的新行首
      currentEvent.value.setSelectionRange(cursorPosition + 1, cursorPosition + 1)
    })
  } else if (event.key === 'Enter') {
    // 阻止掉 Enter 的默認(rèn)換行行為
    event.preventDefault()
    // do yourself things for example  send
  }
}

細(xì)節(jié)優(yōu)化

組合鍵實(shí)現(xiàn)了換行,但是按下Enter 也會(huì)觸發(fā)換行,要阻止掉他的默認(rèn)行為

else if (event.key === 'Enter') {
    // 阻止掉 Enter 的默認(rèn)換行行為
    event.preventDefault()
}

文本內(nèi)容換行后,高度有限,需要自動(dòng)滾動(dòng)到最下面,保證內(nèi)容始終可見

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

到此這篇關(guān)于vue3通過組合鍵實(shí)現(xiàn)換行操作的示例詳解的文章就介紹到這了,更多相關(guān)vue3換行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

镇坪县| 福清市| 富平县| 南丰县| 临夏市| 荔浦县| 上栗县| 公主岭市| 霍邱县| 嘉善县| 湖州市| 突泉县| 乳源| 阳高县| 集贤县| 鄂尔多斯市| 巴彦县| 巩义市| 大英县| 太和县| 绥德县| 民县| 蒲江县| 四平市| 舟山市| 登封市| 武山县| 塘沽区| 清徐县| 攀枝花市| 九寨沟县| 四川省| 望城县| 原平市| 红安县| 苍山县| 馆陶县| 汾西县| 平阳县| 井冈山市| 利津县|