Vue 2 和 Vue 3 之间响应式区别

一、响应式系统

Vue 2 的响应式系统

Vue 2 使用了基于依赖收集的观察模式。对于对象,Vue 2 会遍历对象属性,为每个属性创建一个 Watcher 实例,并在访问这些属性时收集依赖。当属性改变时,会通知相关的 Watcher 更新视图。

Vue 2 响应式原理代码示例
javascript 复制代码
Javascript
深色版本
// Vue 2 的数据响应式部分简化示例
function observe(value) {
  if (!value || typeof value !== 'object') {
    return;
  }
  new Observer(value);
}

function defineReactive(obj, key, val) {
  let dep = new Dep();
  Object.defineProperty(obj, key, {
    get() {
      Dep.target && dep.addDep(Dep.target);
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      dep.notify();
    }
  });
}

function initState(vm) {
  const opts = vm.$options;
  if (opts.data) {
    vm._data = data = opts.data;
    for (const key in data) {
      proxy(vm, '_data', key);
    }
    observe(data);
  }
}

function proxy(target, sourceKey, key) {
  Object.defineProperty(target, key, {
    get() {
      return target[sourceKey][key];
    },
    set(val) {
      target[sourceKey][key] = val;
    }
  });
}

class Dep {
  constructor() {
    this.deps = [];
  }
  addDep(dep) {
    this.deps.push(dep);
  }
  notify() {
    this.deps.forEach(dep => dep.update());
  }
}

Vue 3 的响应式系统

Vue 3 利用了 JavaScript 的 Proxy 对象来实现数据的响应性,这使得整个过程更为简洁和高效。Proxy 对象可以拦截对象的访问和修改操作,并执行相应的处理逻辑。

Vue 3 响应式原理代码示例
javascript 复制代码
Javascript
深色版本
import { reactive, effect } from 'vue';

const state = reactive({ count: 0 });

effect(() => {
  console.log('Count is now ', state.count);
});

state.count++; // 输出 "Count is now 1"

这里 reactive 创建了一个响应式对象,而 effect 则是一个副作用函数,它会在依赖的数据发生变化时自动重新运行。

二、Composition API

Vue 3 引入了 Composition API,这是一组新的 API,用于在 Vue 组件中以函数的方式组织和重用逻辑。与 Options API 相比,Composition API 更适合逻辑的复用和测试。

Vue 2 Options API 示例

xml 复制代码
Vue
深色版本
<template>
  <div>{{ count }}</div>
</template>

<script>
export default {
  data() {
    return {
      count: 0
    };
  },
  methods: {
    increment() {
      this.count++;
    }
  }
};
</script>

Vue 3 Composition API 示例

xml 复制代码
Vue
深色版本
<template>
  <div>{{ count }}</div>
</template>

<script>
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const count = ref(0);

    const increment = () => {
      count.value++;
    };

    onMounted(() => {
      console.log('Component mounted');
    });

    return {
      count,
      increment
    };
  }
};
</script>

三、其他改进

  • 性能优化:Vue 3 重构了渲染器,提高了性能。
  • TypeScript 支持:Vue 3 原生支持 TypeScript,提供了更好的类型定义和工具支持。
  • 构建工具:Vue 3 使用 Rollup 构建工具替代了 Webpack,提供了更好的 Tree-shaking 支持。
  • 依赖项更新:Vue 3 升级了许多底层依赖库,如 Lodash 至按需引入的 lodash-es。

总结

Vue 3 相对于 Vue 2 的主要改进在于响应式系统的现代化(使用 Proxy)、Composition API 的引入以及整体性能和类型的改进。这些变化使得 Vue 3 更加灵活、强大和易于维护。

相关推荐
为美好的生活献上中指13 分钟前
java每日精进 5.11【WebSocket】
java·javascript·css·网络·sql·websocket·网络协议
augenstern41644 分钟前
webpack重构优化
前端·webpack·重构
海拥✘1 小时前
CodeBuddy终极测评:中国版Cursor的开发革命(含安装指南+HTML游戏实战)
前端·游戏·html
寧笙(Lycode)1 小时前
React系列——HOC高阶组件的封装与使用
前端·react.js·前端框架
asqq81 小时前
CSS 中的 ::before 和 ::after 伪元素
前端·css
拖孩2 小时前
【Nova UI】十五、打造组件库之滚动条组件(上):滚动条组件的起步与进阶
前端·javascript·css·vue.js·ui组件库
苹果电脑的鑫鑫2 小时前
element中表格文字剧中可以使用的属性
javascript·vue.js·elementui
Hejjon2 小时前
Vue2 elementUI 二次封装命令式表单弹框组件
前端·vue.js
一丝晨光3 小时前
数值溢出保护?数值溢出应该是多少?Swift如何让整数计算溢出不抛出异常?类型最大值和最小值?
java·javascript·c++·rust·go·c·swift
小堃学编程3 小时前
前端学习(3)—— CSS实现热搜榜
前端·学习