Vue 3 Composition API提供/注入在单个文件组件中不起作用

时间:2020-07-27 01:08:17

标签: javascript vue.js vue-component vuejs3 vue-composition-api

我正在使用Composition API在VueJS 3中制作一个库。我实现了docs中提到的Provide / Inject。但是子组件中的属性仍未定义,并且在浏览器控制台中出现以下错误:

Console Output

我的代码的一个非常简单的实现如下:

在项目中的使用

<ThemeProvider>
    <Button color="green">
        ABC
    </Button>
</ThemeProvider>

<script>
    import { ThemeProvider, Button } from 'my-library'

    export default {
        name: 'SomePage',
        setup() {...},
    }
</script>

ThemeProvider.js(父组件)

import { toRefs, reactive, provide, h } from 'vue'

export default {
    name: 'theme-provider',
    props:
        theme: {
            type: Object,
            default: () => ({...}),
        },
    },
    setup(props, { slots }) {
        const { theme } = toRefs(props)

        provide('theme', reactive(theme.value))

        return () =>
            h(
                'div',
                {...},
                slots.default()
            )
    },
}

Button.js(子组件)

import { inject, h } from 'vue'

export default {
    name: 'Button',
    setup(props, { slots }) {
        const theme = inject('theme')
        console.log(theme)  // returns undefined

        return () =>
            h(
                'button',
                {...},
                slots.default()
            )
    },
}

2 个答案:

答案 0 :(得分:3)

使用async setup()时,我也有同样的警告和问题

inject()只能在setup()或功能组件内部使用。

问题是在初始化注入之前进行异步调用,我不确定为什么这很重要。

解决方案是在调用异步函数之前声明注入。


import getCharacters from "../composables/characters";
import { inject } from "vue";
export default {
  async setup() {
    const store = inject("store");
    const { characters } = await getCharacters();
    
    store.updateChars(characters)

    return {
      characters,
      store
    };
  },
};


答案 1 :(得分:1)

对于任何有相同问题的人,代码都没有问题。问题是我的'vue'文件中的'@vue/compiler-sfc'package.json(单文件组件的Vue编译器)的版本不同。

enter image description here