如何使用 Vue Composition API 作为跨组件的全局状态?

Rad*_*dya 9 javascript vue.js vue-composition-api

所以我尝试使用 Vue Composition API 作为全局状态。例如,我创建了名为useLoading.js加载标志的文件。

useLoading.js

import { reactive, toRefs } from '@vue/composition-api'

export default () => {
  const state = reactive({
    isLoading: false
  })

  const setIsLoading = (loading) => {
    state.isLoading = loading
  }

  return {
    ...toRefs(state),
    setIsLoading
  }
}
Run Code Online (Sandbox Code Playgroud)

setIsLoading然后我创建了组件 A,当单击按钮时它将调用

ComponentA.vue

<template>
  <div @click="showLoading" />
</template>

<script>
import useLoading from '@/composable/useLoading'

export default {
  setup () {
    const { setIsLoading } = useLoading()

    function showLoading () {
      setIsLoading(true)
    }

    return {
      showLoading
    }
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)

我还有组件 B,当的<div>值为isLoadingtrue

ComponentB.vue

<template>
  <div v-if="isLoading" />
</template>

<script>
import useLoading from '@/composable/useLoading'

export default {
  setup () {
    const { isLoading } = useLoading()

    return {
      isLoading: isLoading
    }
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)

isLoading然而in的价值ComponentB.vue并不是变化(不是反应性的)。但当我调用时,值确实发生了变化ComponentA.vue

我觉得我使用 Composition API 作为全局状态的实现有问题。有人可以帮忙吗?

谢谢

Rad*_*dya 10

更新

刚刚发现我必须从导出函数中排除状态,如果我将其包含在导出函数中,如果在不同的地方调用它,它将创建其他状态。因此状态不会在组件之间同步。

import { reactive, toRefs } from '@vue/composition-api'

const state = reactive({
    isLoading: false
})

export default () => {

  const setIsLoading = (loading) => {
    state.isLoading = loading
  }

  return {
    ...toRefs(state),
    setIsLoading
  }
}
Run Code Online (Sandbox Code Playgroud)