当前位置:首页 > VUE

js 实现vue模板

2026-02-25 18:33:07VUE

使用 JavaScript 实现 Vue 模板

在 JavaScript 中实现类似 Vue 的模板功能,可以通过以下方法完成。Vue 的核心是数据绑定和模板渲染,以下是一个简化版的实现。

数据绑定与响应式系统

通过 Object.definePropertyProxy 实现数据劫持,监听数据变化并更新视图。

class Vue {
  constructor(options) {
    this.$data = options.data();
    this.$el = document.querySelector(options.el);
    this.observe(this.$data);
    this.compile(this.$el);
  }

  observe(data) {
    if (!data || typeof data !== 'object') return;
    Object.keys(data).forEach(key => {
      let value = data[key];
      const dep = new Dep();
      Object.defineProperty(data, key, {
        get() {
          Dep.target && dep.addSub(Dep.target);
          return value;
        },
        set(newVal) {
          if (newVal === value) return;
          value = newVal;
          dep.notify();
        }
      });
      this.observe(value);
    });
  }

  compile(node) {
    [...node.childNodes].forEach(child => {
      if (child.nodeType === 3) { // 文本节点
        const text = child.textContent;
        const reg = /\{\{\s*(\S+)\s*\}\}/;
        if (reg.test(text)) {
          const key = RegExp.$1.trim();
          new Watcher(this.$data, key, (val) => {
            child.textContent = text.replace(reg, val);
          });
        }
      } else if (child.nodeType === 1) { // 元素节点
        this.compile(child);
      }
    });
  }
}

class Dep {
  constructor() {
    this.subs = [];
  }
  addSub(sub) {
    this.subs.push(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

class Watcher {
  constructor(data, key, cb) {
    this.cb = cb;
    Dep.target = this;
    this.value = data[key]; // 触发 getter
    Dep.target = null;
  }
  update() {
    this.cb(this.value);
  }
}

模板语法支持

实现类似 Vue 的 {{ }} 插值语法,通过正则匹配替换数据。

// 示例用法
const app = new Vue({
  el: '#app',
  data() {
    return {
      message: 'Hello, Vue!'
    };
  }
});

指令系统

扩展指令功能,如 v-model 实现双向绑定。

// 在 compile 方法中添加指令处理
if (child.nodeType === 1) {
  [...child.attributes].forEach(attr => {
    if (attr.name === 'v-model') {
      const key = attr.value;
      child.value = this.$data[key];
      child.addEventListener('input', (e) => {
        this.$data[key] = e.target.value;
      });
      new Watcher(this.$data, key, (val) => {
        child.value = val;
      });
    }
  });
  this.compile(child);
}

虚拟 DOM 优化

引入虚拟 DOM 减少直接操作真实 DOM 的开销。

class VNode {
  constructor(tag, data, children, text) {
    this.tag = tag;
    this.data = data;
    this.children = children;
    this.text = text;
  }
}

function createVNode(tag, data, children) {
  return new VNode(tag, data, children, null);
}

function createTextVNode(text) {
  return new VNode(null, null, null, text);
}

function patch(oldVNode, newVNode) {
  // 实现 DOM 更新逻辑
}

通过以上方法,可以实现一个简化版的 Vue 模板功能,包括数据绑定、模板渲染和指令系统。

js 实现vue模板

标签: 模板js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…