当前位置:首页 > VUE

vue实现双向

2026-03-07 08:52:16VUE

Vue 双向绑定的实现方式

Vue 的双向绑定主要通过 v-model 指令实现,它结合了属性绑定和事件监听,常用于表单元素。以下是几种常见的实现方式:

使用 v-model 指令

v-model 是 Vue 提供的语法糖,用于简化表单元素的双向绑定。它会根据不同的输入元素自动选择合适的方式更新数据。

<template>
  <input v-model="message" placeholder="Edit me">
  <p>Message is: {{ message }}</p>
</template>

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

自定义组件实现双向绑定

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

<template>
  <custom-input v-model="message"></custom-input>
  <p>Message is: {{ message }}</p>
</template>

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

使用 .sync 修饰符

.sync 修饰符是另一种实现双向绑定的方式,适用于需要多个双向绑定的场景。

<template>
  <custom-input :value.sync="message"></custom-input>
  <p>Message is: {{ message }}</p>
</template>

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

手动实现双向绑定

如果不使用 v-model,可以通过手动绑定 value 属性和监听 input 事件实现双向绑定。

<template>
  <input 
    :value="message" 
    @input="message = $event.target.value"
    placeholder="Edit me"
  >
  <p>Message is: {{ message }}</p>
</template>

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

双向绑定的底层原理

Vue 的双向绑定基于数据劫持和发布-订阅模式实现。通过 Object.definePropertyProxy 监听数据变化,结合观察者模式更新视图。

vue实现双向

使用 Object.defineProperty

let data = { message: '' };
let input = document.querySelector('input');
let p = document.querySelector('p');

Object.defineProperty(data, 'message', {
  get() {
    return this._message;
  },
  set(newValue) {
    this._message = newValue;
    input.value = newValue;
    p.textContent = newValue;
  }
});

input.addEventListener('input', function(e) {
  data.message = e.target.value;
});

使用 Proxy

let data = new Proxy({ message: '' }, {
  set(target, key, value) {
    target[key] = value;
    input.value = value;
    p.textContent = value;
    return true;
  }
});

input.addEventListener('input', function(e) {
  data.message = e.target.value;
});

注意事项

  • v-model 默认会忽略表单元素的 valuecheckedselected 属性的初始值,始终以 Vue 实例的数据为来源。
  • 在自定义组件中,v-model 默认使用 value 作为 prop 和 input 作为事件,但可以通过 model 选项修改。
  • 对于复选框、单选按钮等表单元素,v-model 的行为会有所不同,需要根据具体场景调整。

标签: 双向vue
分享给朋友:

相关文章

vue实现页面截屏

vue实现页面截屏

使用html2canvas库实现截屏 html2canvas是一个流行的JavaScript库,可以将DOM元素转换为Canvas图像。在Vue项目中安装html2canvas: npm insta…

vue slot实现

vue slot实现

vue slot 的实现方法 在 Vue 中,slot 是一种内容分发机制,允许父组件向子组件传递模板内容。以下是几种常见的 slot 实现方式: 默认 slot 默认 slot 是最基础的 slo…

vue实现grid

vue实现grid

Vue 实现 Grid 布局的方法 使用 CSS Grid 布局 Vue 可以结合 CSS Grid 布局实现灵活的网格系统。CSS Grid 是现代浏览器原生支持的布局方案,无需额外依赖库。 &l…

vue实现框选

vue实现框选

Vue 实现框选功能 在 Vue 中实现框选功能通常需要监听鼠标事件,计算选区范围,并根据选区范围高亮或选中元素。以下是实现框选功能的关键步骤。 监听鼠标事件 在 Vue 模板中,为容器元素绑定鼠标…

vue实现城市

vue实现城市

Vue 实现城市选择功能 使用 Element UI 的 Cascader 组件 Element UI 提供了一个 Cascader 级联选择器组件,非常适合实现城市选择功能。需要先安装 Elemen…

vue sku 实现

vue sku 实现

Vue SKU 实现方案 在电商系统中,SKU(Stock Keeping Unit)是商品的最小库存单位,通常由多个属性组合而成(如颜色、尺寸等)。以下是基于 Vue 的实现方案。 数据结构设计…