gpt4 book ai didi

vue.js - Vue 3 Composition API - 如何在 setup() 中指定 Prop

转载 作者:行者123 更新时间:2023-12-05 08:22:01 25 4
gpt4 key购买 nike

我为 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
},
}
}

我将此 mixin 用于其他组件以保持 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 prop only 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 保持一致。

关于vue.js - Vue 3 Composition API - 如何在 setup() 中指定 Prop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66604095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com