首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不通过`data`暴露的情况下访问`setup`的内部状态?

如何在不通过`data`暴露的情况下访问`setup`的内部状态?
EN

Stack Overflow用户
提问于 2021-05-23 19:46:23
回答 2查看 83关注 0票数 0

这个问题与返回render函数的setup相关。

例如,我有一个组件Foo

代码语言:javascript
复制
// Foo.tsx
import { defineComponent, ref } from 'vue'

export default defineComponent({
  setup() {
    // ? how to access `number` outside the `Foo` Component?
    const number = ref(0)

    return () => <div>{number.value}</div>
  },
})

我们必须使用data来公开number吗?例如:

代码语言:javascript
复制
// Foo.tsx
import { defineComponent, getCurrentInstance } from 'vue'

export default defineComponent({
  data() {
    return {
      // ? expose `number` to the outside
      number: 0,
    }
  },
  setup() {
    return () => <div>{getCurrentInstance()?.data.number}</div>
  },
})

// FooContainer.tsx
import Foo from '@/views/Foo'
import { defineComponent, onMounted, ref } from 'vue'

export default defineComponent({
  setup() {
    const foo = ref<InstanceType<typeof Foo>>()
    //                          ? use `Foo`'s `number` in `FooContainer`
    onMounted(() => console.log(foo.value?.number))

    return () => <Foo ref={foo} />
  },
})

那么,有没有其他方法可以访问Foosetup的内部状态number而不通过data公开它

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-24 11:45:37

您可以使用安装程序中提供的expose方法将数据公开给其他组件,

代码语言:javascript
复制
// Foo.tsx
import { defineComponent, ref } from 'vue'

export default defineComponent({
  setup(props, { expose }) {
    // ? how to access `number` outside the `Foo` Component?
    const number = ref(0)

    expose({
        number
    })

    return () => <div>{number.value}</div>
  },
})
票数 2
EN

Stack Overflow用户

发布于 2021-05-24 12:01:17

您可以定义一个名为useLoader的可组合函数

useLoader.ts:

代码语言:javascript
复制
import { ref } from 'vue'

const loading = ref(false)

export default function useLoader() {
  return {
    loading,
  }
}

然后在Foo.tsx中使用它,如下所示:

代码语言:javascript
复制
import { defineComponent, getCurrentInstance } from 'vue'
import useLoader from './userLoader'

export default defineComponent({
  setup() {
    const { loading } = useLoader()

    return () => <div>{loading.value && <div> Loading ... </div>}</div>
  },
})

FooContainer.tsx

代码语言:javascript
复制
import Foo from '@/views/Foo'
import { defineComponent, onMounted, ref } from 'vue'
import useLoader from './userLoader'

export default defineComponent({
  setup() {
    const { loading } = useLoader()

    onMounted(() => console.log(loading.value))

    return () => <Foo />
  },
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67659374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档