当前位置:首页 > 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实现muli

vue实现muli

Vue 实现多语言(i18n)支持 在 Vue 项目中实现多语言(i18n)功能,通常使用 vue-i18n 插件。以下是具体实现步骤: 安装 vue-i18n npm install vue-i…

vue实现级联

vue实现级联

Vue 实现级联选择器的方法 级联选择器(Cascader)是常见的表单组件,用于处理多层级联动数据选择(如省市区选择)。以下是几种实现方式: 基于 Element UI 的 el-cascader…

vue tab实现

vue tab实现

Vue Tab 实现方法 使用动态组件实现 Tab 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现 Ta…

vue核心实现

vue核心实现

Vue 核心实现原理 Vue.js 的核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是关键实现原理的详细说明: 响应式系统 Vue 使用 Object.defineProper…

vue 实现token 登录

vue 实现token 登录

安装依赖 确保项目中已安装 axios 和 vue-router。若未安装,可通过以下命令安装: npm install axios vue-router 配置axios拦截器 在 src 目录下创…

vue视频怎么实现

vue视频怎么实现

实现视频播放功能 在Vue中实现视频播放功能可以通过HTML5的<video>标签或第三方库来实现。以下是几种常见的方法: 使用HTML5 <video>标签 <te…