Vue3和Vue2的区别

根标签


Vue2

  • Templata只支持一个根标签

    <template>
    </template>

Vue3

  • Templata支持多个根标签

    <template>
    </template>

初始化方法


Vue2

  • 使用 new Vue(), 参数是new Vue({template, render})

    import Vue from 'vue';
    import router from './routers/';
    import store from './stores';
    import App from './App.vue';
    const app = new Vue({
    router,
    store,
    render: h => h(App)
    }).$mount('#app');

Vue3

  • 使用 createApp() 参数是 createApp(组件)

    import { createApp } from 'vue';
    import App from './App.vue';
    import { router } from './router';
    const app = createApp(App).use(router).mount('#app');

挂载容器


Vue2

  • 可以通过el选项和$mount()方法来挂载容器

    new Vue({
    el:'容器名字 '
    })
    new Vue({
    }).$mount('容器名字')

Vue3

  • 只能通过mount()方法来挂载容器

    Vue.createApp({
    }).mount('容器名字')

data选项


Vue2

  • data选项可以是一个对象,也可以是一个方法(由方法返回一个对象)

    new Vue({
    el:'容器名字 ',
    data:{
    }
    //或者
    new Vue({
    el:'容器名字 ',
    data () {
    return { }
    }
    })
    })

Vue3

  • data选项只能是一个方法,由方法返回一个对象

    Vue.createApp({
    data(){
    return{}
    }
    }).mount('容器名字')

响应式原理


Vue2的响应式

核心:

  • 对象: 通过defineProperty对对象的已有属性值的读取和修改进行劫持(监视/拦截)

  • 数组: 通过重写数组更新数组一系列更新元素的方法来实现元素修改的劫持

    Object.defineProperty(data, 'count', {
    get () {},
    set () {}
    })

问题:

  • 对象直接新添加的属性或删除已有属性, 界面不会自动更新
  • 直接通过下标替换元素或更新length, 界面不会自动更新 arr[1] = {}

Vue3的响应式

核心:

  • 通过 Proxy(代理):拦截对data任意属性的任意(13种)操作, 包括属性值的读写, 属性的添加, 属性的删除等...

  • 通过 Reflect(反射):动态对被代理对象的相应属性进行特定的操作

    new Proxy(data, {
    // 拦截读取属性值
    get (target, prop) {
    return Reflect.get(target, prop)
    },
    // 拦截设置属性值或添加新属性
    set (target, prop, value) {
    return Reflect.set(target, prop, value)
    },
    // 拦截删除属性
    deleteProperty (target, prop) {
    return Reflect.deleteProperty(target, prop)
    }
    })

    proxy.name = 'tom'

Vue3的响应式数据的核心原理

简单实现,代码如下:

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Proxy 与 Reflect</title>
</head>
<body>
  <script>
    
    const user = {
      name: "John",
      age: 12
    };

    /* 
    proxyUser是代理对象, user是被代理对象
    后面所有的操作都是通过代理对象来操作被代理对象内部属性
    */
    const proxyUser = new Proxy(user, {

      get(target, prop) {
        console.log('劫持get()', prop)
        return Reflect.get(target, prop)
      },

      set(target, prop, val) {
        console.log('劫持set()', prop, val)
        return Reflect.set(target, prop, val); // (2)
      },

      deleteProperty (target, prop) {
        console.log('劫持delete属性', prop)
        return Reflect.deleteProperty(target, prop)
      }
    });
    // 读取属性值
    console.log(proxyUser===user)
    console.log(proxyUser.name, proxyUser.age)
    // 设置属性值
    proxyUser.name = 'bob'
    proxyUser.age = 13
    console.log(user)
    // 添加属性
    proxyUser.sex = '男'
    console.log(user)
    // 删除属性
    delete proxyUser.sex
    console.log(user)
  </script>
</body>
</html>

Vue3更好的 ts 支持

  • vue2 不适合使用 ts,在于它的 Options API 风格。
  • options 是一个简单的对象,而 ts 是一种类型系统、面向对象的语法,两个不匹配。
  • vue3 新增了 defineComponent 函数,使组件在 ts 下,更好的利用参数类型推断。如:reactive 和 ref 很具有代表性。
Vue3更先进的组件

Fragment

  • vue2 中,每个模板必须有一个根节点,否则就会报错。
  • vue3 中可以不需要根节点,多个元素或标签可并列存在。

Teleport

  • 可以把 teleport 中的内容添加到任意的节点内,对于嵌套较深的组件来说绝对是一个福音。

Supense

  • 允许程序在等待异步组件渲染一些后备的内容,可以让我们创建一个平滑的用户体验。
Vue3新推出的组合式API
  • Vue2:定义方法的时候需要写在methods里面,后添加的属性是非响应式的。页面不更新。需要用get()和set()方法
  • Vue3:组合式API的作用是将原来分散开来定义的数据、方法、计算属性、监听器、组合起来定义一个完整的业务。

生命周期


vue2的生命周期


vue2.png

vue3的生命周期


vue3.png

与 2.x 版本生命周期相对应的组合式 API

  • beforeCreate -> 使用 setup()
  • created -> 使用 setup()
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeDestroy -> onBeforeUnmount
  • destroyed -> onUnmounted
  • errorCaptured -> onErrorCaptured

组合式 API 还提供了以下调试钩子函数:

  • onRenderTracked
  • onRenderTriggered

例子

演示各个生命周期钩子

父组件App

复制代码
<template>
  <h2>App</h2>
  <button @click="isShow=!isShow">切换</button>
  <hr>
  <Child v-if="isShow"/>
</template>

<script lang="ts">
import Child from './Child.vue'
export default {

  data () {
    return {
      isShow: true
    }
  },

  components: {
    Child
  }
}
</script>

子组件Child

复制代码
<template>
<div class="about">
  <h2>msg: {{msg}}</h2>
  <hr>
  <button @click="update">更新</button>
</div>
</template>

<script lang="ts">
import {
  ref,
  onMounted,
  onUpdated,
  onUnmounted, 
  onBeforeMount, 
  onBeforeUpdate,
  onBeforeUnmount
} from "vue"

export default {
  beforeCreate () {
    console.log('beforeCreate()')
  },

  created () {
    console.log('created')
  },

  beforeMount () {
    console.log('beforeMount')
  },

  mounted () {
    console.log('mounted')
  },

  beforeUpdate () {
    console.log('beforeUpdate')
  },

  updated () {
    console.log('updated')
  },

  beforeUnmount () {
    console.log('beforeUnmount')
  },

  unmounted () {
     console.log('unmounted')
  },
  
  setup() {

    const msg = ref('abc')

    const update = () => {
      msg.value += '--'
    }

    onBeforeMount(() => {
      console.log('--onBeforeMount')
    })

    onMounted(() => {
      console.log('--onMounted')
    })

    onBeforeUpdate(() => {
      console.log('--onBeforeUpdate')
    })

    onUpdated(() => {
      console.log('--onUpdated')
    })

    onBeforeUnmount(() => {
      console.log('--onBeforeUnmount')
    })

    onUnmounted(() => {
      console.log('--onUnmounted')
    })
    
    return {
      msg,
      update
    }
  }
}
</script>

最后编辑于:2024-09-27 20:39:01
© 著作权归作者所有,转载或内容合作请联系作者

喜欢的朋友记得点赞、收藏、关注哦!!!

相关推荐
周杰伦_Jay几秒前
【终端使用MySQL】MySQL 数据库核心操作全解析:从入门到性能优化
数据库·mysql·性能优化
sg_knight23 分钟前
Spring Cloud与RabbitMQ深度集成:从入门到生产级实战
java·spring boot·spring·spring cloud·消息队列·rabbitmq·stream
ManageEngineITSM1 小时前
IT 服务自动化的时代:让效率与体验共进
运维·数据库·人工智能·自动化·itsm·工单系统
Chan161 小时前
批处理优化:从稳定性、性能、数据一致性、健壮性、可观测性五大维度,优化批量操作
java·spring boot·后端·性能优化·java-ee·intellij-idea·优化
行者阿毅1 小时前
langchain4j+DashScope (通义千问)文生图
java·ai作画
Bug退退退1231 小时前
Java 网络流式编程
java·服务器·spring·sse
IT机器猫1 小时前
RabbitMQ
java·rabbitmq·java-rabbitmq
小杨的全栈之路1 小时前
冒泡、插入、选择、归并、堆排序:从名字由来到Java实现,一篇讲透
java·排序算法
QotomPC1 小时前
软件定义的理想硬件平台:Qotom Q30900SE/UE系列在AIO服务器与边缘网关中的实践
运维·服务器
捷智算云服务1 小时前
H200服务器维修服务体系构建:捷智算的全链条保障方案
运维·服务器