vue2 跟 vue3的区别

一.vue3 支持碎片

  1. vue2中 template下所有的dom必须在一个根节点下
<template>
    <div>
        <div>一级目录</div>
    </div>
</template>
  1. vue3中则不需要在一个根节点下
<template>
    <div>一级目录</div>
    <div>二级目录</div>
</template>

二. Vue2是Options API Vue3是Composition API

  1. vue2是Options API 在代码里分成了不同的属性,数据 方法的声明位置不一样
<script>
export default {
  data() {
    return {
      list: [], // 在data中声明变量
    };
  },
  mounted() {},
  methods: {
    toClick() {},// 在methods中声明方法
  },
};
</script>

  1. vue3是Composition API, 直接在setup中声明
<script setup >
const list = [] // 声明变量
let toClick = ()=>{}//声明方法
</script>
  1. vue2中不管是用变量还是方法都得用this,vue3中因为有setup函数 所以访问变量还是方法都不需要用this 直接就能访问

三. v-if和v-for的优先级

  1. vue2中 当v-if跟v-for同时使用时,v-for的优先级高于v-if
  2. vue3中 当v-if跟v-for同时使用时,v-if的优先级高于v-for

四. 响应式的原理改变了

  1. vue2中 双向数据绑定是利用了ES5中的 Object.definePropert() 对数据进行劫持 结合发布订阅模式的方法来实现
  2. vue3中使用了ES6的Proxy API对数据代理
  3. 优点:defineProperty只能监听某个属性 监听对象跟数组的需要遍历每一个属性 而使用Proxy代理后就可以直接监听到数组或对象内部的变化

五. 生命周期变化

vue3中把beforeCreate和created取消掉 直接用setup来代替 
开始创建组件之前,在 beforeCreate 和 created 之前执行,创建的是 data 和 method
vue2生命周期          vue3声明周期
beforeCreate   ==    setup()            // 开始创建组件之前,在 beforeCreate 和 created 之前执行,创建的是 data 和 method
created        ==    setup()            // 开始创建组件之前,在 beforeCreate 和 created 之前执行,创建的是 data 和 method
beforeMount    ==    onBeforeMount      // vue3中把beforeMount改名为onBeforeMount  组件挂载到节点上之前执行
mounted        ==    onMounted          // vue3中把mounted改名为onMounted  组件挂载完成后执行
beforeUpdate   ==    onBeforeUpdate     // vue3中把beforeUpdate改名为onBeforeUpdate 组件更新之前执行
updated        ==    onUpdated          // vue3中把updated改名为onUpdated  组件更新完成之后执行
beforeDestroy  ==    onBeforeUnmount    // vue3中把beforeDestroy改名为onBeforeUnmount  组件卸载之前执行
destroyed      ==    onUnmounted        // vue3中把destroyed改名为onUnmounted 组件卸载完成后

六.ref toRef reactive toRefs

  1. ref 可以定义一个响应式的数据,使用时需要用该对象的.value属性才能拿到数据,页面显示时不需要.value 一般用来定义基本数据类型
  2. reactive 可以定义一个引用数据类型的数据 除js的基本数据类型之外 用来定义对象 数组 之类 不需要用.value来获取数据
  3. toRef 可以将对象中的某一个属性变成响应式的数据 修改通过toRef的响应式数据 数据会改变 页面中的数据也会改变
  4. toRefs 可以将整个对象的属性都变成响应式的数据

总结:使用ref 跟 reactive 定义的数据都可以响应式 但如果进行了解构赋值的话 响应式就会失效 就得使用 toRef 或 toRefs来进行解构赋值 这样解构出来的数据才是响应式的

<template>
  <div @click="toChange()" class="btnStyle">
    +1
    <div>
      {{ num }}
    </div>
  </div>
  <div @click="toChangeAge()" class="btnStyle">
    年龄 +1
    <div>
      {{ personObj.age }}
    </div>
  </div>
  <div @click="toChangePerAge()" class="btnStyle">
    解构赋值后 年龄 +1
    <div>
      {{ age }}
    </div>
  </div>

  <div @click="toChangename()" class="btnStyle">
    toRef 或 toRefs NAME 变 小明
    <div>
      {{ name }}
    </div>
  </div>
</template>
<script setup >
import { ref, reactive, toRef, toRefs } from "vue";
const num = ref(0); // 使用ref声明一个基本类型的响应式数据
let toChange = () => {
  num.value = num.value + 1; // 触发这个方法时 数据跟页面中的数据都会改变
};
const personObj = reactive({
  // 使用 reactive 声明一个对象类型的响应式数据
  name: "小红",
  age: 0,
});
let toChangeAge = () => {
  personObj.age = personObj.age + 1; // 方法触发时 数据跟页面中的数据也会改变
};

let { age } = personObj; // 使用解构赋值
let toChangePerAge = () => {
  age = age + 1;
  console.log(age); //  数据修改了 但是页面中的数据没有修改  失去了响应式
};

let name = toRef(personObj, "name"); // 使用 toRef 解构赋值  使用toRefs一样

console.log(name);
let toChangename = () => {
  name.value = "小明"; //  数据修改了 但是页面中的数据也修改  保持响应式
};
</script>
<style scoped>
.btnStyle {
  margin-top: 10px;
  text-align: center;
  background: pink;
}
</style>

七.新增 teleport 组件 “定点传送”

<template>
  <div>1</div>
  <div>2</div>
  <div>3</div>

  <teleport to="#app">
    <div>被插到app后面</div>
  </teleport>
</template>

teleport组件的内容被定点渲染到id是app的dom后面了 to可以是’#id’ ‘.class’ ‘div’

八.vue2中的mixins和vue3中的hooks

  1. vue2中的mixins 是将vue文件的script部分抽离出来 放到mixin.js中 然后再有需要的vue文件中引入 mixin.js文件 并且在vue页面中 mixins 中写入引入的方法

mixin.js

let task = {
  data() {
    return {

    }
  },
  created() {

  },
  methods: {
    clickHandel() {
      console.log('我是mixins clickHandel的方法');
    },
  },
}
export default task

vue文件

  <template>
  <div>
    <p style="margin: 20px 0">
      <el-button @click="allSelection">全选</el-button>
    </p>
  </div>
</template>

  <script>
import task from "../mixins/index.js"; //引入mixin.js文件
export default {
  mixins: [task], //在mixins中添加
  data() {
    return {};
  },
  mounted() {},
  methods: {
    allSelection() {
      task.methods.allSelection(); //调用方法
    },
  },
};
</script>
  1. vue3中的hooks是直接将公共函数抽离出来放到hooks.js中 在有需要的vue文件中直接引用
    hooks.js
let task = {}
task.toGetDom = (val)=>{
    return '我是hooks方法返回的数据'
}
export default task

vue文件

  <div>
    <div @click="toGetDom">点击获取</div>
  </div>
</template>

<script setup>
import task from "../hooks/index.js"; // 引入hooks文件
let toGetDom = () => {
  console.log(task.toGetDom()); //直接调用hooks文件里的方法
};
</script>

总结:vue2中mixins 组件中引入多个mixinjs的话会导致变量的来源不明确 不利于代码维护 并且如果有重复的命名的数据或者方法的时候不会合并 会导致冲突 组件中的命名重复的变量或方法 会覆盖掉mixins中的变量或方法 多个mixins文件重复的变量和方法 会按照引入的顺序 后面的覆盖前面的
vue3中的hooks 在vue页面中引入的时候是显式引入 很明确就能知道 方法或变量来自那个文件

九.默认的打包工具改变

  1. vue2中默认的打包工具是 Webpack
  2. vue3中默认的打包工具是 Vite
    总结:
    Webpack对于大项目文件的时候启动编译或者热更新都会很慢 但首屏加载的时候很快
    Vite 启动编译跟热更新都跟快 但是首屏加载就很慢
    各有利弊

十.默认的状态管理器改变

未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 2和Vue 3之间有一些显著的区别,以下是其中一些主要的区别: 1. 性能优化:Vue 3在内部进行了大量的性能优化,包括更快的渲染速度和更小的包大小。Vue 3引入了新的响应式系统,使用Proxy代替了Object.defineProperty,这使得在处理大型数据集时性能更好。 2. 组合API:Vue 3引入了组合API,它提供了一种新的组织组件逻辑的方式。与Vue 2中的选项式API相比,组合API可以更好地组织和重用逻辑代码,使得代码更加清晰和可维护。 3. Teleport(传送门):Vue 3引入了Teleport功能,它允许你将组件的内容渲染到DOM树中的任意位置。这对于在组件外部渲染弹出窗口、模态框等内容非常有用。 4. Fragment(片段):Vue 3允许使用Fragment组件来包装多个元素而无需添加额外的DOM容器。这样可以减少DOM层级,提高性能并改善代码结构。 5. Composition API(组合式API):组合API是Vue 3中最显著的变化之一。它允许开发者通过逻辑相关的功能组合在一起,而不是按照选项的方式将它们分散在不同的生命周期钩子和方法中。 6. TypeScript 支持:Vue 3对TypeScript的支持更加友好。它提供了更好的类型推断和类型检查,使得在使用TypeScript开发Vue应用时更加方便。 这些只是Vue 2和Vue 3之间一些主要的区别,还有其他一些细微的变化和改进。迁移到Vue 3需要注意这些差异,并根据目标版本进行相应的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值