六十九、Vue3

news2025/4/8 11:59:22

Vue3

  • 一 Vue3的变化
  • 二 创建Vue3项目的两种方式
    • 2.1 vue-cl创建
    • 2.2 vite创建
  • 三 常用API
    • 3.1 setup
    • 3.2 ref和reactive
    • 3.3 计算和监听属性
    • 3.4 生命周期
    • 3.5 自定义hook函数

一 Vue3的变化

  1. 性能的提升
    打包大小减少41%

    初次渲染快55%, 更新渲染快133%

    内存减少54%

  2. 源码的升级
    使用Proxy代替defineProperty实现响应式

    重写虚拟DOM的实现和Tree-Shaking

  3. 拥抱TypeScript
    Vue3可以更好的支持TypeScript

  4. 新的特性
    Composition API(组合API)

    setup配置
    ref与reactive
    watch与watchEffect
    provide与inject
    新的内置组件

    Fragment
    Teleport
    Suspense
    其他改变

    新的生命周期钩子
    data 选项应始终被声明为一个函数
    移除keyCode支持作为 v-on 的修饰符

  5. 组合式API和配置项API
    使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改 。

    组件中的template标签可以没有根标签

二 创建Vue3项目的两种方式

2.1 vue-cl创建

vue-cli创建和之前创建vue2一样,选择vue版本时选择3.x即可。

2.2 vite创建

创建的项目将使用基于 Vite 的构建设置,并允许我们使用 Vue 的单文件组件 (SFC)。

  1. 在终端输入以下命令

    npm init vue@latest
    

    在这里插入图片描述

  2. cd到项目文件夹,执行npm install,然后执行npm run dev
    npm run dev

  3. 项目启动成功,访问网址。
    在这里插入图片描述

  4. 也可在vscode中打开项目文件夹
    在这里插入图片描述

三 常用API

3.1 setup

  1. setup为Vue3.0中一个新的配置项,值为一个函数

  2. setup是所有Composition API(组合API)编写的位置

  3. 组件中所用到的:数据、方法等等,均要配置在setup中

  4. setup函数的返回值:返回一个对象,对象中的属性、方法, 在模板中均可以直接使用

    注意:

    尽量不要与Vue2.x配置混用

    Vue2.x配置(data、methos、computed…)中可以访问到setup中的属性、方法。
    但在setup中不能访问到Vue2.x配置(data、methos、computed…)。
    如果有重名, setup优先。

<template>
  {{ name }}
  <br>
  {{ age }}
  <br>
  <button @click="ageAdd">点击年龄+1</button>
</template>

<script>
export default {
  name: 'App',
  created(){
    console.log(this)
  },
  setup() {
    let name = 'xuxiaoxu'
    let age = 18
    console.log(this)
    let ageAdd = () => {
      age++
      console.log(age)
    }

    return {
      name, age,ageAdd
    }
  }
}
</script>

在这里插入图片描述
注意:

  1. setup函数中没有了this,在setup函数外是有this的,但是不是Vc实例了,而变成了Proxy实例。
    在这里插入图片描述
  2. 所有的变量和方法都在setup函数中写。
  3. 定义了变量,变量可以渲染,但是没有响应式,值变了,但是渲染的值没有跟着改变。
  4. setup必须要有返回值,返回的值才能在模板中使用。

3.2 ref和reactive

  • 作用: 定义一个响应式的数据

  • 语法: const 变量= ref(值)

    创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。
    JS中操作数据: 变量.value
    模板中读取数据: 不需要.value,直接:

    {{变量}}

<template>
  {{ name }}
  <br>
  {{ age }}
  <br>
  <button @click="ageAdd">点击年龄+1</button>
</template>

<script>
import { ref } from 'vue'

export default {
  name: 'App',
  setup() {
    let name = ref('xuxiaoxu')
    let age = ref(18)
    console.log(name)
    console.log(age)
    let ageAdd = () => {
      age.value++
      console.log(age.value)
    }

    return {
      name, age,ageAdd
    }
  }
}
</script>

在这里插入图片描述

  • 接收的数据可以是:基本类型、也可以是对象类型。

    基本类型的数据:响应式依然是靠Object.defineProperty()的get与set完成的

    对象类型的数据:内部 求助 了Vue3.0中的一个新函数—— reactive函数

<template>
  {{ info.name }}
  <br>
  {{ info.age }}
  <br>
  <button @click="info.ageAdd">点击年龄+1</button>
</template>

<script>
import { reactive } from 'vue'
export default {
  name: 'App',
  setup() {
    let info = reactive({
      name: 'xuxiaoxu',
      age: 18
    })
    info.ageAdd = () => {
      info.age += 1
      console.log(info.age)
    }
    console.log(info)

    return {
      info
    }
  }
}
</script>

在这里插入图片描述
对象在渲染时直接对象点key就可以获取到value,也可以直接给对象添加方法。

3.3 计算和监听属性

computed函数使用

<template>
  <p>姓:<input type="text" v-model="info.firstName"></p>
  <p>名:<input type="text" v-model="info.lastName"></p>
  <p>全名:<input type="text" v-model="info.fullName"></p>
</template>

<script>
import { computed, reactive } from 'vue'
export default {
  name: 'App',
  setup() {
    const info = reactive({
      firstName: '',
      lastName: ''
    })
    info.fullName = computed({
      get() {
        return info.firstName + '_' + info.lastName
      },
      // 修改属性会执行set函数,并将修改后的值传入
      set(val) {
        console.log(val)
        let strArray = val.split('_')
        info.firstName = strArray[0]
        info.lastName = strArray[1]
      }
    })

    return {
      info
    }
  }
}
</script>

在这里插入图片描述
watch函数

<template>
  <p><input type="text" v-model="name">{{ name }}</p>
</template>

<script>
import { watch, ref, watchEffect } from 'vue'
export default {
  name: 'App',
  setup() {
    const name = ref('xuxiaoxu')
    watch(name, (value, oldvalue) => {
      console.log(value)
      console.log(oldvalue)
    })

    watchEffect(()=>{
      // 只有当watchEffect里使用的变量值改变才会执行该函数
      let a = name.value
      console.log('执行了')
    })

    return {
      name
    }
  }
}
</script>

在这里插入图片描述

3.4 生命周期

在这里插入图片描述

  1. beforeCreate:在组件实例初始化完成之后立即调用。组合式 API 中的 setup() 钩子会在所有选项式 API 钩子之前调用,beforeCreate() 也不例外。
  2. created:在组件实例处理完所有与状态相关的选项后调用。当这个钩子被调用时,以下内容已经设置完成:响应式数据、计算属性、方法和侦听器。然而,此时挂载阶段还未开始,因此 $el 属性仍不可用。
  3. beforeMount:在组件被挂载之前调用。当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。这个钩子在服务端渲染时不会被调用。
  4. mounted:在组件被挂载之后调用。这个钩子在服务端渲染时不会被调用。
  5. beforeUpdate:在组件即将因为一个响应式状态变更而更新其 DOM 树之前调用。
  6. updated:在组件因为一个响应式状态变更而更新其 DOM 树之后调用。
  7. beforeUnmount:在一个组件实例被卸载之前调用。当这个钩子被调用时,组件实例依然还保有全部的功能。
  8. 在一个组件实例被卸载之后调用。可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。
<template>
  <h1>生命周期</h1>
  <hr>
  <button @click="handleClick">点我消失</button>
  <Child v-if="show"></Child>


</template>

<script>
import Child from "./components/Child.vue";
import { ref } from 'vue'

export default {
  name: 'App',
  components: { Child },
  setup() {
    let show = ref(true)
    const handleClick = () => {
      show.value = !show.value
    }
    return {
      show, handleClick
    }

  }
}
</script>
<template>
    <h1>我是Child组件</h1>
  </template>
  
  <script>
  import {onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted} from 'vue'
  
  export default {
    name: 'Child',
    setup() {
      console.log('组合式api的beforeCreate')
      console.log('组合式api的created')
      onBeforeMount(() => {
        console.log('组合式api的onBeforeMount')
      })
      onMounted(() => {
        console.log('组合式api的onMounted')
      })
      onBeforeUpdate(() => {
        console.log('组合式api的onMounted')
      })
      onBeforeUnmount(() => {
        console.log('组合式api的onBeforeUnmount')
      })
      onUnmounted(() => {
        console.log('组合式api的onUnmounted')
      })

      return{}
  
    }
  }
  </script>

在这里插入图片描述

3.5 自定义hook函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 并行任务,这才是优雅的实现方式!

Spring Boot 的定时任务&#xff1a; 第一种&#xff1a;把参数配置到.properties文件中&#xff1a; 代码&#xff1a; package com.accord.task;import java.text.SimpleDateFormat; import java.util.Date;import org.springframework.scheduling.annotation.Scheduled; …

不会Python迟早失业?Python何以成为找工作必备技能(资料下载)

前言 大数据时代&#xff0c;没听说过Python的人可能很少。&#xff08;文末送福利&#xff09; 未来和data与AI紧密连接的当下&#xff0c;金融公司纷纷改成Fintech&#xff08;financial technology&#xff09;&#xff0c;投行热衷于向科技公司砸钱&#xff0c;就连卖汉堡…

推进生态社会化分工 与伙伴共担未来 数商云受邀出席京东科技合作伙伴论坛

11月1日&#xff0c;2022京东云城市峰会上海站正式启幕。京东科技携手生态伙伴&#xff0c;共聚“合作伙伴论坛”。作为京东集团科技生态的总担当&#xff0c;京东科技秉承“生态社会化分工”理念&#xff0c;与伙伴共担未来。会上&#xff0c;8大场景合作案例依次分享&#xf…

STM32单片机可变频率幅度DDS信号发生器正弦波三角波方波AD9833

实践制作DIY- GC0094-DDS信号发生器 一、功能说明&#xff1a; 基于STM32单片机设计-DDS信号发生器 功能介绍&#xff1a; 硬件组成&#xff1a;STM32F103C系列最小系统板 LCD1602显示器AD9833信号模块4*4矩阵键盘多个按键 1.通过4*4键盘来设定频率值和三角波正弦波的幅度&…

内网搭建图片网站:软件安装配置 1-3

现代的手机功能越来越强大&#xff0c;也让我们能随时随地抓拍有趣瞬间。而照片越来越多&#xff0c;全都存放在手机上并不现实&#xff0c;存在云端又有安全隐患&#xff0c;只能存放在自己的电脑上。而这又带来难以随时与他人分享的问题。不过&#xff0c;我们完全可以在自己…

智能网联赋能汽车品牌全球化 第五届全球汽车发展趋势论坛将召开

当前&#xff0c;全球汽车产业正处于百年未遇的大变革时期&#xff0c;全球汽车产业格局正在重塑&#xff0c;其中&#xff0c;中国汽车产业正在依靠智能化、网联化优势不断加深在全球汽车市场中的影响力&#xff0c;正在迈入高质量发展的新阶段。如何利用智能网联技术以及顺应…

单片机毕业设计 stm32智能婴儿床系统

文章目录1 简介2 项目背景3 设计概要4 设计方案5 硬件清单5.1 stm32主控5.2 OLED显示屏5.3 继电器模块5.4 L298N电机驱动板模块5.5 MAX声音传感模块 一个5.6 Jdy-311蓝牙模块5.7 音乐播放模块6 软件部分设计6.1 声音传感器子函数6.2 声音传感器软件7 实现效果8 关键代码1 简介 …

大数据行业现在工作很难找吗?

工作到底好不好找&#xff0c;市场需求是一方面&#xff0c;更多的还是要看个人成长背景和实际能力~ 抛开两点都不谈就单说好找或者不好找纯属有点耍流氓了~ 大数据开发主要是负责大数据挖掘&#xff0c;大数据清洗处理&#xff0c;大数据建模等&#xff0c;负责大规模数据的处…

C动态内存管理|有张三和如花的故事你心动了吗

C内存管理C程序地址空间为什么存在&#xff1f;1.堆区空间足够大2.堆区空间大小更为灵活动态内存函数mallocfreefree的注意事项内存泄漏没有free和free另外的细节不可对堆区的空间多次释放释放后要对指针置为NULL&#xff0c;避免野指针free(NULL)会有影响吗callocreallocreall…

报表工具怎么选?JAVA开源工具那么好用,为什么大家还花钱买商用

做报表很长时间了&#xff0c;最近发现一个比较奇怪的现象&#xff1a;各家工具使出各种手段做广告、吸引注意力&#xff0c;但是受到程序员热烈追捧的反倒一直是 Jaspereport &#xff0b; ireport 这种免费、开源的 JAVA 工具&#xff0c;几个开了专版讨论 JAVA 报表的论坛里…

场景应用:你知道 i = i++;的含义么?

文章目录引言正文题目原理i i;呢&#xff1f;总结引言 今年面试官小姐姐问了一个灵魂问题&#xff1a;i0; i i;等于多少&#xff1f; 当时人就傻了 当然&#xff0c;面试官小姐姐还是很可爱的&#xff0c;人也很好&#xff0c;让我研究一下&#xff0c;好&#xff0c;那么…

毕业设计 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录1 前言1.1 背景2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天向大家介绍 一个深度学习项目 基于CNN实现谣言检测 1.1 背景 社交媒体的发展在加速信息传播的同时…

多层高速PCB设计学习(一)初探基本知识(附单层设计补充)

目录前言一、常见概念名词科普二、层数的选择三、基本原则二、层叠结构分析电源层和地层耦合各层的种类选择三、元器件布局及布线单层知识点补充前言 简单学会两层板的设计方法&#xff0c;想学习四层板以及多层板的设计方法&#xff0c;立创EDA上有开源的四层板的四旋翼飞机的…

(4)UART应用设计及仿真验证(整体回顾)

在新公司入职以后,第一个小demo就是设计一个UART模块,支持apb2.0,支持中断上报,支持环回,支持有效数据位可配置,支持校验可配置,支持FIFO水位线可配置,支持波特率可配置等等。UART最早是在补习班的时候接触的,当时学习地很吃力,对它地理解不算深刻。当时实现的只有发…

Future、FutureTask类解析

Future类 Future类提供了方法来检查异步调用是否完成、等待异步调用完成并获取异步调用返回结果。get()方法可以对线程进行阻塞&#xff0c;直到异步调用完成并返回结果。cancel()方法可以取消异步方法的执行。 Future是一个接口&#xff0c;定义了异步线程的返回结果的获取方法…

初学python非常实用的10个小技巧,先收藏再说~

嗨害大家好鸭&#xff01;我是小熊猫❤ 最近双十一是不是都在买买买呢&#xff1f; 但是学习这件事情可不能懈怠鸭&#xff01; 今天就来讲讲python实用小技巧~ 源码、资料电子书点击此处 1.唯一性 以下方法可以检查给定列表是否有重复的地方&#xff0c; 可用set&#xff…

力扣刷题day37|1049最后一块石头的重量 II、494目标和、474一和零

文章目录1049. 最后一块石头的重量 II思路动态规划五部曲494. 目标和回溯思路动态规划背包思路动态规划五部曲474. 一和零思路动态规划五部曲1049. 最后一块石头的重量 II 力扣题目链接 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量…

深度学习模型部署全流程-模型训练

文章目录前言模型训练全流程1.数据准备2.数据加载3.搭建神经网络4.设置损失函数&#xff0c;优化器5.训练网络模型6.模型测试7.完整代码9.训练结果小结前言 该系列文章会介绍神经网络模型从训练到部署的全流程&#xff0c;对于已经参加工作的人可以快速的了解如何使用深度学习…

Android Studio入门之文本内容、大小、颜色的讲解及实战(附源码 超详细必看)

运行有问题或需要源码请点赞关注收藏后评论区留言或私信博主 一、设置文本的内容 1:在XML文件中通过属性android:text设置文本 <TextViewandroid:layout_width"wrap_content"android:layout_height"wrap_content"android:text"Hello World!"…

nordic 52832中添加RTT打印

JlinkRTT RTT是基于Jlink调试器的实时传输技术,可以代替串口打印一些调试信息,不需要额外接线。 nordic 52832官方例程中,会将RTT打印函数做进一步封装,下面就讲一下怎么开启52832中的RTT打印。 第一步 增加RTT代码 RTT源代码可以在segger官方网站下载,也可以在nordic 5…