当前位置:首页 > 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 实现动态菜单的常见方法 基于路由配置生成菜单 Vue Router 的路由配置可以天然转化为菜单结构,适合权限与路由绑定的系统: // router/index.js const rout…

vue实现查询替换

vue实现查询替换

Vue 实现查询替换功能 在 Vue 中实现查询替换功能,可以通过数据绑定和字符串操作方法结合实现。以下是具体实现方式: 基础实现 <template> <div>…

vue实现安全免登录

vue实现安全免登录

Vue 实现安全免登录的方案 免登录功能通常通过持久化认证状态(如 Token)实现,但需兼顾安全性。以下是基于 Vue 的常见实现方案: 基于 Token 的免登录 登录成功后存储 Toke…

vue穿梭框组件实现

vue穿梭框组件实现

实现基础穿梭框组件 在Vue中实现穿梭框组件,可以使用<el-transfer>(Element UI)或手动实现。以下是手动实现的核心逻辑: <template> &l…

vue实现报表

vue实现报表

vue实现报表的方法 使用Vue实现报表通常需要结合图表库或表格组件。以下是几种常见方法: 使用ECharts 安装ECharts库: npm install echarts vue-echa…

vue实现drag

vue实现drag

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 来完成。以下是两种常见方法的实现方式。 使用 HTML5 拖拽…