【问题标题】:bind global variable on a component with :key使用 :key 在组件上绑定全局变量
【发布时间】: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


【解决方案1】:

当 Vue 检测到它依赖的数据发生变化时,它会更新它。为了让 Vue 检测到它的变化,数据需要是响应式的。

原型链上的东西不是,我认为你使用原型链来过度复杂化。要管理全局状态,只需使用 Vuex 存储。 (docs)

然后,您可以在 computed 属性中使用 ...mapGetters(['isLoggedIn'])this.$store.commit('loggedIn', true) 或 Login.vue 文件中的类似内容。

【讨论】:

  • Vuex 肯定会在这里管理所有组件可访问的变量,问题是管理单个 var 是否过大。
  • 如果一个大到足以容纳登录屏幕的应用程序没有更多更适合 Vuex 的数据,我会感到惊讶。
  • 不,@Sumurai8 建议使用 Vuex,这是一种状态管理工具,允许您拥有一个或多个“存储”变量,您可以在整个应用程序中访问。在Vuex's website 上有更多信息。
  • 也可以创建自己的商店模式,如果你想走这条路,描述here,但这可能比它的价值更麻烦。
猜你喜欢
  • 2010-11-21
  • 1970-01-01
  • 2022-01-25
  • 2011-05-07
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多