首页 > 其他分享 >Vue 2 和 Vue 3 之间响应式区别

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

时间:2024-10-19 18:52:36浏览次数:3  
标签:count Vue 区别 dep 响应 API key data

一、响应式系统

Vue 2 的响应式系统

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

Vue 2 响应式原理代码示例
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
深色版本
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 示例
Vue
深色版本
<template>
  <div>{{ count }}</div>
</template>

<script>
export default {
  data() {
    return {
      count: 0
    };
  },
  methods: {
    increment() {
      this.count++;
    }
  }
};
</script>
Vue 3 Composition API 示例

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 更加灵活、强大和易于维护。

原文:https://juejin.cn/post/7426954121309962250

标签:count,Vue,区别,dep,响应,API,key,data
From: https://blog.csdn.net/gaotlantis/article/details/143082359

相关文章

  • jython和python的区别是什么
    我们通常意义上说的python是cpython,也就是完全用C实现的python,它支持C的扩展,不支持java什么的扩展。jython是完全用jython实现的python,它支持用java扩展,貌似无法用C扩展。jython用途比较少。主要在两个场景下:1、操作系统不提供cpython,只有JAVA可以用。比如sun工作站,或者......
  • 【开题报告】基于django+vue企业设备管理系统(论文+源码)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着企业规模的扩大和生产设备的日益复杂化,设备管理工作逐渐成为企业运营中不可或缺的一环。传统的人工管理方式不仅效率低下,而且容易出错......
  • abort与close有哪些区别
    abort与close的区别是:1、功能不同;2、用法不同;3、影响范围不同;4、错误处理不同。abort函数用于终止程序的执行,一旦调用该函数,程序会立即停止并退出。而close函数用于关闭打开的文件,关闭后该文件不能再被访问或操作。一、abort与close的区别在计算机编程中,abort和close都是用来......
  • 720和1080p区别
    720和1080p内容和尺寸大小没有区别,只是在像素上面有区别。720p的分辨率低于1080p的分辨率。1080P是指分辨率达到1920X1080,720p是指分辨率为1280X720。720P又叫半高清,或者叫标准高清,是高清的最低标准,只有达到了720P这个标准才能叫高清视频。一、720和1080p区别720和1080p内容......
  • Activiti 和 Spring Web Flow 有哪些区别
    Activiti和SpringWebFlow的区别是:1、设计目标不同;2、架构不同;3、用户界面不同;4、扩展性不同。Activiti是一个开源的工作流和业务流程管理系统,用于自动化业务流程和工作流的管理。Activiti提供了一个强大的引擎来执行业务流程,同时还提供了一组用于开发和管理流程的工具。......
  • Access与Excel最重要的区别是什么
    Excel和Access之间的主要区别在于Excel是电子表格程序,而Access是数据库程序。Access使用ID号来存储数据,并且此列表是完全可编辑的,但在Excel工作表中,数据将存储在行和列中。一、Access与Excel最重要的区别Excel和Access之间的主要区别在于Excel是电子表格程......
  • web端ant-design-vue-Anchor锚点组件使用小节(2)
     项目开发中有幸遇到了更细化的页面滚动问题,详情中我有多个履约节点子模块,除了正常的锚点和页面联动之外,客户希望我从列表中点击某个履约模块子节点,跳转到选中的履约模块子节点下面;如果没有子节点模块,则跳转到父级履约节点模块。实现这个功能大概这么两步,1、在子节点配置好......
  • web端ant-design-vue-Anchor锚点组件使用小节(1)
     web端ant-design-vue-Anchor锚点组件使用小节。项目开发中如果要实现前端页面平滑滚动到指定的位置,Anchor组件是一个好的选择,灵活且平滑,能满足常见的项目需求。最近开发中幸运的用到这个组件,从此对她爱不释手。下面就把开发中遇到的一些问题及源码整理出来,供以后查看和有缘......
  • 基于Spring Boot+VUE 时间管理系统(高分毕设)
    文章目录文章目录一、系统需求分析二、系统设计三、系统页面1管理员功能模块2用户功能模块四、资源下载链接 一、系统需求分析        通过前面的功能分析可以将时间管理系统的功能分为管理员,用户两个部门,系统的主要功能包括首页,个人中心,系统公告管理,用户管......
  • 基于Spring Boot+VUE 生鲜交易系统(高分毕设)
    文章目录文章目录一、系统需求分析二、系统设计概念模型设计三、系统页面1系统功能模块2后台功能模块2.1用户功能2.2商家功能2.3管理员功能四、资源下载链接 一、系统需求分析考虑到实际生活中在生鲜交易方面的需要以及对该系统认真的分析,将系统权限按管理员,......