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 保持一致。


以上是Vue3CompositionAPI-如何在setup()中指定道具的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>