@AlexanderY

Является ли это плохой практикой во Vue.js?

Сразу скажу, указанный пример работает и решает мои задачи, но интуитивно чувствую, что это может быть антипаттерном.

Есть SPA с возможностью регистрации и входа на сайт. На некоторых страницах, пока юзер не залогинен, надо показывать пустой список. А когда залогинится - запросить данные с сервера. Вопрос, как разные компоненты могут отслеживать факт успешного логина на сайт?

Я делаю так:
// store, отвечающий за авторизацию
actions: {
  login: function ({state, commit}) {
    // ...
    axios.post(api.auth.login, {
      email: state.reg.email,
      password: state.reg.password
    }).then(response => {
      // ...
      app.$emit('login'); // важная часть. app это экземпляр приложения Vue
    }).catch(err => {
      // ...
    });
  }
}


// В компоненте
created(){
  this.$root.$on('login', function() {
    // здесь запрашиваем данные
  });
},
destroyed() {
  this.$root.$off(['login']);
},


Если это - плохая практика, то как надо делать? Ну или какие вообще тут есть варианты?

Ок, я вижу, что плохо объяснил. В компоненте есть некий массив:
// тот же компонент, где created и destroyed из предыдущего листинга
computed: {
  auth: function () {
    return this.$store.state.auth;
  }
},
data: function() {
  return {
    items: []
  };
},


В нем изначально данных нет, потому что юзер не авторизован. В шаблоне там примерно такое:
<template>
  <div>
    <v-data-table
      v-if="auth.isAuth"
      :items="items"
    >
      <template slot="items" slot-scope="props">
        <td>{{ props.item.id }}</td>
        <td>{{ props.item.name }}</td>
      </template>
    </v-data-table>
    <div v-else="">
      Пожалуйста, авторизуйтесь для просмотра этой информации
    </div>
  </div>
</template>


Соответственно, после успешного логина нужно массив items обновить, запросив откуда-то. Сейчас я делаю это с помощью событий, как описал выше.
  • Вопрос задан
  • 289 просмотров
Пригласить эксперта
Ответы на вопрос 2
lavezzi1
@lavezzi1
Можно просто в vuex state сделать типа isLoggedIn: false, при успешной авторизации менять на true, сделать getters для isLoggedIn и уже на страницах чекать данные state.
Ответ написан
Kozack
@Kozack Куратор тега Vue.js
Thinking about a11y
https://github.com/foxbenjaminfox/vue-async-computed
asyncComputed: {
    items() {
      if (this.auth.isAuth)
            return axios(/* ... */)
      else
            return Promise.resolve([])
    }
  }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы