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

Vue實現(xiàn)輸入框@功能的示例代碼

 更新時間:2022年05月06日 10:54:30   作者:諸葛小愚  
這篇文章主要為大家介紹了如何利用Vue實現(xiàn)輸入框@功能,文中的示例代碼講解詳細,對我們學習Vue有一定的幫助,感興趣的可以學習一下

前言

前幾篇文章中分別介紹了如何實現(xiàn)聊天輸入框的雙向綁定、回車鍵發(fā)送、粘貼文本圖片等功能,本著完善輸入框的目的,文本重點介紹聊天框如何實現(xiàn)@功能。

文章回顧:

Vue實現(xiàn)contenteditable元素雙向綁定的方法詳解

Vue實現(xiàn)輸入框回車發(fā)送和粘貼文本與圖片功能

首先需要先理清思路:

  • 成員列表組件,需要根據光標的位置調整,點擊成員項時回調成員信息
  • 獲取光標的位置坐標(x值,y值)
  • 輸入框失焦時記錄光標
  • 成員列表回調時,將成員信息插入到光標位置,在此之前需要先恢復之前的光標
  • 將光標移動到新的位置

既然有了思路,那么就可以一步一步實現(xiàn)。

成員列表

創(chuàng)建

實現(xiàn)成員列表的方式比較簡單,其實就是一個列表,一個簡單的v-for循環(huán)就可以搞定,點擊時將當前選擇的成員項回調給父組件。

新增一個AtPop.vue文件:

<template>
  <div class="at-pop-index">
    <div v-for="(item, index) in listData" :key="index" class="at-pop-item" @click.stop="clickItem(item)">{{item.name}}</div>
  </div>
</template>
<script>
export default {
  props: {
    // 傳入需要被@的成員數(shù)組
    listData: {
      type: Array,
      default: () => []
    }
  },
  methods: {
    clickItem(item) {
      this.$emit('onSelect', item); // 調用父組件處理成員選擇的方法,并回傳當前選擇項
    }
  }
}
</script>

使用

在父組件中,注冊并使用成員列表組件。我們需要在用戶輸入@的時候彈出成員列表,因此需要監(jiān)聽用戶的輸入,然后在用戶選擇成員后需要關閉。關鍵是獲取光標位置,這個由輸入框獲取,在父組件只需要使用即可。

// 核心代碼
...
// 選擇成員時插入數(shù)據,并關閉彈窗
onSelect(item) {
    console.log('onSelect', item);
    this.$refs.inputBox.insertContent(`${item.name} `); // 有空格
    this.isShowAt = false;
},
// 輸入框輸入時回調函數(shù)
inputFunc(data, event) {
    console.log('inputFunc', data, event);
    if (event.data === '@') {
        this.isShowAt = true; // 顯示彈窗
        this.$nextTick(() => {
        let dom = document.getElementsByClassName('at-pop-index')[0]; // 獲取成員列表彈窗,需要放在nextTick中
        // 設置位置
        dom.style.position = 'fixed';
        dom.style.left = Math.floor(data.left + 10) + 'px';
        dom.style.top = Math.floor(data.top) + 'px';
        dom.style.zIndex = 9999;
        })
    } else {
        this.isShowAt = false;
    }
},
...

輸入框

輸入框需要處理光標位置的獲取、將值插入到光標的位置等,是本次功能實現(xiàn)的核心。

當輸入框聚焦時,我們會看到光標閃動,想要獲取光標的位置以便于插入數(shù)據,則需要借助Selection對象。Selection表示用戶選擇的一段文本范圍或者插入數(shù)據的當前位置。既然是獲取選取范圍,那當前選擇范圍的index=0就是當前光標的位置。我們想要實現(xiàn)的效果是成員列表跟隨光標移動,因此就需要獲取光標的坐標值。

獲取光標的坐標

let range = window.getSelection().getRangeAt(0); // 獲取當前光標
let position = range.getBoundingClientRect(); // 獲取當前光標的位置

getBoundingClientRect()方法會返回一個DOMRect矩形對象,其包含矩形區(qū)域的坐標值。將獲取到的坐標值回調給父組件的方法,顯示成員列表。

當我們在輸入框輸入@的時候,頁面會出現(xiàn)成員列表,此時輸入框還是聚焦的。但是如果我們點擊了成員列表的某一項,此時輸入框已經失焦了,雖然我們可以獲取選擇的成員并插入,如果只是簡單的字符串追加的話,光標會在下次輸入時默認定位到開頭;或者我們需要在中間插入選擇的成員,會發(fā)現(xiàn)沒有位置可以插入。因此我們需要在失焦的時候先保存當前光標,并在插入時還原光標。

保存光標

// DivEditable.vue
// 失焦
inputBlur(event) {
    this.selection = this.saveSelection();
    this.$emit('blurFunc', event);
},
// 失焦時保存光標
saveSelection() {
    if (!window.getSelection) {
        return null;
    }
    let sel = window.getSelection();
    if (sel.getRangeAt && sel.rangeCount) {
        return sel.getRangeAt(0);
    }
},

光標暫存了,我們需要將插入成員封裝成方法,并可以給父組件調用,這樣父組件在獲取到成員信息后就可以直接調用。接下來需要使用上面已經保存的光標位置:

插入文本

// DivEditable.vue
// 恢復光標
restoreSelection(range) {
    if (range) {
        let sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    }
},
// 插入數(shù)據
insertContent(value) {
    // this.$refs.editor.focus();
    let range, node;
    this.restoreSelection(this.selection); // 還原失焦前的光標位置
    range = window.getSelection().getRangeAt(0);
    range.collapse(false); // 光標移動到最后
?
    node = range.createContextualFragment(value);
    let child = node.lastChild;
    console.log('lastChild', child);
    range.insertNode(node);
    // 將光標的起始位置設置在當前插入的元素后面
    if (child) {
        range.setEndAfter(child);
        range.setStartAfter(child);
    }
?
    let sel = window.getSelection();
    sel.removeAllRanges();
    sel.addRange(range);
    this.$emit('input', this.$refs.editor.innerHTML);
},

其實到這里就基本實現(xiàn)了@功能,但是還有一個問題,當輸入框失焦時回調了父組件的blurFunc方法,導致成員列表關閉了,但是數(shù)據還沒有拿到。處理這種問題,有兩種思路:

  • 使用setTimeout設置定時器,延后執(zhí)行關閉成員列表操作
  • 修改取數(shù)邏輯為異步操作,等到數(shù)據拿到后才關閉成員列表

簡單點,就采用setTimeout實現(xiàn)。

// InputBox.vue
blurFunc(event) {
    // 失焦時延時關閉彈窗,避免還未拿到數(shù)據
    if (this.isShowAt) {
        setTimeout(() => {
            this.isShowAt = false;
        }, 500);
    }
},

運行結果

輸入框輸入@,在光標位置附近彈出成員列表

選擇成員后,將成員信息插入到輸入框中

總結

本文介紹了實現(xiàn)輸入框@功能的方法,簡單易上手

主要使用了SelectionRange對象的相關方法,完成對光標的處理以及輸入的插入

本文實現(xiàn)的@功能,無法刪除時整體刪除。目前有兩種思路:將@xxx轉換為圖片并插入到輸入框,筆者簡單寫了demo驗證了一下,效率不高,且會有卡頓;另一種方式就是監(jiān)聽退格鍵,刪除時判斷刪除對象是否被包含著有意義的@xxx中,如果是則整體刪除,如果不是則默認的方式刪除,這種方式筆者沒有嘗試,難度比較大。

至此,輸入框的功能就基本完善了。需要看完整代碼的可移步 項目地址

以上就是Vue實現(xiàn)輸入框@功能的示例代碼的詳細內容,更多關于Vue輸入框@功能的資料請關注腳本之家其它相關文章!

相關文章

  • Vue 3 + Element Plus 封裝單列控制編輯的可編輯表格組件的方法

    Vue 3 + Element Plus 封裝單列控制編輯的可編輯表格

    在Web應用開發(fā)中實現(xiàn)表格數(shù)據編輯功能至關重要,本文將詳細介紹如何使用Vue3和ElementPlus庫來構建一個支持單列編輯的表格組件,本教程詳細闡述了組件創(chuàng)建過程和數(shù)據綁定機制,幫助你快速掌握Vue3中表格編輯功能的實現(xiàn),感興趣的朋友一起看看吧
    2024-09-09
  • Vue中實現(xiàn)深度監(jiān)聽的方法小結

    Vue中實現(xiàn)深度監(jiān)聽的方法小結

    在Vue中,深度監(jiān)聽是一種非常常見且重要的功能,它可以讓我們監(jiān)聽對象內部的所有屬性,并對這些屬性的變化做出相應的處理,在本篇博客中,我將為大家介紹Vue中如何實現(xiàn)深度監(jiān)聽的方法,需要的朋友可以參考下
    2024-09-09
  • Vue應用qs插件實現(xiàn)參數(shù)格式化示例詳解

    Vue應用qs插件實現(xiàn)參數(shù)格式化示例詳解

    這篇文章主要為大家介紹了Vue應用qs插件實現(xiàn)參數(shù)格式化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • vue中非父子組件的通信你了解嗎

    vue中非父子組件的通信你了解嗎

    這篇文章主要為大家詳細介紹了vue中非父子組件通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • vue 路由視圖 router-view嵌套跳轉的實現(xiàn)

    vue 路由視圖 router-view嵌套跳轉的實現(xiàn)

    這篇文章主要介紹了vue 路由視圖 router-view嵌套跳轉,主要實現(xiàn)的內容有制作一個登錄頁面,跳轉到首頁,首頁包含菜單欄、頂部導航欄、主體,標準的后臺網頁格式,菜單點擊顯示不同的頁面,感興趣的小伙伴請參考下面文章內容
    2021-09-09
  • 手寫?Vue3?響應式系統(tǒng)(核心就一個數(shù)據結構)

    手寫?Vue3?響應式系統(tǒng)(核心就一個數(shù)據結構)

    這篇文章主要介紹了手寫?Vue3?響應式系統(tǒng)(核心就一個數(shù)據結構),響應式就是被觀察的數(shù)據變化的時候做一系列聯(lián)動處理。就像一個社會熱點事件,當它有消息更新的時候,各方媒體都會跟進做相關報道。這里社會熱點事件就是被觀察的目標
    2022-06-06
  • vue+antDesign實現(xiàn)樹形數(shù)據展示及勾選聯(lián)動

    vue+antDesign實現(xiàn)樹形數(shù)據展示及勾選聯(lián)動

    本文主要介紹了vue+antDesign實現(xiàn)樹形數(shù)據展示及勾選聯(lián)動,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • 如何使用Webstorm和Chrome來調試Vue項目

    如何使用Webstorm和Chrome來調試Vue項目

    這篇文章主要介紹了如何使用Webstorm和Chrome來調試Vue項目,對Vue感興趣的同學,一定要看一下
    2021-05-05
  • Vue中的父子組件通訊以及使用sync同步父子組件數(shù)據

    Vue中的父子組件通訊以及使用sync同步父子組件數(shù)據

    這篇文章主要介紹了Vue中的父子組件通訊以及使用sync同步父子組件數(shù)據,對vue感興趣的同學,可以參考下
    2021-04-04
  • Vue-cli 移動端布局和動畫使用詳解

    Vue-cli 移動端布局和動畫使用詳解

    這篇文章主要介紹了Vue-cli和移動端布局和動畫使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論

阿城市| 炉霍县| 惠东县| 长葛市| 阜城县| 枣强县| 布拖县| 石楼县| 简阳市| 新化县| 玛纳斯县| 崇仁县| 富裕县| 西和县| 长葛市| 平乐县| 宽城| 洛宁县| 五大连池市| 元阳县| 瓮安县| 茌平县| 常德市| 新竹县| 闸北区| 习水县| 合作市| 炎陵县| 杂多县| 娱乐| 通山县| 屏南县| 车险| 揭阳市| 延川县| 淮北市| 阜平县| 锦州市| 阿拉善右旗| 东城区| 岳普湖县|