setup函数
- setup用于定义变量和方法
- ref用于声明简单数据类型,如:String Number Boolean
- reactive用来声明复杂数据类型,如:Array Objec
- 是使用Composition API的入口
- Composition API的主要思想,将它们定义为从新的setup函数返回的JavaScript变量,而不是从组件的功能(如:data、methods、computed等)定义为对象的属性
- Composition API 代替 Vue Mixins (解决命名冲突、隐式依赖、代码重用等问题)
- 在生命周期beforeCreate前被调用(执行setup时,组件实例尚未被创建)
- 可以返回一个对象,这个对象的属性会被合并到渲染上下文,可以在模板中直接使用
- 也可以返回一个渲染函数,如:return () => h(‘div’, [count.value, object.foo])
- 在setup中没有this
- 接收props作为第一个参数,如果props为对象,可通过watchEffect监视其变化
- 接收context作为第二个参数,这个对象包含attrs、slots、emit三个属性
- context非响应式,可以直接解构使用 setup(props,{attr,slots,emit}){}
- 执行setup函数时可以访问:props、attrs、slots、emit,不可以访问:data、computed、methods
import { ref, reactive, toRefs, isRef } from 'vue'
export defalut {
props:{
title: String
},
setup( props, context ){
console.log(props.title);
const { title } = toRefs(props)
let count = ref(0)
console.log(count.valeu);
console.log(isRef(count));
let arr = reactive([1,3,5,7,9])
let addOne = () => {
count.value++
}
console.log(context.attrs)
console.log(context.slots)
console.log(content.emit)
return {
count, arr, addOne
}
}
}
使用setup语法糖
<template>
<div>
<p>
<span @click="update(count-1)">-</span>
{{ count }}
<span @click="update(count+1)">+</span>
</p>
</div>
</template>
<script lang="ts" setup name="component-name">
import { ref, reactive, toRefs, isRef } from 'vue'
let count = ref(0)
function update(value) {
count.value = value
}
</script>