当前位置:首页 > VUE

vue双向实现数据

2026-02-11 01:59:49VUE

Vue 双向数据绑定的实现

Vue 的双向数据绑定主要通过 v-model 指令实现,它结合了属性绑定和事件监听,使表单输入和应用状态保持同步。

使用 v-model 实现双向绑定

v-model 是语法糖,自动处理 value 属性和 input 事件。适用于大多数表单元素,如 <input><textarea><select>

<input v-model="message" placeholder="Edit me">
<p>Message is: {{ message }}</p>
data() {
  return {
    message: ''
  }
}

自定义组件实现双向绑定

在自定义组件中,可以通过 model 选项和 $emit 实现双向绑定。

<custom-input v-model="searchText"></custom-input>
Vue.component('custom-input', {
  props: ['value'],
  model: {
    prop: 'value',
    event: 'input'
  },
  template: `
    <input
      :value="value"
      @input="$emit('input', $event.target.value)"
    >
  `
})

使用 .sync 修饰符

.sync 修饰符是另一种实现双向绑定的方式,适用于需要同步多个 prop 的情况。

<text-document :title.sync="doc.title"></text-document>
Vue.component('text-document', {
  props: ['title'],
  template: `
    <input
      :value="title"
      @input="$emit('update:title', $event.target.value)"
    >
  `
})

底层原理:数据劫持与发布订阅

Vue 通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据变化,结合发布订阅模式实现响应式。

// 简化的数据劫持示例
function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      return val
    },
    set(newVal) {
      if (newVal === val) return
      val = newVal
      // 触发更新
    }
  })
}

对比 Vue 2 和 Vue 3 的实现

Vue 2 使用 Object.defineProperty 实现数据劫持,需要递归遍历对象并为每个属性设置 getter/setter。

Vue 3 改用 Proxy 代理整个对象,能检测到新增/删除属性,性能更好。

vue双向实现数据

// Vue 3 使用 Proxy
const handler = {
  get(target, key) {
    return Reflect.get(target, key)
  },
  set(target, key, value) {
    Reflect.set(target, key, value)
    // 触发更新
    return true
  }
}
const observed = new Proxy(data, handler)

注意事项

  • 对象新增属性需要使用 Vue.set(Vue 2)或直接赋值(Vue 3)
  • 数组变异方法需要特殊处理(Vue 2)
  • 深层嵌套对象需要递归观察(Vue 2)
  • v-model 默认使用 value prop 和 input 事件,可通过 model 选项修改

标签: 双向数据
分享给朋友:

相关文章

vue数据代理底层实现

vue数据代理底层实现

Vue 数据代理的底层实现原理 Vue 的数据代理是通过 Object.defineProperty 或 Proxy(Vue 3)实现的,将数据对象的属性代理到 Vue 实例上,使得可以直接通过 th…

vue 实现数据分页

vue 实现数据分页

实现数据分页的基本思路 在Vue中实现数据分页通常需要结合前端分页逻辑和后端API支持。前端分页适合数据量较小的情况,后端分页适合大数据量场景。 前端分页实现 创建一个计算属性来分割当前页数据:…

react如何接收数据

react如何接收数据

React 接收数据的方法 React 中接收数据的方式有多种,根据数据来源和场景的不同,可以选择适合的方法。以下是常见的几种方式: Props 传递数据 父组件通过 props 向子组件传递数据,…

vue 实现数据分类

vue 实现数据分类

Vue 实现数据分类的方法 在 Vue 中实现数据分类可以通过多种方式完成,具体取决于应用场景和数据结构。以下是几种常见的方法: 使用计算属性分类数据 计算属性是 Vue 中处理数据分类的高效方式,…

vue双向数据绑定实现

vue双向数据绑定实现

双向数据绑定的概念 双向数据绑定是指视图(View)与模型(Model)之间的双向同步。当数据发生变化时,视图自动更新;当用户操作视图时,数据也会自动更新。Vue 通过 v-model 指令实现双向数…

vue简单实现双向绑定

vue简单实现双向绑定

Vue 双向绑定的简单实现 Vue 的双向绑定核心是通过 v-model 指令实现的,它结合了 v-bind 和 v-on 的功能。以下是一个简单的实现方式: 模板部分 <template&…