1. 为什么要学 Vue3 ?
Vue3 的优势:
Vue2 选项式 API vs Vue3 组合式API
2. create-vue搭建Vue3项目
2.1 认识 create-vue
create-vue是Vue官方新的脚手架工具
,底层切换到了 vite(下一代构建工具)
,为开发提供极速响应
2.2 使用create-vue创建项目
- 前提环境条件
已安装 16.0 或更高版本的 Node.js
查看Node.js的版本node -v
- 创建一个Vue应用
npm init vue@latest
这一指令将会安装并执行 create-vue
3. 熟悉项目目录和关键文件
关键文件:
- vite.config.js - 项目的配置文件
基于vite的配置
- package.json - 项目包文件 核心依赖项变成了
Vue3.x 和 vite
- main.js - 入口文件
createApp函数创建应用实例
- app.vue - 根组件
SFC单文件组件 script - template - style
变化一:脚本script和模板template顺序调整
变化二:模板template不再要求唯一根元素
变化三:脚本script添加setup标识支持组合式API - index.html - 单页入口
提供id为app的挂载点
4. 组合式API - setup选项
4.1 setup选项的写法和执行时机
4.2 setup选项中写代码的特点
4.3
4.4
小总结
-
setup选项的执行时机?
beforeCreate钩子之前 自动执行 -
setup写代码的特点是什么?
定义数据 + 函数 然后以对象方式return
5. 组合式API - reactive和ref函数
5.1 reactive()
作用:接受对象类型数据的参数传入
并返回一个响应式的对象
核心步骤:
<script setup>
//导入
import { reactive } from 'vue'
//执行函数 传入参数 变量接收
const state = reactive(对象类型)
</script>
- 从 vue 包中
导入 reactive 函数
- 在
<script setup>
中执行 reactive 函数
并传入类型为对象
的初始值,并使用变量接收返回值
5.2 ref()
作用:接收简单类型或者对象类型的数据传入并返回一个响应式的对象
核心步骤:
<script setup>
//导入
import { ref } from 'vue'
//执行函数 传入参数 变量接收
const state = ref(简单类型或者复杂类型数据)
</script>
- 从 vue 包中导入 ref 函数
- 在
小总结
-
reactive和ref函数的共同作用是什么 ?
用函数调用的方式生成响应式数据 -
reactive vs ref ?
- reactive不能处理简单类型的数据
- ref参数类型支持更好但是必须通过.value访问修改
- ref函数的内部实现依赖于reactive函数
-
在实际工作中推荐使用哪个?
推荐使用ref函数,更加灵活统一
6. 组合式API - computed
6.1 computed计算属性函数
计算属性基本思想和Vue2的完全一致,组合式API下的计算属性只是修改了写法
核心步骤: 1. 导入
computed函数
2. 执行函数
在回调参数中return基于响应式数据做计算的值
,用变量接收
<script setup>
// const 计算属性 = computed(() => {
// return 计算返回的结果
// }
import { computed,ref } from 'vue';
// 声明数据
const list = ref([1,2,3,4,5,6,7,8])
// 基于list派生一个计算属性,从list中过滤出 >2
const computedList = computed(() =>{
return list.value.filter(item => item >2)
})
</script>
<template>
<div>原始数据:{{ list }}</div>
<div>计算后的数据:{{ computedList }}</div>
</template>
最佳实践
-
计算属性中不应该有“副作用”
比如异步请求/修改dom -
避免直接修改计算属性的值
计算属性应该是只读的,特殊情况可以配置 get set
7. 组合式API - watch
7.1 watch函数
作用: 侦听一个或者多个数据
的变化,数据变化时执行回调函数
俩个额外参数:1. immediate(立即执行) 2. deep(深度侦听)
7.2 基础使用
7.2.1 基础使用 - 侦听单个数据
导入watch
函数执行watch函数
传入要侦听的响应式数据(ref对象
)和回调函数
7.2.2 基础使用 - 侦听多个数据
说明:同时侦听多个响应式数据的变化,不管哪个数据变化都需要执行回调
7.2.3 基础使用 - immediate
说明:在侦听器创建时立即触发回调,
响应式数据变化之后继续执行回调
7.2.4 基础使用 - deep
默认机制:通过watch监听的ref对象默认是浅层侦听的,直接修改嵌套的对象属性不会触发回调执行
,需要开启deep选项
精确侦听对象的某个属性
需求:在不开启deep的前提下,侦听age的变化,只有age变化时才执行回调
小总结
- 作为watch函数的第一个参数,ref对象需要添加.value吗?
不需要,第一个参数就是传 ref 对象 - watch只能侦听单个数据吗?
单个 或者 多个 - 不开启deep,直接监视 复杂类型,修改属性 能触发回调吗?
不能,默认是浅层侦听 - 不开启deep,精确侦听对象的某个属性?
可以把第一个参数写成函数的写法,返回要监听的具体属性
8. 组合式API - 生命周期函数
8.1 Vue3的生命周期API (选项式 VS 组合式)
8.2 生命周期函数基本使用
- 导入生命周期函数
- 执行生命周期函数 传入回调
8.3 执行多次
生命周期函数是可以执行多次的,多次执行时传入的回调会在时机成熟时依次执行
小总结
- 组合式API中生命周期函数的格式是什么?
on + 生命周期名字 - 组合式API中可以使用onCreated吗?
没有这个钩子函数,直接写到setup中 - 组合式API中组件卸载完毕时执行哪个函数?
onUnmounted
9. 组合式API - 父子通信
9.1 组合式API下的父传子
基本思想
- 父组件中给
子组件绑定属性
- 子组件内部通过
props选项接收
defineProps 原理:就是编译阶段的一个标识,实际编译器解析时,遇到后会进行编译转换
9.2 组合式API下的子传父
基本思想
- 父组件中给
子组件标签通过@绑定事件
- 子组件内部通过
emit 方法触发事件
小总结
父传子
- 父传子的过程中通过什么方式接收props?
defineProps( { 属性名:类型 } ) - setup语法糖中如何使用父组件传过来的数据?
const props = defineProps( { 属性名:类型 } )
props.xxx
子传父
- 子传父的过程中通过什么方式得到emit方法?
defineEmits( [‘事件名称’] ) - 怎么触发事件
emit(‘自定义事件名’, 参数)
10. 组合式API - 模版引用
10.1 模板引用的概念
通过ref标识获取真实的dom对象或者组件实例对象 this .$refs .form.validate()
10.2 如何使用(以获取dom为例 组件同理)
- 调用ref函数生成一个ref对象
- 通过ref标识绑定ref对象到标签
10.3 defineExpose()
默认情况下在
小总结
- 获取模板引用的时机是什么?
组件挂载完毕 - defineExpose编译宏的作用是什么?
显式暴露组件内部的属性和方法