vuejs2 - 如何在 vue-router 之前运行一些东西
问题描述
我正在构建我的第一个 SPA,但我遇到了一些问题。它是这样设计的:
- Laravel & Laravel Views 处理登录和注册相关的页面。
- SPA 从用户登录页面开始。
- 我的 app.js 定义了一个默认的 VueJS 应用程序,我在其中使用该
mounted()
方法设置登录用户的状态 (VUEX)。理想情况下,它所做的只是通过对 Laravel 后端的 axios 调用获取用户详细信息并填充 VUEX 状态。 - 我
beforeEnter()
在路线定义中使用方法来确保只有授权的人才能导航到路线。
这就是我面临问题的地方。当用户登录时,似乎在设置 vuex 之前执行了路由器。假设我有一个 url /dashboard 和 /user/1。当我尝试转到 user/1 时,如果它是在我加载应用程序之后完美运行。但是,如果我在 user/1 中刷新网页,则路由器beforeEnter
无法找到用户的 vuex 状态,因此它将用户重定向到仪表板。这是因为当路由器运行时beforeEnter
,如果是新的页面加载,它将无法访问用户 Vuex 状态或者它可以访问,但尚未设置该值。
因此,我最大的问题是我无法直接链接到路线页面,因为它总是登陆仪表板,然后用户必须转到路线才能工作。我该如何处理这种情况?
解决方案
这就是我最终做的。我定义了一个用于初始化 Vue 的函数。
在 app.js 结束时,我使用 Axios 通过 Ajax 检索当前用户。在then
Promise 的方法中,我store
使用我在 Promise 中收到的用户详细信息进行设置,然后调用我在上面为 Vue 初始化定义的函数。这样,当 vue 初始化时,商店用户已经拥有数据。
代码更改非常小,我不必更改现有的 axios 实现。
这是我的新实现:
Axios.get('/api/user/info')
.then(response => {
(new Vue).$store.commit('setUser', response.data);
initializeVue();
})
.catch(error => initializeVue());
function initializeVue()
{
window.app = new Vue({
el: '#app',
router,
components: {
UserCard,
Sidebar,
},
methods: mapMutations(['setUser']),
computed: mapState(['user']),
});
}
推荐阅读
- proxy - 绕过代理通过 sendmail 发送电子邮件
- regex - 使用正则表达式 bash 将字符串提取到变量
- javascript - 如何将变量传递给事件处理函数?
- android - 使用 Android 5 运行设备时出现奇怪的 Logcat 消息,并且无法将捕获的图像保存在 CameraX 上
- sql - 使用 SSMS 导出向导时从列中删除 SQL Server Varbinary(8000) 十六进制 0x
- typo3 - TYPO3 10.4.20 和 b13/容器
- python - 在消息被调用后停止重复消息
- python - 如何从嵌套符号中提取字符串?
- java - IntelliJ 无法跨存储库解析 java.util 模块
- sql - 如何在 CASE 语句中使用“之间”?