vue3通過組合鍵實現(xiàn)換行操作的示例詳解
需求背景
有一個聊天室功能,采用輸入框的形式,輸入完畢使用Enter,可以直接進行發(fā)送。使用一些組合鍵 比如 command+Enter / shift+Enter / alt + Enter ... 可以實現(xiàn)換行操作。但現(xiàn)實的情況是,原生 Enter 天然支持換行,但是我們需要阻止掉。但是組合鍵又需要自己去實現(xiàn)換行
效果圖
原生使用Enter 換行
實現(xiàn)自定義組合鍵換行效果圖
實現(xiàn)過程分析
- 根據(jù)需求定義組合鍵 Map
- 換行是根據(jù)光標位置進行換行,所以首先要獲取到光標的位置
- 根據(jù)光標的位置,拆分成兩段文本
- 合并兩端文本為帶有換行符的新文本
- 重新設置光標位置
代碼實現(xiàn)
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 // 文本編輯器的高度發(fā)生變化后 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 } }
細節(jié)優(yōu)化
組合鍵實現(xiàn)了換行,但是按下Enter 也會觸發(fā)換行,要阻止掉他的默認行為
else if (event.key === 'Enter') { // 阻止掉 Enter 的默認換行行為 event.preventDefault() }
文本內容換行后,高度有限,需要自動滾動到最下面,保證內容始終可見
const editor = editorRef.value.textarea editorRef.value.textarea.scrollTop = editor.scrollHeight
到此這篇關于vue3通過組合鍵實現(xiàn)換行操作的示例詳解的文章就介紹到這了,更多相關vue3換行內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue前端開發(fā)輔助函數(shù)狀態(tài)管理詳解示例
vue的應用狀態(tài)管理提供了mapState、mapGetters、mapMutations、mapActions四個輔助函數(shù),所謂的輔助函數(shù)分別對State、Getters、Mutations、Actions在完成狀態(tài)的使用進行簡化2021-10-10Vue3中Transition和TransitionGroup組件的使用及說明
本文將深入探討這兩個組件的作用,以及如何在實際項目中靈活運用它們,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03