当前位置:首页 > VUE

vue如何实现原理

2026-01-08 05:22:25VUE

Vue 的核心实现原理

Vue 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化。以下分模块详细说明其实现机制。

响应式系统

Vue 2.x 使用 Object.defineProperty 实现数据劫持,通过递归遍历数据对象的属性,将其转化为 getter/setter。当数据被访问或修改时,触发依赖收集和派发更新。

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log('get', key);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log('set', key);
        val = newVal;
      }
    }
  });
}

Vue 3.x 改用 Proxy 实现响应式,解决了 Vue 2.x 对数组和新增属性的监听限制:

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      console.log('get', key);
      return Reflect.get(target, key);
    },
    set(target, key, val) {
      console.log('set', key);
      return Reflect.set(target, key, val);
    }
  });
}

虚拟 DOM 与 Diff 算法

Vue 通过虚拟 DOM 描述真实 DOM 结构,数据变化时生成新的虚拟 DOM,通过 Diff 算法对比新旧虚拟 DOM 的差异,最小化 DOM 操作:

function patch(oldVnode, newVnode) {
  if (sameVnode(oldVnode, newVnode)) {
    patchVnode(oldVnode, newVnode);
  } else {
    const parent = oldVnode.parentNode;
    parent.replaceChild(createElm(newVnode), oldVnode.el);
  }
}

Diff 算法采用同层比较策略,通过双端指针优化比对效率,优先处理常见场景如头尾节点相同的情况。

模板编译

Vue 模板通过编译生成渲染函数,分为以下步骤:

  1. 解析器将模板转换为 AST(抽象语法树)
  2. 优化器标记静态节点以跳过 Diff
  3. 代码生成器将 AST 转换为渲染函数代码
// 模板
<div id="app">{{ message }}</div>

// 编译后渲染函数
function render() {
  with(this) {
    return _c('div', { attrs: { "id": "app" } }, [_v(_s(message))]);
  }
}

组件化实现

Vue 组件本质是可复用的 Vue 实例,通过 Vue.extend 创建子类构造函数。组件初始化时合并选项(如 mixins),建立父子组件关联,并管理生命周期钩子调用顺序。

const Child = Vue.extend({
  template: '<div>Child Component</div>'
});

new Vue({
  components: { Child },
  template: '<child/>'
});

依赖收集与派发更新

每个响应式属性拥有自己的 Dep 实例,用于收集依赖的 Watcher。当数据变化时,通知所有依赖的 Watcher 执行更新:

vue如何实现原理

class Dep {
  constructor() {
    this.subs = [];
  }
  depend() {
    if (Dep.target) {
      this.subs.push(Dep.target);
    }
  }
  notify() {
    this.subs.forEach(watcher => watcher.update());
  }
}

组件渲染时创建渲染 Watcher,将当前 Watcher 设置为 Dep.target,触发 getter 进行依赖收集。

分享给朋友:

相关文章

vue如何实现计算

vue如何实现计算

Vue 实现计算的方法 Vue 提供了多种方式来实现计算逻辑,包括计算属性、方法、侦听器等。以下是几种常见的实现方式: 计算属性(Computed Properties) 计算属性是基于它们的响应式…

css动画制作原理

css动画制作原理

CSS动画制作原理 CSS动画通过关键帧(@keyframes)和动画属性(如animation-name、animation-duration)实现动态效果。核心原理分为两部分:定义动画关键帧和绑定…

vue实现飘窗原理

vue实现飘窗原理

Vue实现飘窗的原理 Vue实现飘窗功能通常基于组件化开发,结合CSS动画和Vue的数据绑定特性。飘窗一般指悬浮在页面上的可拖动或自动移动的元素,常见于广告、通知等场景。 核心实现步骤 组件结构设计…

h5如何实现定位

h5如何实现定位

使用HTML5 Geolocation API HTML5提供了Geolocation API,可以获取用户的地理位置信息。通过navigator.geolocation对象实现,支持获取经纬度、海拔…

eventbus实现原理vue

eventbus实现原理vue

EventBus 实现原理 EventBus 在 Vue 中通常用于跨组件通信,其核心原理基于发布-订阅模式。通过一个中央事件总线,组件可以订阅事件或触发事件,实现非父子组件间的通信。 核心机制 E…

h5如何实现蜡烛点亮

h5如何实现蜡烛点亮

实现蜡烛点亮的H5方法 在H5中实现蜡烛点亮效果,可以通过CSS动画、Canvas绘图或结合JavaScript交互来实现。以下是几种常见的方法: 使用CSS动画和JavaScript 通过CSS定…