美文网首页三脚猫
Vue使用可编辑div进行数据双向绑定的尝试

Vue使用可编辑div进行数据双向绑定的尝试

作者: DADFAD | 来源:发表于2019-08-12 15:09 被阅读0次

表单可以通过简单的v-model实现数据的双向绑定(value 的单向绑定 + onChange 事件侦听),实现所见即所得,但表单是限高的,在文本的输入过程中不能自增高度,因此想到使用div进行数据双向绑定;

为了实现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: {
    // 当 props.value 发生改变时 更新 div 中的值
    value(val) {
      this.setVal(this.value)
    }
  }
}

这样就实现了视图向数据的绑定。

在实现Model=>View的过程中,会有较多头疼的问题,这篇文章做了很好的总结,但最终还是无法做到像input一样真实的绑定,只是模拟了行为。

以下是通过blur事件实现的绑定,同样也是妥协后的结果:

<!-- 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" />

相关文章

  • Vue使用可编辑div进行数据双向绑定的尝试

    表单可以通过简单的v-model实现数据的双向绑定(value 的单向绑定 + onChange 事件侦听),实现...

  • 前端面试题:VUE

    1. vue的双向数据绑定实现原理? 2. vue如何在组件之间进行传值? 3. vuex和vue的双向数据绑定...

  • vue

    1、vue的双向数据绑定实现原理 2、vue如何在组件之间进行传值 3、vuex和vue的双向数据绑定有什么冲突 ...

  • Vue 中的双向数据绑定

    双向绑定 单向数据流 双向绑定 or 单向数据流 Vue 是单向数据流,不是双向绑定 Vue 的双向绑定是语法糖 ...

  • vue双向数据绑定原理

    vue中通过v-model进行一个双向数据绑定。 双向数据绑定的原理是什么? Vue内部通过Object.defi...

  • vue的双向绑定原理及实现

    vue数据双向绑定原理 vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,那么vue是如果进行...

  • Vue面试考点之响应式原理

    我们都知道Vue通过MVVM思想实现数据的双向绑定,数据驱动页面视图。那它到底是如何进行双向绑定的呢? Vue数据...

  • Vue入门(二)——数据绑定

    一、什么是双向数据绑定 双向数据绑定是Vue的核心功能之一。所谓双向数据绑定是指:HTML标签上的数据绑定到Vue...

  • vue 双向数据绑定

    Vue实现数据双向绑定的原理:Object.defineProperty()vue实现数据双向绑定主要是:采用数据...

  • 深入Vue响应式原理

    1.Vue的双向数据绑定 参考 vue的双向绑定原理及实现Vue双向绑定的实现原理Object.definepro...

网友评论

    本文标题:Vue使用可编辑div进行数据双向绑定的尝试

    本文链接:https://www.haomeiwen.com/subject/aohujctx.html