Vue.js: элемент отображается на мгновение, несмотря на условный рендеринг

У меня есть навигация с кнопкой, которая переключает меню и кнопкой входа.

Когда пользователь не авторизован, он может видеть только кнопку «Войти». Когда пользователь входит в систему, эта кнопка исчезает, и он / она может видеть кнопку гамбургера, которая переключает меню пользователя.

У меня есть условие на основе атрибута isLoaded, который может быть ложным или истинным в зависимости от ответа API (загружены ли данные профиля или нет, что происходит после входа в систему). Он работает правильно, но кнопка «Войти» появляется на мгновение, когда я перезагружаю страницу и после перенаправления на главную страницу после процесса входа. Интересно, как мне этого избежать.

Я подозреваю, что эта кнопка отображается, когда приложение ожидает ответа API, и как только оно видит isLoaded: true, оно скрывает кнопку после проверки условия.

Вот мой код:

<v-toolbar app fixed dark color = "light-blue lighten-2">
  <user-nav-button v-if = "getProfile.isLoaded"
                   @toggle-drawer = "$refs.drawer.drawer = !$refs.drawer.drawer" />
  <v-toolbar-title v-if = "getProfile.isLoaded">
    <router-link :to = "{ name: '/' }"
                 class = "white--text" >
      APP
    </router-link>
  </v-toolbar-title>
  <v-spacer></v-spacer>
  <router-link :to = "{ name: 'login' }"
               class = "sign-in-button"
               v-if = "!getProfile.isLoaded">
    SIGNIN
  </router-link>
</v-toolbar>
<profile-sidebar v-if = "getProfile.isLoaded"
                 ref = "drawer" />

<script>
export default {
data() {
 return {
  drawer: '',
 };
},
components: {
  UserNavButton,
  ProfileSidebar,
  MainFooter,
 },
 created() {
  this.loadProfile();
 },
 computed: {
  ...mapGetters(['getProfile']),
 },
 methods: {
  ...mapActions(['loadProfile']),
 },
};
<script>

Мой магазин:

export default {
 state: {
 profile: {
  isLoaded: false,
  data: [],
  },
},
actions: {
 loadProfile({ commit }) {
  if (config.token !== '') {
    http
      .post('api')
      .then(({ data }) => {
        commit('SET_PROFILE', data);
      });
  }
 },
},
mutations: {
 SET_PROFILE(state, data) {
  state.profile = {
    isLoaded: true,
    data,
  };
 },
},
getters: {
 getProfile(state) {
  return state.profile;
  },
 },
};

Просто укажите значение по умолчанию для getProfile.isLoaded. Итак, пока он ожидает данных, у вас есть значение по умолчанию, в котором теперь отображается элемент.

Constantin Chirila 17.10.2018 10:03

Спасибо за ответ. Этот атрибут уже имеет значение по умолчанию false. Он переключается на true, когда я создаю действие с мутацией. Эта мутация переключает isLoaded на true.

Olga B 17.10.2018 10:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
280
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша кнопка делает именно то, что вы ей говорите.

  <router-link :to = "{ name: 'login' }"
               class = "sign-in-button"
               v-if = "!getProfile.isLoaded">

Когда getProfile.isLoaded ложный, вы его показываете. И это также ваше состояние по умолчанию.

Лично я бы отделил isloaded от данных профиля. Используйте свойство данных loadingfinished (или свойство $store)

На самом деле вы хотите, чтобы эта кнопка отображалась только при выполнении двух условий:

  1. загрузка закончена

  2. вы знаете, что пользователь НЕ вошел в систему.

Благодарю за ответ. Я добавил свой код из магазина. К сожалению, это решение для меня ничего не изменило. :(

Olga B 19.10.2018 08:32

@OlgaB Код вашего магазина выглядит нормально. Как вы вызываете это в своих методах компонента представления?

Katinka Hesselink 19.10.2018 09:15

@OlgaB - Я отредактировал свой ответ, основываясь на вашем коде. Надеюсь, это поможет.

Katinka Hesselink 22.10.2018 10:10

Большое спасибо за ваш совет. Я отметил это как решение, однако предпочел создать метод в main.js, где я проверяю, есть ли у меня токен или нет. Затем я использовал директивы v-if, основанные на этом методе. Работает отлично. :)

Olga B 06.11.2018 11:15

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

Katinka Hesselink 06.11.2018 11:39

Другие вопросы по теме