当前位置:首页 > 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 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 数据渲染的实现方式 Vue.js 提供了多种数据渲染的方式,包括插值表达式、指令和计算属性等。以下是常见的实现方法: 插值表达式 使用双大括号 {{ }} 将数据绑定到模板中,数据变化时会自…

vue实现双向

vue实现双向

Vue 实现双向绑定的方法 Vue 主要通过 v-model 指令实现双向绑定,适用于表单元素或自定义组件。以下是几种常见实现方式: 表单元素的双向绑定 在表单元素(如 input、textare…

vue实现数据互通

vue实现数据互通

Vue 实现数据互通的方法 Vue 提供了多种方式实现组件间的数据互通,以下是几种常见的方法: 父子组件通信 Props 传递数据 父组件通过 props 向子组件传递数据。 <!--…

react如何接收数据

react如何接收数据

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

php实现双向队列

php实现双向队列

PHP 实现双向队列的方法 双向队列(Deque,Double-ended Queue)是一种允许在队列两端进行插入和删除操作的数据结构。PHP 中可以通过数组或 SplDoublyLinkedLis…

Vue数据绑定实现

Vue数据绑定实现

Vue 数据绑定的核心机制 Vue 的数据绑定基于响应式系统,通过 Object.defineProperty 或 Proxy 实现。当数据变化时,视图自动更新。 双向绑定的实现方式 v-mode…