当前位置:首页 > VUE

原生加数组实现vue

2026-01-22 18:12:20VUE

使用原生 JavaScript 和数组实现 Vue 的核心功能

Vue 的核心功能包括数据响应式、模板渲染和指令绑定。通过原生 JavaScript 和数组可以模拟部分功能,以下是一个简化版的实现方式。

数据响应式实现

使用 Object.definePropertyProxy 监听数据变化,并触发更新逻辑。

原生加数组实现vue

const data = {
  message: "Hello Vue",
  items: ["Item 1", "Item 2", "Item 3"]
};

function observe(data) {
  if (!data || typeof data !== "object") return;

  Object.keys(data).forEach(key => {
    let value = data[key];
    Object.defineProperty(data, key, {
      get() {
        return value;
      },
      set(newValue) {
        if (newValue !== value) {
          value = newValue;
          updateView(); // 数据变化时更新视图
        }
      }
    });
  });
}

observe(data);

模板渲染

通过 DOM 操作实现数据绑定和渲染。

原生加数组实现vue

function updateView() {
  const app = document.getElementById("app");
  app.innerHTML = `
    <div>
      <p>{{ message }}</p>
      <ul>
        ${data.items.map(item => `<li>${item}</li>`).join("")}
      </ul>
    </div>
  `;
}

updateView();

指令绑定(v-model)

监听输入框变化并更新数据。

const input = document.createElement("input");
input.setAttribute("type", "text");
input.addEventListener("input", (e) => {
  data.message = e.target.value;
});
document.body.appendChild(input);

数组方法监听

Vue 通过重写数组方法(如 pushpop)实现响应式监听。

const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);

["push", "pop", "shift", "unshift", "splice"].forEach(method => {
  const original = arrayProto[method];
  arrayMethods[method] = function(...args) {
    const result = original.apply(this, args);
    updateView(); // 数组变化时更新视图
    return result;
  };
});

data.items.__proto__ = arrayMethods;

完整示例

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Vue-like Implementation</title>
</head>
<body>
  <div id="app"></div>
  <input type="text" id="input">

  <script>
    const data = {
      message: "Hello Vue",
      items: ["Item 1", "Item 2", "Item 3"]
    };

    // 数据监听
    function observe(data) {
      if (!data || typeof data !== "object") return;

      Object.keys(data).forEach(key => {
        let value = data[key];
        Object.defineProperty(data, key, {
          get() {
            return value;
          },
          set(newValue) {
            if (newValue !== value) {
              value = newValue;
              updateView();
            }
          }
        });
      });
    }

    // 数组方法劫持
    const arrayProto = Array.prototype;
    const arrayMethods = Object.create(arrayProto);

    ["push", "pop", "shift", "unshift", "splice"].forEach(method => {
      const original = arrayProto[method];
      arrayMethods[method] = function(...args) {
        const result = original.apply(this, args);
        updateView();
        return result;
      };
    });

    data.items.__proto__ = arrayMethods;

    // 视图更新
    function updateView() {
      const app = document.getElementById("app");
      app.innerHTML = `
        <div>
          <p>${data.message}</p>
          <ul>
            ${data.items.map(item => `<li>${item}</li>`).join("")}
          </ul>
        </div>
      `;
    }

    // 初始化
    observe(data);
    updateView();

    // v-model 模拟
    document.getElementById("input").addEventListener("input", (e) => {
      data.message = e.target.value;
    });
  </script>
</body>
</html>

注意事项

  • 此实现仅为简化版,Vue 实际源码更复杂,包含虚拟 DOM、依赖收集等机制。
  • 现代 Vue 3 使用 Proxy 代替 Object.defineProperty,支持深层监听。
  • 数组监听需手动劫持方法,Vue 内部通过 __ob__ 标记实现。

此方法可用于理解 Vue 基本原理,实际开发建议直接使用 Vue 框架。

标签: 数组vue
分享给朋友:

相关文章

vue实现管道

vue实现管道

Vue 中实现管道(Pipe)功能 在 Vue 中可以通过过滤器(Filters)或计算属性(Computed Properties)实现类似管道的功能,将数据经过多个处理步骤后输出。 使用过滤器(…

vue实现效果

vue实现效果

以下是Vue实现常见效果的几种典型方法,分为不同场景说明: 数据绑定与响应式更新 使用v-model实现表单双向绑定: <template> <input v-model="…

实现简易vue

实现简易vue

实现简易 Vue 的核心思路 Vue 的核心功能包括数据响应式、模板编译和虚拟 DOM。以下是一个简易实现方案,涵盖核心功能模块。 数据响应式系统 通过 Object.defineProperty…

vue实现datalist

vue实现datalist

使用 Vue 实现 HTML5 的 datalist 功能 HTML5 的 <datalist> 元素提供了一种自动完成输入框的功能,允许用户在输入时从预定义的选项列表中选择。以下是几种在…

vue实现发帖

vue实现发帖

使用 Vue 实现发帖功能 前端实现 创建发帖表单组件,包含标题和内容输入框,以及提交按钮。使用 v-model 绑定表单数据。 <template> <div>…

vue实现eventbus

vue实现eventbus

Vue 中实现 EventBus 在 Vue 中,EventBus 是一种跨组件通信的机制,尤其适用于非父子组件之间的数据传递。以下是实现 EventBus 的几种方法: 方法一:使用 Vue 实例…