一、setup 函数
setup() 函数是在 beforeCreate 钩子之前执行的一个函数。
setup 接收 2 个参数:
- props:一个响应式的对象,包含了从父组件中传过来的所有属性。不能使用 ES6 解构。
- context:一个普通的对象,暴露了其它可能在 setup 中有用的值。能使用 ES6 解构。
setup 的返回值:
- 一个对象:对象里的属性都可以在模板中使用。
当 setup 函数返回一个对象时,该对象里的属性均可在模板中使用。只不过,如果该属性是个对象,在模板里使用该对象时,该对象会被自动浅解包,因此,不应在模板中直接使用 对象.属性名 的形式访问该对象里的属性。
- 一个函数:该函数可以直接使用在同一作用域中声明的响应式状态。
setup 函数的特点:
- 在 setup 函数中定义的变量和方法,必须将它们 return 到最后的结果对象中去,才能在 template 模板中使用它们。
setup 函数的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <template> <div>{{ str }}</div> <div v-for="(item, idx) in list" :key="idx"></div> <div>{{ obj }}</div> </template>
<script> import { ref, reactive, toRefs } from 'vue'
export default { setup() { const str = ref('qwert') const list = ref([]) const obj = reactive({})
return { str, list, ...toRefs(obj) } } } </script>
|
| 可访问到属性 |
不可访问到的属性 |
| props |
data |
| attrs |
computed |
| slots |
methods |
| emit |
refs |
二、defineComponent 函数
defineComponent 函数是 setup 函数的语法糖之一。
defineComponent 函数支持 TypeScript 的参数类型推断(专为 TS 准备的)。若使用的是 ts + vue3,强力推荐使用它。
1、defineComponent 函数的一般用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <template> <div>{{ str }}</div> <div v-for="(item, idx) in list" :key="idx"></div> <div>{{ obj }}</div> </template> <script> import { ref, toRefs, reactive, defineComponent } from 'vue'
export default defineComponent({ setup() { const str = ref('qwert') const list = ref([]) const obj = reactive({}) return { str, list, ...toRefs(obj) } } }) </script>
|
2、ts + vue3 中使用 defineComponent 函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import { defineComponent, PropType} from 'vue'; interface UserInfo = { id: number, name: string, age: number } export default defineComponent({
props: { userInfo: { type: Object as PropType<UserInfo>, required: true } }, })
|
三、<script setup> 标签
<script setup>标签又称 setup 文件,是 setup 函数的语法糖之一。
setup 文件的特点:
对于在 setup 文件中定义的属性和方法,无需将它们 return 到最后的结果对象中去,直接在 template 模板中使用它们即可。
1 2 3 4 5 6 7 8 9 10 11 12
| <template> <div>{{ str }}</div> <div v-for="(item, idx) in list" :key="idx"></div> <div>{{ obj }}</div> </template> <script setup> import { ref, reactive } from 'vue'
const str = ref('qwert') const list = ref([]) const obj = reactive({}) </script>
|