当前位置:首页 > VUE

vue实现双向绑定代码

2026-02-24 05:39:34VUE

Vue 2 实现双向绑定

Vue 2 使用 v-model 指令实现双向绑定,主要基于 Object.defineProperty 实现数据劫持。

<template>
  <div>
    <input v-model="message" placeholder="输入内容">
    <p>输入的内容是: {{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  }
}
</script>

自定义组件中实现双向绑定:

<template>
  <custom-input v-model="message"></custom-input>
</template>

<script>
export default {
  components: {
    'custom-input': {
      props: ['value'],
      template: `
        <input
          :value="value"
          @input="$emit('input', $event.target.value)"
        >
      `
    }
  },
  data() {
    return {
      message: ''
    }
  }
}
</script>

Vue 3 实现双向绑定

Vue 3 使用 v-model 指令,底层基于 Proxy 实现响应式。

vue实现双向绑定代码

<template>
  <input v-model="message" placeholder="输入内容">
  <p>输入的内容是: {{ message }}</p>
</template>

<script>
import { ref } from 'vue'

export default {
  setup() {
    const message = ref('')
    return { message }
  }
}
</script>

自定义组件中实现双向绑定:

<template>
  <custom-input v-model="message"></custom-input>
</template>

<script>
import { ref } from 'vue'

export default {
  components: {
    'custom-input': {
      props: ['modelValue'],
      emits: ['update:modelValue'],
      template: `
        <input
          :value="modelValue"
          @input="$emit('update:modelValue', $event.target.value)"
        >
      `
    }
  },
  setup() {
    const message = ref('')
    return { message }
  }
}
</script>

手动实现简易双向绑定

以下是一个基于 Object.defineProperty 的简易实现:

vue实现双向绑定代码

function defineReactive(obj, key) {
  let value = obj[key]
  const dep = new Dep()

  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) {
        dep.addSub(Dep.target)
      }
      return value
    },
    set(newVal) {
      if (newVal === value) return
      value = newVal
      dep.notify()
    }
  })
}

class Dep {
  constructor() {
    this.subs = []
  }
  addSub(sub) {
    this.subs.push(sub)
  }
  notify() {
    this.subs.forEach(sub => sub.update())
  }
}

class Watcher {
  constructor(vm, exp, cb) {
    this.vm = vm
    this.exp = exp
    this.cb = cb
    Dep.target = this
    this.value = vm[exp]
    Dep.target = null
  }
  update() {
    const value = this.vm[this.exp]
    if (value !== this.value) {
      this.value = value
      this.cb.call(this.vm, value)
    }
  }
}

使用示例:

const data = { message: 'Hello' }
defineReactive(data, 'message')

new Watcher(data, 'message', value => {
  console.log('值变化:', value)
})

data.message = 'World'  // 控制台输出: 值变化: World

注意事项

Vue 2 中数组和对象需要特殊处理,Vue.set 或 this.$set 用于添加响应式属性

Vue 3 的 Proxy 实现可以自动检测深层对象变化,无需特殊处理

自定义组件中,Vue 2 默认使用 value 属性和 input 事件,Vue 3 使用 modelValue 属性和 update:modelValue 事件

标签: 绑定双向
分享给朋友:

相关文章

vue 双向实现原理

vue 双向实现原理

Vue 双向绑定的实现原理 Vue 的双向绑定主要通过 v-model 指令实现,其核心是结合数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。以下是具体实现机制…

vue怎么实现绑定

vue怎么实现绑定

数据绑定基础 Vue 通过 v-bind 指令实现单向数据绑定(数据从模型到视图),语法为 v-bind:属性="数据" 或简写为 :属性="数据"。例如绑定 src 属性: <img :…

vue双向绑定实现

vue双向绑定实现

Vue 双向绑定实现原理 Vue 的双向绑定主要通过 v-model 指令实现,其核心是结合数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。 数据劫持 Vue…

vue双向绑定如何实现

vue双向绑定如何实现

Vue 双向绑定的实现原理 Vue 的双向绑定是通过数据劫持结合发布者-订阅者模式实现的,核心是 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)。 Vu…

vue如何实现双向变电

vue如何实现双向变电

Vue 双向绑定实现方法 Vue 中实现双向绑定的核心是通过 v-model 指令,它结合了 v-bind 和 v-on 的功能,简化了表单元素与数据的同步操作。 基础用法 在表单元素上直接使用 v…

vue自己实现双向绑定

vue自己实现双向绑定

实现 Vue 双向绑定的核心原理 双向绑定的核心是通过数据劫持结合发布-订阅模式实现的。主要涉及 Object.defineProperty 或 Proxy 来监听数据变化,并通过观察者模式通知视图更…