当前位置:首页 > 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 双向绑定的简单实现 双向绑定的核心是通过数据劫持结合发布-订阅模式实现。以下是简化版的实现步骤: 数据劫持(Object.defineProperty) 通过 Object.definePr…

vue 双向绑定实现

vue 双向绑定实现

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

vue实现数组绑定

vue实现数组绑定

Vue 数组绑定的实现方法 Vue 提供了多种方式实现数组的响应式绑定,确保数据变化时视图自动更新。以下是常见的实现方法: 使用 v-for 指令渲染数组 通过 v-for 指令可以遍历数组并渲染…

vue 双向实现原理

vue 双向实现原理

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

vue实现数组双向绑定

vue实现数组双向绑定

实现数组双向绑定的方法 在Vue中,实现数组的双向绑定通常需要结合v-model指令或自定义事件处理。以下是几种常见的方法: 使用v-model绑定数组 Vue的v-model指令默认支持表单元素的…

vue怎样实现数组绑定

vue怎样实现数组绑定

Vue 实现数组绑定的方法 Vue 提供了多种方式来实现数组的绑定,以下是常见的几种方法: 使用 v-for 指令绑定数组 通过 v-for 指令可以遍历数组并渲染列表。语法如下: <ul&…