Uncaught Error: [vue-composition-api] must call Vue.use(plugin) before using any function
Uncaught Error: [vue-composition-api] must call Vue.use(plugin) before using any function
考虑以下组合函数:
import { computed, ref } from '@vue/composition-api'
import { isInternetExplorer } from 'src/services/utils/utilsService'
import { Screen } from 'quasar'
import { auth, getAllScopes } from 'src/services/auth/authService'
const isLoginPopup = Screen.lt.sm || isInternetExplorer ? false : true
const accountID = ref('')
export const setAccountID = () => {
const account = auth.getAccount()
if (account) { accountID.value = account.idTokenClaims.oid }
else { accountID.value = '' }
}
export const useAccount = () => {
const loading = ref(false)
const disabled = ref(false)
const login = async () => {
loading.value = true
disabled.value = true
const allScopes = getAllScopes()
if (isLoginPopup) {
try {
await auth.loginPopup(allScopes)
} finally {
setAccountID()
disabled.value = false
loading.value = false
}
} else {
auth.loginRedirect(allScopes)
}
}
const logout = () => { auth.logout() }
return {
accountID: computed(() => accountID.value),
isAuthenticated: computed(() => Boolean(accountID.value)),
loading: computed(() => loading.value),
disabled: computed(() => disabled.value),
login, logout,
}
}
现在,当我想在 /router/index.js
中使用 isAuthenticated
计算的 属性 时,Vue 抛出错误“未捕获错误:[vue- composition-api] 在使用任何函数 .":
之前必须调用 Vue.use(plugin)
import { route } from 'quasar/wrappers'
import VueRouter from 'vue-router'
import routes from './routes'
import { useAccount } from 'src/comp-functions/useAccount'
export default route(function ({ Vue }) {
Vue.use(VueRouter)
const Router = new VueRouter({
scrollBehavior: () => ({ x: 0, y: 0 }),
routes,
mode: process.env.VUE_ROUTER_MODE,
base: process.env.VUE_ROUTER_BASE,
})
Router.beforeEach((to, from, next) => {
const { isAuthenticated } = useAccount()
if (isAuthenticated || to.path === '/' || to.path === '/login') {
next()
} else {
next('/login')
}
})
return Router
})
组件 API 由文件 '/boot/auth.js' 中的 Quasar Framework boot file 实例化:
import VueCompositionApi from '@vue/composition-api'
import { boot } from 'quasar/wrappers'
export default boot(({ Vue }) => {
Vue.use(VueCompositionApi)
})
有没有办法在组件外部使用导出的计算 属性?
根据 this example, which is a library using the same composition API, it should work when isAuthenticated
is instantiated within the Router
object. There are more people 的说法,我一直在努力解决这个问题,但我似乎做错了。
您 VueCompositionApito
安装正确吗?
You must install @vue/composition-api via Vue.use() before using other APIs:
import Vue from 'vue';
import VueCompositionApi from '@vue/composition-api';
Vue.use(VueCompositionApi);
此问题已由 Vue.js 论坛上的一位朋友修复。对于 运行 对此问题感兴趣的任何其他人,我将在此处 post 他的回答。简而言之,您需要创建一个单独的文件来安装组合 API 插件,并在 router/index.ts
文件中调用该文件以实例化插件。
这是因为组合 API 不在 Vue 本身内部。随着 Vue 3 的发布,这将得到修复。
在尝试使用属于 @vue/composition-api
的任何内容之前,您需要 Vue.use(CompositionApi)
。
在您的 main.js
或 index.js
应用入口点,先安装它:
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'
Vue.use(VueCompositionApi)
这行得通。但我认为你的文件看起来不像这个,它看起来更像下一个:
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'
import { isAuthenticated } from '@/store/auth'
Vue.use(VueCompositionApi)
这将再次炸毁所有内容,因为安装组合 API (Vue.use(VueCompositionApi)
) 的行在导入使用它的内容的行之后 (import { unauthenticated } from '@/store/auth'
)
同时,在 Vue 3.0 发布之前,您可以创建一个简单安装插件的文件:
// installCompositionApi.js
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'
Vue.use(VueCompositionApi)
然后在您的入口点:
// main.js
import './installCompositionApi.js'
import Vue from 'vue'
import { isAuthenticated } from '@/store/auth'
if (isAuthenticated.value) {
// ...
} else {
// ...
}
这会起作用。
我有同样的错误,我只是升级了@vue/composition-api的版本。
考虑以下组合函数:
import { computed, ref } from '@vue/composition-api'
import { isInternetExplorer } from 'src/services/utils/utilsService'
import { Screen } from 'quasar'
import { auth, getAllScopes } from 'src/services/auth/authService'
const isLoginPopup = Screen.lt.sm || isInternetExplorer ? false : true
const accountID = ref('')
export const setAccountID = () => {
const account = auth.getAccount()
if (account) { accountID.value = account.idTokenClaims.oid }
else { accountID.value = '' }
}
export const useAccount = () => {
const loading = ref(false)
const disabled = ref(false)
const login = async () => {
loading.value = true
disabled.value = true
const allScopes = getAllScopes()
if (isLoginPopup) {
try {
await auth.loginPopup(allScopes)
} finally {
setAccountID()
disabled.value = false
loading.value = false
}
} else {
auth.loginRedirect(allScopes)
}
}
const logout = () => { auth.logout() }
return {
accountID: computed(() => accountID.value),
isAuthenticated: computed(() => Boolean(accountID.value)),
loading: computed(() => loading.value),
disabled: computed(() => disabled.value),
login, logout,
}
}
现在,当我想在 /router/index.js
中使用 isAuthenticated
计算的 属性 时,Vue 抛出错误“未捕获错误:[vue- composition-api] 在使用任何函数 .":
import { route } from 'quasar/wrappers'
import VueRouter from 'vue-router'
import routes from './routes'
import { useAccount } from 'src/comp-functions/useAccount'
export default route(function ({ Vue }) {
Vue.use(VueRouter)
const Router = new VueRouter({
scrollBehavior: () => ({ x: 0, y: 0 }),
routes,
mode: process.env.VUE_ROUTER_MODE,
base: process.env.VUE_ROUTER_BASE,
})
Router.beforeEach((to, from, next) => {
const { isAuthenticated } = useAccount()
if (isAuthenticated || to.path === '/' || to.path === '/login') {
next()
} else {
next('/login')
}
})
return Router
})
组件 API 由文件 '/boot/auth.js' 中的 Quasar Framework boot file 实例化:
import VueCompositionApi from '@vue/composition-api'
import { boot } from 'quasar/wrappers'
export default boot(({ Vue }) => {
Vue.use(VueCompositionApi)
})
有没有办法在组件外部使用导出的计算 属性?
根据 this example, which is a library using the same composition API, it should work when isAuthenticated
is instantiated within the Router
object. There are more people 的说法,我一直在努力解决这个问题,但我似乎做错了。
您 VueCompositionApito
安装正确吗?
You must install @vue/composition-api via Vue.use() before using other APIs:
import Vue from 'vue';
import VueCompositionApi from '@vue/composition-api';
Vue.use(VueCompositionApi);
此问题已由 Vue.js 论坛上的一位朋友修复。对于 运行 对此问题感兴趣的任何其他人,我将在此处 post 他的回答。简而言之,您需要创建一个单独的文件来安装组合 API 插件,并在 router/index.ts
文件中调用该文件以实例化插件。
这是因为组合 API 不在 Vue 本身内部。随着 Vue 3 的发布,这将得到修复。
在尝试使用属于 @vue/composition-api
的任何内容之前,您需要 Vue.use(CompositionApi)
。
在您的 main.js
或 index.js
应用入口点,先安装它:
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'
Vue.use(VueCompositionApi)
这行得通。但我认为你的文件看起来不像这个,它看起来更像下一个:
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'
import { isAuthenticated } from '@/store/auth'
Vue.use(VueCompositionApi)
这将再次炸毁所有内容,因为安装组合 API (Vue.use(VueCompositionApi)
) 的行在导入使用它的内容的行之后 (import { unauthenticated } from '@/store/auth'
)
同时,在 Vue 3.0 发布之前,您可以创建一个简单安装插件的文件:
// installCompositionApi.js
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'
Vue.use(VueCompositionApi)
然后在您的入口点:
// main.js
import './installCompositionApi.js'
import Vue from 'vue'
import { isAuthenticated } from '@/store/auth'
if (isAuthenticated.value) {
// ...
} else {
// ...
}
这会起作用。
我有同样的错误,我只是升级了@vue/composition-api的版本。