当前位置:首页 > VUE

vue手动实现双向绑定

2026-02-24 15:04:13VUE

Vue 手动实现双向绑定的方法

双向绑定的核心是数据变化时更新视图,视图变化时更新数据。Vue 通过 v-model 指令实现,手动实现需结合数据劫持和事件监听。

使用 Object.defineProperty 实现数据劫持

通过 Object.defineProperty 拦截对象的属性读写,触发更新逻辑。

vue手动实现双向绑定

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        val = newVal;
        updateView(); // 数据变化时更新视图
      }
    },
  });
}

function observe(obj) {
  Object.keys(obj).forEach(key => {
    defineReactive(obj, key, obj[key]);
  });
}

视图到数据的绑定

通过事件监听(如 input 事件)将视图变化同步到数据。

const input = document.getElementById('input');
input.addEventListener('input', function(e) {
  data.message = e.target.value; // 视图变化时更新数据
});

数据到视图的绑定

定义一个更新视图的函数,将数据渲染到 DOM。

vue手动实现双向绑定

function updateView() {
  document.getElementById('output').innerText = data.message;
}

完整示例

<input id="input" type="text" />
<p id="output"></p>

<script>
  const data = { message: '' };
  observe(data);

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

  function updateView() {
    document.getElementById('output').innerText = data.message;
  }

  function observe(obj) {
    Object.keys(obj).forEach(key => {
      defineReactive(obj, key, obj[key]);
    });
  }

  function defineReactive(obj, key, val) {
    Object.defineProperty(obj, key, {
      get() {
        return val;
      },
      set(newVal) {
        if (newVal !== val) {
          val = newVal;
          updateView();
        }
      },
    });
  }
</script>

使用 Proxy 替代 Object.defineProperty

Proxy 可以更灵活地拦截对象操作,支持数组和嵌套对象。

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      return target[key];
    },
    set(target, key, value) {
      target[key] = value;
      updateView();
      return true;
    },
  });
}

const data = reactive({ message: '' });

实现一个简易的 v-model

结合数据劫持和事件监听,封装一个类似 v-model 的功能。

function bindInput(inputElement, data, key) {
  inputElement.value = data[key];
  inputElement.addEventListener('input', (e) => {
    data[key] = e.target.value;
  });

  // 数据变化时更新输入框
  const proxy = reactive(data);
  proxy[key] = data[key];
}

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

相关文章

Vue数据绑定实现

Vue数据绑定实现

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

vue动态绑定实现原理

vue动态绑定实现原理

Vue动态绑定的核心原理 Vue的动态绑定主要通过数据劫持结合发布者-订阅者模式实现。当数据发生变化时,视图会自动更新,这一机制被称为响应式系统。 数据劫持与响应式 Vue使用Object.defi…

vue如何实现表单绑定

vue如何实现表单绑定

Vue 表单绑定实现方法 Vue 提供了 v-model 指令实现表单元素的双向数据绑定,适用于多种输入类型。 文本输入框绑定 <input type="text" v-model="mess…

实现Vue双向数据绑定

实现Vue双向数据绑定

Vue 双向数据绑定的实现原理 Vue 的双向数据绑定是通过 v-model 指令实现的,其核心基于 数据劫持 和 发布-订阅模式。具体实现分为以下几个部分: 数据劫持(Object.defineP…

怎么实现数据绑定vue

怎么实现数据绑定vue

数据绑定的基本概念 在Vue中,数据绑定是一种将数据模型与DOM元素动态关联的机制,确保数据变化时视图自动更新。Vue通过响应式系统实现这一功能。 双向数据绑定(v-model) 使用v-mod…

vue双向绑定实现函数

vue双向绑定实现函数

Vue 双向绑定实现原理 Vue 的双向绑定核心是通过数据劫持结合发布者-订阅者模式实现的,主要依赖 Object.defineProperty 或 Proxy。 使用 Object.def…