当前位置:首页 > 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 实现好评弹框可以通过组件化方式完成,结合动态数据绑定和事件处理。以下是具体实现步骤: 1. 创建弹框组件 新建一个 RatingDialog.vue 组件…

vue 实现直播

vue 实现直播

Vue 实现直播的基本方法 在Vue中实现直播功能,通常需要结合WebRTC、RTMP或HLS等技术。以下是几种常见的实现方式: 使用WebRTC实现实时直播 WebRTC适合低延迟的实时直播场景,…

vue 实现关闭

vue 实现关闭

Vue 实现关闭功能的方法 在Vue中实现关闭功能通常涉及组件销毁、模态框隐藏或路由跳转等场景。以下是几种常见实现方式: 销毁当前组件 使用v-if或v-show控制组件显示/隐藏,适用于局部组件…

vue实现拍照

vue实现拍照

Vue实现拍照功能 在Vue中实现拍照功能通常需要结合浏览器的MediaDevices API和Canvas元素。以下是具体实现方法: 安装依赖(可选) 如果需要更简单的封装,可以安装vue-w…

vue实现上传

vue实现上传

Vue 文件上传实现方法 使用 Vue 实现文件上传可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的事件处理和数据绑定来实现。 基础实现步骤…

vue 实现ztree

vue 实现ztree

在Vue中实现类似ZTree的功能,可以通过集成第三方库或自定义组件完成。以下是两种常见方法: 使用vue-tree组件 vue-tree是一个轻量级的Vue树形组件,支持复选框、懒加载等功能,适合…