上一篇讲解了setup的基本使用以及setup函数中的ref和reactive函数实现响应式数据
setup函数中还有其他的函数, 比如: computed, Provide, Inject, watch等等
接下来我们会讲解setup中的其他函数的使用
在前面我们讲解过计算属性computed:当我们的某些属性是依赖其他状态时,我们可以使用计算属性来处理
setup 函数中使用 computed 方法来编写一个计算属性;如何使用computed呢?
setup() {
const name = reactive({
firstName: "chen",
lastName: "yq"
})
// 只接收一个getter函数作为参数, 返回的是一个固定的ref对象
const fullName = computed(() => {
return name.firstName + " " + name.lastName
})
return {
fullName
}
}
setup() {
const name = reactive({
firstName: "chen",
lastName: "yq"
})
// 既有getter函数又有setter函数, 需要传入一个对象作为参数
const fullName = computed({
// set函数 会返回一个可变的ref对象
set: newValue => {
const names = newValue.split(" ")
name.firstName = names[0]
name.lastName = names[1]
},
get: () => {
return name.firstName + " " + name.lastName
}
})
// 因为返回对象, 索引fullName.vlue设置fullName的值
fullName.value = "aaa bbb"
return {
fullName
}
}
在setup中如何使用ref获取元素或者组件?
<template>
<div>
<h2 ref="h2Ref">1111h2>
div>
template>
<script>
import { ref, onMounted } from 'vue'
export default {
setup() {
const h2Ref = ref()
onMounted(() => {
console.log(h2Ref.value)
})
return {
h2Ref
}
}
}
script>
我们前面说过 setup 可以用来替代 data 、 methods 、 computed 等等这些选项,也可以替代 生命周期钩子。
那么setup中如何使用生命周期函数呢?
// 引入注册生命周期的函数
import { onBeforeMount, onMounted } from 'vue'
export default {
// 向注册函数中传入生命周期函数
setup() {
onBeforeMount(() => {
console.log("onBeforeMounted")
})
onMounted(() => {
console.log("onMounted")
})
}
}
以前的生命周期钩子对应的setup中关系如下图 :

我们发现, created和beforeCreate两个函数是没有对应的注册生命周期函数的, 官方给出的解释如下 :

事实上我们之前还学习过Provide和Inject,Composition API也可以替代之前的 Provide 和 Inject 的选项。
我们可以通过 provide来提供数据:
provide可以传入两个参数:
import { provide } from 'vue'
export default {
setup() {
// 将导出数据设置为响应式
const name = ref("chenyq")
const age = ref(18)
provide("name", name)
provide("age", age)
}
}
在后代组件中可以通过 inject 来注入需要的属性和对应的值:
inject可以传入两个参数:
setup() {
const name = inject("name", "默认值")
const age = inject("age")
return {
name,
age
}
}
在前面的Options API中,我们可以通过watch选项来侦听data或者props的数据变化,当数据变化时执行某一些操作。
在Composition API中,我们可以使用watchEffect和watch来完成响应式数据的侦听;
- watchEffect:用于自动收集响应式数据的依赖;
- watch:需要手动指定侦听的数据源;
watch的API完全等同于组件watch选项的Property:
setup() {
let message = ref("hello vue3 setup")
watch(message, (oldValue, newValue) => {
console.log(oldValue, newValue)
})
function btnClick() {
message.value = "你好 vue3 setup"
}
return {
message,
btnClick
}
}
侦听器还可以使用数组同时侦听多个源:
setup() {
let message = ref("hello vue3 setup")
const name = ref("chenyq")
watch([message, name], (oldValue, newValue) => {
console.log(oldValue, newValue)
})
function btnClick() {
message.value = "你好 vue3 setup"
name.value = "kaisa"
}
return {
message,
btnClick,
name
}
}
watch选项
watch([message, name], (oldValue, newValue) => {
console.log(oldValue, newValue)
}, {
// 设置首次进行监听
immediate: true,
// 设置深度监听
deep: true
})
当侦听到某些响应式数据变化时,我们希望执行某些操作,这个时候可以使用 watchEffect。
setup() {
let message = ref("hello vue3 setup")
const name = ref("chenyq")
watchEffect(() => {
console.log("wactchEffect执行", message.value, name.value)
})
}
如果在发生某些情况下,我们希望停止侦听,这个时候我们可以获取watchEffect的返回值函数,调用该函数即可。
setup() {
let message = ref("hello vue3 setup")
const name = ref("chenyq")
let counter = ref(1)
const stopWatch = watchEffect(() => {
// 大于20调用watchEffect的返回值函数
if (counter.value >= 20) stopWatch()
console.log("wactchEffect执行", counter.value)
})
}