《Vue3 十》Vue 的底层原理

命令式编程和声明式编程:

以计时器为例:

// 原生 JavaScript 实现计数器,是命令式编程
<div>
    <h1>当前数字:<span class="count"></span></h1>
    <button class="add" @click="handleAdd">+1</button>
    <button class="sub" @click="handleDelete">-1</button>
</div>

const countEl = document.querySelector('.count')
const addEl = document.querySelector('.add')
const subEl = document.querySelector('.sub')

let count  = 0
countEl.textContent = count

addEl.onclick =function () {
    count++;
    countEl.textContent = count
}
subEl.onclick =function () {
    count--;
    countEl.textContent = count
}
// Vue 实现计时器,是声明式编程
<div id="app">
    <h1>当前数字:{
  
  {count}}</h1>
    <button @click="handleAdd">+1</button>
    <button @click="handleSub">-1</button>
</div>

const app = Vue.createApp({
    data() {
        return {
            count: 0,
        }
    },
    methods: {
        handleAdd: function() {
            this.count++;
        },
        handleSub: function() {
            this.count--;
        },
    }
})
app.mount('#app')
  1. 命令式编程:需要将要做的每一个步骤都编写一条代码,转化成一个个的命令告知浏览器。关注的是 how to do,自己完成整个 how 的过程。

    原生 JavaScript、jQuery 都是命令式编程。

  2. 声明式编程:需要哪些东西就声明哪些东西,具体如何实现不需要管,框架会帮助完成。关注的是 what to do,由框架完成 how 的过程。

    目前,Vue、React、Angular、小程序等都是声明式编程。

MVC 模型和 MVVM 模型:

MVC:

MVC,即 Model- View - Controller。

  1. Model:数据模型。负责保存应用数据,与后端数据进行同步。
  2. View:UI 视图。负责视图展示,将 Model 中的数据可视化出来。
  3. Controller:控制器。负责业务逻辑,根据用户行为对 Model 数据进行更改。

MVC 中所有的通信都是单向的。View 传送指令到 Controller;Controller 完成业务逻辑后,要求 Model 改变状态;Model 将新的数据发送到 View,用户得到反馈。
在这里插入图片描述

MVVM:

MVVM ,即 Model - View - ViewModel 。

  1. Model:数据模型。
  2. View:UI 视图。
  3. ViewModel:View 和 Model 的连接器。View 和 Model 通过 ViewModel 实现双向绑定,ViewModel 在底层做了大量的事情来实现数据变化更新视图,视图变化更新数据。

React、Vue、Angular 都是 MVVM 框架。

在这里插入图片描述

双向数据绑定的原理:

双向数据绑定:通过 Object.defineProperty()/Proxy 即数据变化更新视图,视图变化更新数据。Vue 的双向绑定原理是通过数据劫持结合发布者-订阅者模式的方式来实现的。通过 Object.defineProperty()/Proxy 劫持数据,在数据变化时发布消息给订阅者,通知所有的订阅者进行更新。

Vue2 的响应式原理:

Vue2 的响应式原理基于 Object.defineProperty() 实现,利用 Object.defineProperty() 中的 set() 方法对对象的属性进行劫持,监听到对象属性的改变,就自动执行依赖的代码。

手动实现 Vue2 的响应式:
// 1. 定义一个 watchFn 函数,接收一个回调函数,当其内部依赖到的数据发生变化时,自动执行该回调函数
let reactiveFn 
### Vue2 和 Vue3 的内部工作原理 #### Vue2 底层实现机制 Vue2 使用 `Object.defineProperty` 来追踪对象的变化并创建响应式系统。每当一个被监控的对象属性发生变化时,依赖于该属性的视图部分会自动更新。 ```javascript function defineReactive(obj, key, val) { const dep = new Dep(); Object.defineProperty(obj, key, { enumerable: true, configurable: true, get() { if (Dep.target) { dep.depend(); } return val; }, set(newVal) { if (newVal === val) return; val = newVal; dep.notify(); // Notify all subscribers that the data has changed. } }); } ``` 此方法遍历所有的对象属性,并为每一个设置 getter/setter 对象[^3]。 #### Vue3 底层实现机制 Vue3 则采用了更现代的方式——利用 JavaScript 中的新特性 Proxy 实现了更加高效的数据劫持方式。相比起 Vue2 的 `Object.defineProperty` 方法,Proxy 可以拦截更多的操作类型,并且可以处理动态添加/删除属性的情况而无需额外逻辑支持。 对于响应式的封装,在 Vue3 中引入了一个新的概念叫作 ref 和 reactive: - **ref**: 创建一个可变的状态变量,它是一个带有 `.value` 属性的对象。 ```typescript import { ref } from &#39;vue&#39;; let count = ref(0); console.log(count.value); // Output: 0 ``` - **reactive**: 将普通对象转换成响应式对象 ```typescript import { reactive } from &#39;vue&#39;; const state = reactive({ message: "Hello" }); console.log(state.message); // Output: Hello ``` 在 Reactivity 模块中定义了如何使这些状态成为响应性的核心逻辑,比如通过 `RefImpl` 类来管理单个值类型的响应性变化[^4]。 #### 渲染过程中的差异 当涉及到渲染流程时,两个版本都遵循类似的模式:即基于虚拟 DOM 进行高效的 UI 更新。然而具体细节上有所不同: - 在 Vue2 中,组件实例化之后会执行 `_init()` 函数初始化各种配置项以及生命周期钩子等;而在挂载阶段,则是通过调用 `$mount()` 完成真实DOM与虚拟DOM之间的关联[^5]。 - 而到了 Vue3 ,官方文档指出其优化了编译器生成 render function 的效率,并改进了 patching 算法使得 diff 计算更为精准快速[^1]。 综上所述,虽然两者都是围绕着 MVVM 设计理念构建起来的应用框架,但在技术选型和技术演进方面有着显著区别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值