Dar*_*te1 9 vue.js vuejs3 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,
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我想isAuthenticated在/router/index.jsVue 中使用计算属性时会抛出错误“未捕获的错误:[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
})
Run Code Online (Sandbox Code Playgroud)
组件 API 由文件“/boot/auth.js”中的Quasar Framework 启动文件实例化:
import VueCompositionApi from '@vue/composition-api'
import { boot } from 'quasar/wrappers'
export default boot(({ Vue }) => {
Vue.use(VueCompositionApi)
})
Run Code Online (Sandbox Code Playgroud)
有没有办法在组件之外使用导出的计算属性?
根据这个例子,这是一个使用相同组合 API 的库,它应该isAuthenticated在Router对象内实例化时工作。有更多的人为此而苦苦挣扎,但我似乎无法正确解决。
Dar*_*te1 21
Vue.js 论坛上的一位朋友修复了这个问题。对于遇到此问题的其他任何人,我将在此处发布他的答案。简而言之,您需要创建一个单独的文件来安装组合 API 插件并在router/index.ts文件中调用该文件以实例化插件。
这是因为组合 API 不在 Vue 内部。随着 Vue 3 的发布,这将得到修复。
你需要Vue.use(CompositionApi)尝试使用任何属于前@vue/composition-api。
在您的main.jsorindex.js应用入口点中,首先安装它:
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'
Vue.use(VueCompositionApi)
Run Code Online (Sandbox Code Playgroud)
这有效。但我假设您的文件看起来不像这样,它看起来更像下一个:
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'
import { isAuthenticated } from '@/store/auth'
Vue.use(VueCompositionApi)
Run Code Online (Sandbox Code Playgroud)
这将再次炸毁所有内容,因为安装组合 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)
Run Code Online (Sandbox Code Playgroud)
然后在您的入口点:
// main.js
import './installCompositionApi.js'
import Vue from 'vue'
import { isAuthenticated } from '@/store/auth'
if (isAuthenticated.value) {
// ...
} else {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这将起作用。
| 归档时间: |
|
| 查看次数: |
4785 次 |
| 最近记录: |