Vue3CompositionAPI-如何在setup()中指定道具
我为 Vue 2 编写了一个“加载状态”mixin:
export default {
props: {
loading: {
type: Boolean,
default: false
},
},
data () {
return {
innerLoading: false,
}
},
mounted () {
this.innerLoading = !!this.loading
},
methods: {
startLoading () {
this.$emit('update:loading', this.innerLoading = true)
},
stopLoading () {
this.$emit('update:loading', this.innerLoading = false)
},
},
computed: {
isLoading () {
return !!this.innerLoading
},
isNotLoading () {
return !this.innerLoading
},
},
watch: {
loading (loading) {
this.innerLoading = !!loading
},
}
}
我将此混合用于其他组件以保持loading状态。例如表单、按钮、表格等。
现在,我试图将这个 mixin 重写为 Vue 3 的组合 API 样式。理想情况下,我loading想像这样使用我的组合:
// components/Table.vue
import 'useLoading' from 'src/composables/loading'
export default defineComponent({
setup () {
const { startLoading, stopLoading, innerLoading } = useLoading()
// ...
return { startLoading, stopLoading, innerLoading, ... }
}
})
我的问题:
// How can I define the loading prop inside the setup() function?
props: {
loading: {
type: Boolean,
default: false
},
},
当然,我可以这样定义我的组件:
import 'useLoading' from 'src/composables/loading'
export default defineComponent({
props: {
loading: {
type: Boolean,
default: false
},
},
setup () {
const { startLoading, stopLoading, innerLoading } = useLoading();
}
})
但是想象一下,我有 20 个组件使用这个 mixin/composable。所以我想定义loading道具只有ONCE(像我在做的mixin)。
有没有办法用组合 API 来做到这一点?
回答
你可以做这样的事情
import {withProps, useLoading} from "src/composables/loading";
export default defineComponent({
props: {
...withProps()
},
setup () {
const { startLoading, stopLoading, innerLoading } = useLoading();
}
})
哪里withProps有一个可以定义你的函数
export const withProps = () => ({
loading: {
type: Boolean,
default: false
},
})
当然它不需要是一个函数,但在某些情况下它可能会有所帮助,并且先发制人地使其成为一个函数可以使 api 保持一致。