当前位置:首页 > 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 的数据绑定主要通过响应式系统和模板语法实现,以下是核心方法: 双向数据绑定(v-model) 通过 v-model 指令实现表单元素与数据的双向绑定,自动同步数…

react如何绑定事件

react如何绑定事件

React 事件绑定方法 在 React 中绑定事件有多种方式,以下是常见的几种方法: 使用 onClick 或其他事件属性直接绑定 <button onClick={() =>…

jquery事件绑定

jquery事件绑定

jQuery 事件绑定的基本方法 使用 on() 方法绑定事件是最推荐的方式,兼容性强且支持动态元素。语法如下: $(selector).on(eventName, handlerFunction)…

jquery绑定事件

jquery绑定事件

jQuery 绑定事件的方法 jQuery 提供了多种方式来绑定事件,以下是常见的几种方法: on() 方法 on() 是最推荐的事件绑定方法,支持动态元素和多个事件绑定。 $(selecto…

vue 双向绑定实现

vue 双向绑定实现

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

vue 双向实现原理

vue 双向实现原理

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