【发布时间】:2020-11-02 20:38:06
【问题描述】:
我在一个 Vue 项目上工作,我有一个登录页面,当用户登录时会重定向到主页。
问题是当用户在主页上时,我需要更新/重新渲染标题组件。
所以我在 main.ts 中创建了一个全局变量:
Main.ts
Vue.prototype.isLogin = false;
我使用这个全局值作为我的标题的键:
App.vue
<template>
<div id="app" class="container">
<e-header v-bind:key="isLogin" />
<div class="alert-box">
<div class="alert-list">
<e-alert
v-for="(notif, index) in $store.state.notifications"
:key="index"
:type="notif.type"
@dismissAlert="dismissAlert(index)"
>
{{ notif.message }}
</e-alert>
</div>
</div>
<router-view />
</div>
</template>
在登录组件上,在我的login() 方法中:
登录.vue
AdminApi.login(this.email, this.password).then(() => {
this.loaderActive = false;
this.isLogin = true;
});
问题是当用户登录成功并重定向到主页时,标题组件没有更新,我需要在App.vue中使用prop而不是全局变量吗?
【问题讨论】:
-
如果我错了,比我更有经验的人应该纠正我,但这听起来可能是一个反应性问题。我的印象是,在 vue 实例的数据对象之外创建一个像这样的全局变量意味着it isn't reactive。这意味着 Vue 无法判断它何时发生变化,我认为这可能会导致将其用作键时出现问题。
-
所以如果我想创建一个全局变量,如果我理解正确的话,我需要在 App.vue 中实例化它?
-
您可以将它添加到您的 App.vue
data()并将其作为道具传递,但如果您在嵌套组件中需要它,这可能变得不切实际,因为您' 必须将它作为道具传递给每个需要它的组件。 Vuex 状态管理将是一个更优雅的解决方案,尽管将它用于单个 var 可能感觉有点矫枉过正,如果这真的是你唯一使用它的事情的话。 -
我在
App.vue中创建了一个data()属性,它返回一个isLogin: false,但在我的Login.vue中的login()方法中,我调用this.isLogin,即undefined,我是否需要做其他事情才能正确传递值? -
如果您想纯粹使用类似的道具和数据方法,那么您需要将
isLogin属性或道具从您的App.vue传递给您的Login.vue通过任何方式您当前设置的组件层次结构。
标签: javascript vue.js vue-component