目录
一、基本概念
1. Options API
2. Composition API
二、setup函数
1. setup函数的参数
props
context
栗子
父组件
子组件
2. setup函数的返回值
代码
效果
三、定义响应式数据的两种方式
1. Reactive API
01 - 栗子
代码
效果
02 - Reactive判断的API
2. Ref API ( 常用 )
01 - 基本使用
代码
效果
02 - Ref自动解包
注意事项
03 - Ref判断的API
04 - 自定义Ref => customRef
新建customDebounceRef.js文件
使用
效果
四、readonly
1. 概念
2. 使用
五、toRefs && toRef
1. toRefs
代码
效果
2. toRef
六、computed
方式一
方式二
01 - 代码
02 - 效果
七、setup中使用ref获取元素或组件
1. 获取元素
2. 获取组件
01 - 子组件
02 - 父组件
八、生命周期函数
九、provide && inject
1. 父组件代码
2. 子组件代码
3. 效果
十、 侦听数据的变化之watch
1. 侦听单个数据源
01 - 监听具体的某个值
02 - 传入响应式对象
ref对象
reactive对象
2. 侦听多个数据源
01 - 代码
02 - 效果
3. watch的选项
代码
十一、侦听数据的变化之watchEffect
1. watchEffect的基本使用
01 - 代码
02 - 效果
2. watchEffect的停止监听
01 - 代码
02 - 效果
3. watchEffect清除副作用
01 - 什么是清除副作用
02 - 如何使用
03 - 代码
04 - 效果
4. watchEffect的执行时机
代码
5. 和watch的区别
十二、自定义指令
1. 自定义指令的简单使用
01 - 默认实现方式
02 - 局部指令
03 - 全局指令
04 - 效果
2. 指令的生命周期
01 - Vue3
02 - Vue2 与 Vue3对比
3. 指令的参数和修饰符
4. 时间显示栗子
01 - 代码
02 - 效果
十三、script setup语法糖
1. 概念
2. 顶层的绑定会被暴露给模板
3. 导入的组件直接使用
4. defineProps()
01 - 父组件
02 - 子组件
5. defineEmits()
01 - 子组件
02 - 父组件
6. defineExpose()
01 - 子组件
02 - 父组件
但是这种代码有一个很大的弊端
为了开始使用Composition API,我们需要有一个可以实际使用它(编写代码)的地方在Vue组件中,这个位置就是 setup 函数
setup函数有两个主要的参数 : props 、context
props非常好理解,它其实就是父组件传递过来的属性会被放到props对象中,我们在setup中如果需要使用,那么就可以直接通过props参数获取
context,也称之为是一个SetupContext,它里面包含三个属性
{{ msg }}
最后导出的一定要是个对象
{{ count }}
因为只是定义了个变量,然后导出了,并没有使它响应式
如果想为在setup中定义的数据提供响应式的特性,那么可以使用reactive的函数
ps : 如果传入一个基本数据类型(String、Number、Boolean)会报一个警告
应用场景 : reactive API对传入的类型是有限制的,它要求我们必须传入的是一个对象或者数组类型,最好相互有关联的数据时使用
reactive :
{{ state.count }}
Ref函数 : 定义简单类型的数据,也可以定义复杂类型的数据
应用场景 : 定义一些简单的数据,或者从接口中获得的数据
Ref :
使用的时候是用 .value,但是有两个注意事项
{{ count }}
就是不用在template中使用.value
1. 模板中的解包是浅层的解包,如果放到了对象中,则接包不了
2. 如果把ref返回的对象又放入到reactive中,那么也会自动解包
创建一个自定义的ref,并对其依赖项跟踪和更新触发进行显示控制
// 导入customRef
import { customRef } from 'vue';
export default function (value) {
let timer = null;
// track收集依赖 trigger更新数据
return customRef((track, trigger) => {
return {
get() {
// 先收集依赖
track();
// 把数据返回
return value;
},
set(newValue) {
// 防抖
clearTimeout(timer);
timer = setTimeout(() => {
// 设置数据
value = newValue;
// 更新数据
trigger();
}, 1000);
}
};
});
}
{{ message }}
通过reactive或者ref可以获取到一个响应式的对象,但是某些情况下,传入给其他地方(组件)的这个 响应式对象希望在另外一个地方(组件)被使用
但是不能被修改
在readonly的使用过程中,有如下规则 :
本质上就是readonly返回的对象的setter方法被劫持了
如果使用ES6的解构语法,对reactive返回的对象进行解构获取值,那么之后无论是修改结构后的变量,还是修改reactive 返回的state对象,数据都不再是响应式的
如何改成响应式呢,Vue提供了一个toRefs的函数
可以将reactive返回的对象中的属性都转成ref,这样解构出来的就是响应式的了
{{ age }}
如果只希望转换reactive对象中的其中某个属性为ref, 那么可以使用toRef的方法
ps : 这个效率会更高点
Vue2
使用的是computed属性
Vue3
需要在setup函数中使用computed方法来编写一个计算属性
接收一个getter函数,并为 getter 函数返回的值,返回一个不变的 ref 对象
{{ fullName }}
{{ scoreState }}
接收一个具有 get 和 set 的对象,返回一个可变的(可读写)ref 对象
{{ fullName }}
要定义一个ref对象,绑定到元素或者组件的ref属性上即可
我是迪迦
我是子组件
setup中可以直接使用导入的onX函数注册生命周期,并且同一个生命周期可以使用多次
ps : 之前在created和beforeCreated生命周期中编写的代码,直接在setup函数中编写即可
provide可以传入两个参数 :
inject可以传入两个参数 :
APP count: {{ count }}
demo count:{{ count }}
watch :
watch侦听函数的数据源有两种类型:
用来监听ref 或者 reactive对象中的具体属性可使用
{{ star }}
{{ star.name }}
{{ star.name }}
配置第三个参数 :
{{ info.name }}
watchEffect :
{{ name }} - {{ age }}
假如,某些情况想要停止监听,那么可以获取watchEffect的返回值函数,调用该函数即可
{{ name }} - {{ age }}
{{ name }} - {{ age }}
一般来说,如果需要等dom挂载完后操作dom元素的时候,传post即可
star
Vue中自带的指令例如v-show、v-for、v-model等等,除了使用这些指令之外,Vue 也允许我们来自定义自己的指令
ps : 一般需要对dom元素进行底层操作时使用
自定义指令 :
栗子 : 实现input元素挂在完成后自动获得焦点
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
// 指令名称
app.directive('focus', {
// 使用自定义指令的生命周期,挂载后访问
mounted(el, bindings, vnode, preVnode) {
el.focus()
}
})
app.mount('#app')
这里使用了dayjs,可以 npm install dayjs 安装一下
{{ timeStamp }}
里面的代码会被编译成组件 setup() 函数的内容 :
- 这意味着与普通的
3. 导入的组件直接使用
4. defineProps()
defineProps => 用来接收从父组件传递过来的数据
01 - 父组件
02 - 子组件
{{ name }} - {{ age }}5. defineEmits()
defineProps => 用来发射事件给父组件
01 - 子组件
02 - 父组件
6. defineExpose()
defineExpose => 用来暴露数据
ps : 使用
02 - 父组件