js
setup
基本使用
访问Props
Setup 上下文
与渲染函数一起使用
基本使用
js
<script setup> 这种语法。
响应式API:在setup()
函数 返回的对象, 会暴露给 模板和组件实例。
js
<script>
export default {
setup() {
const count = ref(0)
// 返回值会暴露给模版和其他的选项式 API 钩子
return {
count // 自动浅层解包 在模版中就不需要再写.value this问也无需写
}
},
mounted() {
console.log(this.count) // 0
}
}
</script>
<template>
<button @click="count++">{{ count }}</button>
</template>
async setup
是Suspense
组件的后裔。
访问Props
setup
函数的第一参数是props
。
setup
函数的props
是响应式的,并且传入新的props
时 同时更新
js
export default {
props: {
title: String
},
setup(props) {
console.log(props.title)
}
}
解构
props
对象去用,达咩,解构出的变量会丢失响应式。用props.xxx
去用其中的porps
。
如果,确实,要解构props
对象。 或者要将某个prop
传到一个外部函数中并保持响应性,那么你可以使用toRefs()
和toRef()
这两个工具函数:
js
import { toRefs, } from 'vue'
export default {
setup(props) {
// 将`props`转为一个其中全是ref的对象,然后解构
const { title } = toRefs(props)
// `title`是一个追踪着`props.title`的ref
console.log(title.value)
// 或者,将`props`的单个属性转为一个ref
const title = toRef(props, 'title')
}
}
Setup 上下文
第二个参数是上下文 context
js
export default {
setup(props, context) {
// 透传 Attributes (非响应式的对象,等价于 $attrs)
console.log(context.attrs)
// 插槽(非响应式的对象,等价于 $slots)
console.log(context.slots)
// 触发事件(函数,等价于 $emit)
console.log(context.emit)
// 暴露公共属性(函数)
console.log(context.expose)
}
}
该 上下文 对象 是 非响应式的,可以安全地解构:
js
export default {
setup(props, { attrs, slots, emit, expose }) {
...
}
}
attrs 和 slots 都是有状态的对象,它们总是会随着组件自身的更新而更新。
这意味着你应当避免解构它们,并始终通过 attrs.x 或 slots.x 的形式使用其中的属性。
此外还需注意,和 props 不同,attrs 和 slots 的属性都不是响应式的。
如果你想要基于 attrs 或 slots 的改变来执行副作用,那么你应该在 onBeforeUpdate 生命周期钩子中编写相关逻辑。
暴露公共属性
expose
函数用于显式地限制该组件暴露出的属性,
js
export default {
setup(props, { expose }) {
// 让组件实例处于"关闭状态"
// 即不向父组件暴露任何都你先
expose()
const publicCount = ref(0)
const privateCount = ref(0)
// 有选择地暴露局部状态
expose({ count: publicCount })
}
}
与渲染函数一起使用
setup
也可以返回一个渲染函数
。
可以用同一作用域下 声明的 响应式状态:
js
import { h, ref } from 'vue'
export default {
setup() {
const count = ref(0)
return (0 => h('div', count.value)
}
}
通过expose
暴露方法给父组件(父组件可以通过模版引用 去访问 这个 increment
方法):
js
import { h, ref } from 'vue'
export default {
setup(props, { expose }) {
const count = ref(0)
const increment = () => ++count.value
expose({
increment
})
return () => h('div', count.value)
}
}