как сделать динамический v-if при рендеринге в компоненте Vue js?

#javascript #vue.js #vuejs2 #vue-router

#javascript #vue.js #vuejs2 #vue-маршрутизатор

Вопрос:

как сделать v-if при рендеринге в другой компонент для быстрого рендеринга? у меня есть некоторый случай, когда я собираюсь войти в систему, и после успешного завершения мое nabvar component действие изменится после его завершения, я должен вручную перезагрузить его на своем клиенте, чтобы получить logout button , и то же самое происходит и при удалении, я должен вручную перезагрузить то, что я уже поставил :key на этот компонент

вот мой компонент на моей странице login.vue

 goLogin() {
    if (!this.input || !this.password) {
      this.$swal.fire({
        type: 'error',
        text: `please enter your email/username and password`,
      });
    } else {
      const client = {
        input: this.input,
        password: this.password,
      };
      this.$axios
        .post('/api/user/login', client)
        .then(({
          data
        }) => {
          localStorage.setItem('token', data.token);
          // vm.$forceUpdate();
          localStorage.setItem('role', data.tryingLogin.role);
          this.$swal.fire({
            type: 'success',
            text: `successfully login`,
          });
          if (data.tryingLogin.role === 'admin') {
            this.$router.replace({
              path: '/admin'
            });
          } else {
            this.$router.push({
              path: '/'
            });
          }
        })
        .catch(err => {
          this.$swal.fire({
            type: 'error',
            text: err.response.data.error,
          });
        });
    }  

и в моем компоненте Header.vue у меня есть isLogin реквизиты, и я проверяю, закрываю ли localStorage.GetItem («токен») кнопку входа и регистрации navbar header.vue , и она должна показывать кнопку выхода, если у клиента есть токен, но его не было, после успешного входа в систему я должен перезагрузить его, чтобы получитькнопка logout showing

как заставить его быстро меняться? чтобы поменять местами показывать и скрывать кнопки входа и выхода из системы??

я также создаю реквизиты для проверки входа в систему на моем App.vue , и я использую все хуки постоянно, чтобы поменять местами кнопку входа и выхода из системы, это вообще не изменилось, 🙁

и это происходит, когда я также удаляю свой список, я должен перезагрузить его: (надеюсь, вы, ребята, могли бы дать мне некоторую помощь и подсказку для решения этой проблемы: D

Ответ №1:

Для совместного использования состояния между различными компонентами лучшим выбором было бы использовать библиотеку управления состоянием, такую как Vuex: https://vuex.vuejs.org

Вы создаете хранилище, в котором хранится информация о том, зарегистрирован пользователь или нет:

 const store = new Vuex.Store({
  state: {
    isLoggedIn: false
  },
  mutations: {
    TOGGLE_LOGIN_STATUS: (state) => {
      state.isLoggedIn = !state.isLoggedIn;
    }
  }
})
  

При успешном входе в систему вы меняете isLoggedIn флаг:

 store.commit('TOGGLE_LOGIN_STATUS');
  

И вы можете получить этот статус из хранилища в любом из ваших компонентов (он также реактивный, поэтому изменения отражаются во всех ваших компонентах) — это должно быть computed свойство:

 computed: {
  isLoggedIn() { return store.state.isLoggedIn; },
}
  

Теперь вы можете использовать isLoggedIn в своем v-if для отображения кнопки выхода из системы. Просто не забудьте либо импортировать хранилище в свои компоненты, либо сделать его глобальным (все, что вам нужно, есть в документах Vuex).

Другой способ — использовать шину событий.

/src/event-bus.js

 import Vue from 'vue';
export const EventBus = new Vue();
  

Импортируйте его в свой компонент Login.

 import EventBus from '@/event-bus';
  

После получения токена и успешного входа в систему выдайте событие:

 EventBus.$emit('logged-in', true);
  

Теперь импортируйте EventBus в компонент, который получает событие (ваш компонент с кнопкой выхода) и поместите прослушиватель в свой mounted хук:

 mounted() {
  EventBus.$on('logged-in', payload => {
    this.isLoggedIn = payload;
  })
}
  

Комментарии:

1. для моего проекта я пока не должен использовать Vuex, есть ли у вас какой-либо метод только с Vue и без Vuex ?? : D

2. Да, вы также можете создать шину событий. Я обновил свой ответ.

3. хм, я постараюсь скоро вернуться, так что шина событий похожа на состояние хранилища? это правильно??

4. о да, установленный хук находится в моем компоненте панели навигации заголовка? или App.vue??

5. Не совсем; вы используете его для генерации событий внутри вашего приложения. У каждого события есть имя (по вашему выбору), и вы можете дополнительно передать полезную нагрузку (значение) вместе с ним. Другой компонент может подписаться (прослушать) это конкретное событие (по его имени) и выполнить определенные действия при его отправке. mounted Перехват может использоваться во всех ваших компонентах, но в этом случае вы должны зарегистрировать прослушиватель в том компоненте, где находится ваша кнопка выхода (или ваш isLogin prop — ваш Header.vue , если я прав);