vue.js - Vue 实例中基于身份验证检查的动态渲染函数
问题描述
我正在向我的 Vue 应用程序添加 JWT 身份验证,并且我的 Login.vue 和 App.vue 是分开的,这意味着我不想在用户未登录时呈现 App.vue。
new Vue({
router,
render: function (app) {
if (this.$auth.check()) {
return app(App);
} else {
return app(Login);
}
}
}).$mount('#app')
这有效,但因为
this.$auth.check()
加载需要一秒钟,您会看到登录应用程序正在呈现一秒钟,然后切换到应用程序。我怎样才能解决这个问题?我想我应该使用 await 但我无法让它正常工作。
解决方案
我怎样才能解决这个问题?我想我应该使用 await 但我无法让它正常工作。
这取决于什么是this.$auth.check()
回报。如果它返回一个承诺,答案是肯定的,你应该使用await
.
但不幸render
的是,函数必须是同步的。你可以做的是再使用一个包装器组件.
new Vue({
render(createElement) {
return createElement({
data: () => ({
component: null
}),
async created() {
this.component = await checkAuth() ? App : Login
},
render(createElement) {
return createElement(this.component)
}
})
}
}).$mount('#app')
笔记:
我更愿意将包装器组件创建为单文件组件。
看来您正在使用
vue-router
您可能会考虑使用Navigation Guards。
更新
您可能已经注意到,您根本不需要包装器组件。
new Vue({
data: () => ({
component: null
}),
async created() {
this.component = await checkAuth() ? App : Login
},
render(createElement) {
return createElement(this.component)
}
}).$mount('#app')
推荐阅读
- reactjs - React Native:更改导航选项卡的颜色
- php - PHP Mongo Driver Invalid UTF-8 field path in bulk insert
- ios - Why AVAudioSession is not connected after GSM call ends,While VoIP call is going on?
- bash - 如何按数字顺序连续监视和重命名正在复制到同名目标文件夹的文件
- python - Register Matplotlib Colormap
- css - 如何通过模板驱动形式验证 Angular 7 中的下拉列表
- reactjs - How Component Did Mount works properly?
- python-3.x - Python 3.6 How do I create a Singleton with attributes and methods
- javascript - Is it possible to access a variable declared in typescript into javascript?
- python - What is the function of the InputSpec layer in Keras?