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