Vue使用可編輯div進行數(shù)據(jù)雙向綁定的嘗試

表單可以通過簡單的v-model實現(xiàn)數(shù)據(jù)的雙向綁定(value 的單向綁定 + onChange 事件偵聽),實現(xiàn)所見即所得,但表單是限高的,在文本的輸入過程中不能自增高度,因此想到使用div進行數(shù)據(jù)雙向綁定;

為了實現(xiàn)View=>Model,需要一個可編輯的div,這里使用了contenteditable屬性:

<!-- EditableDiv.vue -->
<template>
  <div ref="div" contenteditable="true"></div>
<template/>

v-model并不能直接在div上使用,我們通過mounted周期來模擬插值的過程:

// EditableDiv.vue
export default {
  props: ['value'], // 組件接受一個 value 屬性用來在 div 中展示
  mounted() {
    this.setVal(this.value) // 將 value 注入 div 中
  },
  methods: {
    setVal(val) {
      this.$refs.div.innerHTML = val
    }
  },
  watch: {
    // 當(dāng) props.value 發(fā)生改變時 更新 div 中的值
    value(val) {
      this.setVal(this.value)
    }
  }
}

這樣就實現(xiàn)了視圖向數(shù)據(jù)的綁定。

在實現(xiàn)Model=>View的過程中,會有較多頭疼的問題,這篇文章做了很好的總結(jié),但最終還是無法做到像input一樣真實的綁定,只是模擬了行為。

以下是通過blur事件實現(xiàn)的綁定,同樣也是妥協(xié)后的結(jié)果:

<!-- EditableDiv.vue -->
<!-- 為 div 綁定 blur 事件以更新value -->
<template>
  <div
    ref="div"
    contenteditable="true"
    @blur="$emit('update:value', $event.target.innerHTML)"
  ></div>
</template>

在使用時通過sync修飾符:

<!-- Home.vue -->
<editable-div :value.sync="content" />
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容