Почему мое вычисляемое свойство auth не обновляет мое дерево DOM?

Я создал интерфейс nuxt с функциями аутентификации на основе модуля nuxt-apollo. Мой макет будет меняться в зависимости от того, вошел ли пользователь в систему или нет. Для этого у меня в макете есть простой v-if=isAuthenticated. Вот код ниже:

<template>
  <v-app>
    <!-- authenticated user -->
    <template v-if="isAuthenticated">
      <v-content>
        <v-container>
          <v-row>
            <v-col>
              <v-fade-transition mode="out-in">
                <nuxt />
              </v-fade-transition>
            </v-col>
          </v-row>
        </v-container>
      </v-content>
    </template>
    <!-- unauthenticated user -->
    <template v-else>
      <v-content>
        <v-container>  
          <v-fade-transition mode="out-in">
            <nuxt />
          </v-fade-transition>
        </v-container>
      </v-content>
    </template>
  </v-app>
</template>

<script>

export default {
  data() {
    return {

    };
  },
  computed: {
    isAuthenticated() {
      return !!this.$apolloHelpers.getToken();
    }
  }
};
</script>

!!this.$apolloHelpers.getToken() - это то, что используется в промежуточном программном обеспечении из примера приложения auth, чтобы разрешить или запретить аутентифицированные маршруты.

Проблема: когда пользователь входит в систему и установлен токен, вычисленное свойство не выполняется повторно и макет не обновляется. Однако он отображается правильно, если я обновляю страницу.

Раньше я использовал модуль nuxt auth, и он отлично работал при использовании их помощника v-if="$auth.loggedIn" для переключения.

Поскольку я новичок в Vue, мне было интересно, упускаю ли я очевидное или мне следует действовать иначе.


person Billybobbonnet    schedule 23.01.2020    source источник


Ответы (1)


По-видимому, это происходит потому, что Vue только обновляет значение вычисляемого свойства при изменении одной из его зависимостей.
В вашем случае $apolloHelpers.getToken() не будет обновляться при вызове $apolloHelpers.onLogin(). У функции getToken останется та же ссылка, единственное, что изменится, - это ваш файл cookie аутентификации Apollo.

Один из вариантов - использовать такой пакет, как vue-reactive-cookie, чтобы следите за своим файлом cookie и убедитесь, что ваша локальная переменная всегда актуальна.
Вы также можете использовать Vuex, чтобы сохранить глобальную переменную и обновлять ее всякий раз, когда вы вызываете $apolloHelpers.onLogin() или $apolloHelpers.onLogout(), и наблюдать за ней внутри своих компонентов, чтобы сохранить локальная переменная обновлена.

person Thales Agapito    schedule 15.01.2021