欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年05月06日 10:39:27   作者:諸葛小愚  
contenteditable是所有HTML元素都有的枚舉屬性,表示元素是否可以被用戶編輯。本文將詳細(xì)介紹如何實(shí)現(xiàn)contenteditable元素的雙向綁定,需要的可以參考一下

前言

如何實(shí)現(xiàn)一個(gè)即時(shí)通訊的聊天頁(yè)面,網(wǎng)上有很多的開(kāi)源或不開(kāi)源的成品,可以直接使用,或者簡(jiǎn)單修改后使用。但在實(shí)際項(xiàng)目中,直接使用開(kāi)源的即時(shí)通訊往往不是我們想要的,如何自己開(kāi)發(fā)一個(gè)聊天頁(yè)面呢。本文就著學(xué)習(xí)的目的,從0開(kāi)始一步步實(shí)現(xiàn)一個(gè)聊天框的開(kāi)發(fā),至于消息的發(fā)送和接收,這個(gè)就得依靠后端大佬了。

在開(kāi)發(fā)前,首先得明確用什么來(lái)實(shí)現(xiàn)。用input輸入框和textare文本輸入肯定是不行的,這兩個(gè)只能輸入文本類數(shù)據(jù)(輸入法表情也算),想要在輸入框內(nèi)展示圖片、表情包或回復(fù)消息等復(fù)雜內(nèi)容時(shí)就不行了。靈光一閃,展示圖片這些用富文本不就好了,但仔細(xì)想想,使用富文本不就引入額外的組件了嘛。想要自己實(shí)現(xiàn)一個(gè)類似“富文本”輸入框,就需要借助contenteditable來(lái)實(shí)現(xiàn)。

本項(xiàng)目需要解決的問(wèn)題:

實(shí)現(xiàn)一個(gè)可輸入文本、圖片等復(fù)雜消息的輸入框

實(shí)現(xiàn)數(shù)據(jù)的“雙向綁定”

contenteditable

contenteditable是所有HTML元素都有的枚舉屬性,表示元素是否可以被用戶編輯??捎糜谒性?,但是不是所有元素對(duì)該屬性都起作用。如果元素支持該屬性,并且設(shè)置了contenteditable,則瀏覽器會(huì)修改元素以允許編輯。

關(guān)于contenteditable需要注意:

  • true或者空字符串,表示元素可編輯
  • false,表示元素不可編輯
  • 如果沒(méi)有設(shè)置該屬性的值,則其值被視為空字符串
  • 如果沒(méi)有設(shè)置該屬性或者設(shè)置了無(wú)效值,則其值默認(rèn)繼承自父元素。如果父元素是可編輯的,那么該子元素也是可編輯的;否則,該子元素不可編輯。
  • 雖然該屬性可以設(shè)置true、false,但是contenteditable是一個(gè)枚舉屬性而不是布爾屬性。

本項(xiàng)目采用對(duì)div增加contenteditable屬性實(shí)現(xiàn)輸入框。

基礎(chǔ)使用

首先新建一個(gè)Vue項(xiàng)目(如果只是實(shí)現(xiàn)demo,也可以不創(chuàng)建Vue項(xiàng)目),vue create simple-chat-inputbox,采用默認(rèn)的即可(新版vue-cli默認(rèn)新建的是Vue3項(xiàng)目,本項(xiàng)目采用Vue2)。

然后進(jìn)入項(xiàng)目,npm run serve運(yùn)行起來(lái),不運(yùn)行怎么能看到效果呢。

在實(shí)際開(kāi)發(fā)前,先做好準(zhǔn)備工作:

  • 初始化本地倉(cāng)庫(kù),并關(guān)聯(lián)遠(yuǎn)端倉(cāng)庫(kù)(可選)
  • 取消App.vue中的默認(rèn)樣式,隱藏HelloWorld

新建InputBox.vue,作為輸入框組件

...
<div class="input-box" contenteditable="true"></div>
...
<style scoped>
.input-box {
  width: 400px;
  height: 250px;
  border: 1px solid #6e6e6e;
  outline: none; /* 隱藏聚焦時(shí)外邊框 */
  padding: 10px;
}
</style>

注冊(cè)并引入InputBox.vue,運(yùn)行后如下圖:

此時(shí)就可以在輸入框中就可以輸入你想輸入的內(nèi)容,但是僅僅是輸入,怎么獲取值,以及怎么實(shí)現(xiàn)雙向綁定呢。

進(jìn)階使用

自定義事件 — Vue.js (vuejs.org)有一句話:

一個(gè)組件上的 v-model 默認(rèn)會(huì)利用名為 value 的 prop 和名為 input 的事件,仍然需要在組件的 props 選項(xiàng)里聲明 value 這個(gè) prop

根據(jù)此特性,我們?cè)賮?lái)改造一下項(xiàng)目:

雖然div變成了可編輯,但是并不能input一樣直接使用v-model來(lái)完成雙向綁定,但我們可以另辟蹊徑,模擬實(shí)現(xiàn)雙向綁定。首先我們需要?jiǎng)?chuàng)建兩個(gè)組件:InputBox.vueDivEditable.vue,分別表示父組件和子組件,對(duì)外只提供父組件。

對(duì)于父組件來(lái)說(shuō),只需要使用v-model傳入值就行。

// InputBox.vue
<template>
  <div>
    <DivEditable v-model="inputContent" />
    <input type="text" v-model="inputContent">
    <div @click="changeValue">父組件修改子組件的值</div>
  </div>
</template>
<script>
import DivEditable from '@/components/DivEditable'
export default {
  name: 'inputBox',
  data() {
    return {
      inputContent: '',
    }
  },
  watch: {
    inputContent(val) {
      console.log('父組件接收到的輸入框的值', val);
    }
  },
  components: {
    DivEditable
  },
  methods: {
    changeValue() {
      this.inputContent = this.model1;
    }
  }
}
</script>

子組件處理就相對(duì)復(fù)雜點(diǎn),需要接收值并且監(jiān)聽(tīng)事件:

<template>
  <div ref="editor" class="input-box" contenteditable="true" @input="inputText" @blur="inputBlur" @focus="inputFocus"></div>
</template>
<script>
export default {
  name: 'inputBox',
  props: ['value'], // 父組件v-model綁定的prop
  data() {
    return {
      isBlur: true, // 解決賦值時(shí)光標(biāo)自動(dòng)定位到起始位置
    }
  },
  watch: {
    value(val) {
      if (this.isBlur) {
        this.$refs.editor.innerHTML = val;
      }
    }
  },
  methods: {
    // 監(jiān)聽(tīng)輸入框內(nèi)容
    inputText() {
      console.log('子組件輸入框的輸入內(nèi)容', this.$refs.editor.innerHTML);
      this.$emit('input', this.$refs.editor.innerHTML);
    },
    inputFocus() {
      this.isBlur = false;
    },
    inputBlur() {
      this.isBlur = true;
    }
  }
}
</script>
<style scoped>
.input-box {
  width: 400px;
  height: 250px;
  border: 1px solid #6e6e6e;
  outline: none; /* 隱藏聚焦時(shí)外邊框 */
  padding: 10px;
}
</style>

雖然div不可以使用v-model,但是可以監(jiān)聽(tīng)input、focus、blur等事件。上述代碼其實(shí)并不復(fù)雜,主要就是利用了v-model的特性。有一點(diǎn)需要說(shuō)明,由于是“雙向綁定”,子組件里面輸入的值會(huì)通過(guò)父組件賦值到子組件,導(dǎo)致子組件的光標(biāo)始終處于起始位置,因此需要增加一個(gè)isBlur變量,用來(lái)解決這個(gè)問(wèn)題。感興趣的可以試一下去掉isBlur會(huì)是什么效果。

運(yùn)行結(jié)果如下圖:

通過(guò)修改父組件輸入框的值,子組件對(duì)應(yīng)的值也會(huì)發(fā)生改變;同理,修改子組件也是同樣的效果?;緦?shí)現(xiàn)了“雙向綁定”。

總結(jié)

本文基于contenteditable,實(shí)現(xiàn)可“雙向綁定”的輸入框

實(shí)現(xiàn)雙向綁定,可以動(dòng)態(tài)賦值,或者根據(jù)用戶的輸入實(shí)時(shí)處理,例如輸入@的時(shí)候彈出渲染的彈窗,在選擇用戶后再插入到輸入框

項(xiàng)目完整代碼可參考 項(xiàng)目地址,接下來(lái)將陸續(xù)介紹怎么實(shí)現(xiàn)粘貼文本、圖片,以及對(duì)光標(biāo)的處理。

到此這篇關(guān)于Vue實(shí)現(xiàn)contenteditable元素雙向綁定的方法詳解的文章就介紹到這了,更多相關(guān)Vue元素雙向綁定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇文章帶你了解vue路由

    一篇文章帶你了解vue路由

    這篇文章主要為大家詳細(xì)介紹了vue的路由,路由的本質(zhì)就是一種對(duì)應(yīng)關(guān)系,比如說(shuō)我們?cè)趗rl地址中輸入我們要訪問(wèn)的url地址之后,瀏覽器要去請(qǐng)求這個(gè)url地址對(duì)應(yīng)的資源,本文具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Vue3中如何使用rem來(lái)控制字體大小問(wèn)題

    Vue3中如何使用rem來(lái)控制字體大小問(wèn)題

    這篇文章主要介紹了Vue3中如何使用rem來(lái)控制字體大小問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 深入了解vue中一鍵復(fù)制功能的實(shí)現(xiàn)

    深入了解vue中一鍵復(fù)制功能的實(shí)現(xiàn)

    在現(xiàn)代的Web應(yīng)用中,用戶體驗(yàn)至關(guān)重要,而提供簡(jiǎn)單易用的復(fù)制功能是改善用戶體驗(yàn)的一項(xiàng)關(guān)鍵功能,本文將為大家詳細(xì)介紹Vue實(shí)現(xiàn)一鍵復(fù)制功能的具體方法,需要的可以參考下
    2023-11-11
  • Vue組件公用方法提取mixin實(shí)現(xiàn)

    Vue組件公用方法提取mixin實(shí)現(xiàn)

    這篇文章主要介紹了Vue組件公用方法提取mixin實(shí)現(xiàn),多個(gè)組件共用一個(gè)方法時(shí)可以用?mixin?抽取到一個(gè)js文件中,作為共用方法,下面一起進(jìn)入文章了解更多詳細(xì)內(nèi)容吧
    2022-03-03
  • vue.js內(nèi)置組件之keep-alive組件使用

    vue.js內(nèi)置組件之keep-alive組件使用

    keep-alive是Vue.js的一個(gè)內(nèi)置組件。這篇文章主要介紹了vue.js內(nèi)置組件之keep-alive組件使用,需要的朋友可以參考下
    2018-07-07
  • 如何巧用Vue緩存函數(shù)淺析

    如何巧用Vue緩存函數(shù)淺析

    有時(shí)候不希望已經(jīng)請(qǐng)求過(guò)的數(shù)據(jù),再次請(qǐng)求重復(fù)執(zhí)行刷新操作,我們就需要使用數(shù)據(jù)緩存,這篇文章主要給大家介紹了關(guān)于如何巧用Vue緩存函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 使用typescript構(gòu)建Vue應(yīng)用的實(shí)現(xiàn)

    使用typescript構(gòu)建Vue應(yīng)用的實(shí)現(xiàn)

    這篇文章主要介紹了使用typescript構(gòu)建Vue應(yīng)用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • vue中sync語(yǔ)法糖的用法詳解

    vue中sync語(yǔ)法糖的用法詳解

    Vue的.sync語(yǔ)法糖是一個(gè)用于雙向數(shù)據(jù)綁定的指令,可以在子組件中用來(lái)監(jiān)聽(tīng)父組件傳遞下來(lái)的props的變化,本文給大家介紹了在Vue中,.sync語(yǔ)法糖的使用方法,感興趣的朋友跟著小編一起來(lái)學(xué)習(xí)吧
    2024-01-01
  • Vue組件化開(kāi)發(fā)的必備技能之組件遞歸

    Vue組件化開(kāi)發(fā)的必備技能之組件遞歸

    組件是可以在它們自己的模板中調(diào)用自身的,不過(guò)它們只能通過(guò)?name?選項(xiàng)來(lái)做這件事,下面這篇文章主要給大家介紹了關(guān)于Vue組件化開(kāi)發(fā)的必備技能之組件遞歸的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 怎樣查看vue-cli的安裝位置

    怎樣查看vue-cli的安裝位置

    這篇文章主要介紹了怎樣查看vue-cli的安裝位置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評(píng)論