当前位置:首页 > VUE

vue mvvm 实现

2026-03-27 19:09:45VUE

Vue MVVM 实现原理

Vue.js 是一个基于 MVVM(Model-View-ViewModel)模式的前端框架。MVVM 的核心思想是将视图(View)与数据(Model)分离,通过 ViewModel 实现双向绑定。

核心机制

数据劫持(Data Observation) Vue 使用 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)对数据进行劫持。当数据发生变化时,能够自动触发视图更新。

// Vue 2.x 数据劫持示例
const data = { name: 'Vue' };
Object.defineProperty(data, 'name', {
  get() {
    return this._name;
  },
  set(newVal) {
    console.log('数据更新了');
    this._name = newVal;
  }
});

依赖收集(Dependency Collection) Vue 通过 Dep 类和 Watcher 类实现依赖收集。每个响应式属性都有一个 Dep 实例,用于存储依赖它的 Watcher。

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

class Watcher {
  update() {
    console.log('视图更新');
  }
}

模板编译(Template Compilation) Vue 将模板编译为渲染函数。在编译过程中,解析指令和插值表达式,并建立数据与视图的绑定关系。

// 模板转换为渲染函数
<div>{{ message }}</div>
// 编译为
function render() {
  return _c('div', [_v(_s(message))]);
}

双向绑定实现

v-model 原理 v-model 是语法糖,结合了 :value@input 实现双向绑定。

<input v-model="text">
<!-- 等价于 -->
<input :value="text" @input="text = $event.target.value">

发布-订阅模式 ViewModel 作为中介,监听 Model 的变化并更新 View,同时监听 View 的事件并更新 Model。

// 简化版实现
function observe(data) {
  Object.keys(data).forEach(key => {
    let value = data[key];
    const dep = new Dep();
    Object.defineProperty(data, key, {
      get() {
        if (Dep.target) {
          dep.addSub(Dep.target);
        }
        return value;
      },
      set(newVal) {
        value = newVal;
        dep.notify();
      }
    });
  });
}

虚拟 DOM 优化

Vue 使用虚拟 DOM 来高效更新视图。当数据变化时,先对比新旧虚拟 DOM 的差异,再最小化地更新真实 DOM。

// 虚拟 DOM 示例
const vnode = {
  tag: 'div',
  props: { id: 'app' },
  children: [{ tag: undefined, text: 'Hello' }]
};

生命周期管理

Vue 组件有完整的生命周期,从创建到销毁,每个阶段都有对应的钩子函数可供操作。

export default {
  created() {
    console.log('组件创建完成');
  },
  mounted() {
    console.log('DOM 挂载完成');
  }
};

响应式系统升级(Vue 3)

Vue 3 改用 Proxy 实现响应式,解决了 Vue 2 中无法检测数组和对象属性增删的问题。

vue mvvm 实现

// Vue 3 响应式实现
const reactive = (target) => {
  return new Proxy(target, {
    get(target, key) {
      track(target, key);
      return target[key];
    },
    set(target, key, value) {
      target[key] = value;
      trigger(target, key);
    }
  });
};

通过以上机制,Vue 实现了完整的 MVVM 架构,使开发者能够专注于业务逻辑,而不必手动处理 DOM 操作。

标签: vuemvvm
分享给朋友:

相关文章

vue实现图片搜索

vue实现图片搜索

Vue实现图片搜索功能 使用HTML5的File API获取图片 通过<input type="file">元素让用户选择图片文件,使用FileReader对象读取图片数据。 <t…

拖拽式编程vue实现

拖拽式编程vue实现

拖拽式编程在 Vue 中的实现方法 使用 HTML5 原生拖放 API Vue 可以结合 HTML5 的拖放 API 实现基础拖拽功能。通过 draggable 属性标记可拖拽元素,监听 dragst…

vue实现打字机

vue实现打字机

Vue实现打字机效果 在Vue中实现打字机效果可以通过动态更新文本内容并添加延迟来实现。以下是几种常见的实现方法: 使用setInterval实现 <template> <…

vue实现压缩上传文件

vue实现压缩上传文件

压缩上传文件的实现方法 在Vue中实现文件压缩和上传功能,可以通过以下步骤完成。该方法结合了前端文件压缩库和HTTP请求,确保文件在上传前被有效压缩。 安装必要的依赖 需要使用compressorj…

vue实现点击页面切换

vue实现点击页面切换

实现点击页面切换功能 在Vue中实现点击页面切换功能,可以通过路由跳转或组件动态渲染两种方式完成。以下是具体实现方法: 使用Vue Router实现页面跳转 安装Vue Router后,在项目中配置…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…