Получатели Vuex получают роль пользователя в компоненте

#javascript #firebase #vue.js

#javascript #firebase #vue.js

Вопрос:

Я новичок в разработке с Vue.js Vuex и Firebase, и я пытаюсь показать разные элементы навигационной панели в зависимости от роли пользователя. В настоящее время я извлекаю пользовательские данные из Firebase в виде объекта и передаю их в хранилище.

Я попытался использовать геттеры в vuex для проверки роли пользователя, и это вроде как работает, только если пользователь в роли «администратор».

Вот мои получатели:

 isAuthenticated (state) {
  return state.user
},
userAuth: state => state.user.roles === 'thinker'|| 'e-libre' || 'hacker' || 'admin',
reviewerAuth: state => state.user.roles === 'reviewer' || 'admin',
devAuth: state => state.user.roles === 'dev' || 'admin',
adminAuth: state => state.user.roles === 'admin',
  

Я хочу, чтобы эти функции возвращали логическое значение в вычисляемом свойстве моего компонента, чтобы я мог проверить, является ли пользователь администратором или, например, рецензентом, чтобы я мог отображать разные элементы.

Вот моя вычисляемая функция

 computed: {
app$(): IApp {
  return this.$store.state;
},
isAuthenticated () {
  return this.$store.getters.isAuthenticated
},
adminAuth () {
  return this.$store.getters.adminAuth
},
reviewerAuth () {
  return this.$store.getters.reviewerAuth
},
  

и тогда я не знаю, почему эта функция работает нормально, когда пользователь играет роль «администратор», а не когда пользователь играет другую роль.

 adminItems () {
    if (this.adminAuth) {
      return [
        { text: 'Admin', icon: 'lock', subheader: 'admin',
          children: [
            { text: 'Management', route: '/management', icon: ''},
            { text: 'Settings', route: '/settings', icon: ''}
          ]
        }
      ]
    }
}
  

например, когда пользователь выступает в роли рецензента, reviewerAuth возвращает значение undefined:

  <v-list-tile v-if="!adminAuth||!reviewerAuth" to="/" avatar>
          <v-list-tile-avatar>
          <v-icon>translate</v-icon>
          </v-list-tile-avatar>
          <v-list-tile-content>
            <v-list-tile-title>Devenir reviewer</v-list-tile-title>
          </v-list-tile-content>

        </v-list-tile>
        <v-divider v-if="!adminAuth||!reviewerAuth"></v-divider>
        <v-list-tile
        v-for="(item, index) in userItems"
        :key="index"
        :to="item.path"
        avatar
        @click="">
        <v-list-tile-avatar>
        <v-icon>{{ item.icon }}</v-icon>
        </v-list-tile-avatar>
          <v-list-tile-title>{{ item.title }}</v-list-tile-title>

        </v-list-tile>
  

Чего мне там не хватает? Я как бы одновременно изучаю javascript и чувствую, что делаю это совершенно неправильно.

Большое спасибо за вашу помощь

Philmo

Ответ №1:

У вас простая проблема, когда синтаксис проверок неверен. Рассмотрим

 1 === 2 || 'hello'
  

Это возвращает: hello .

Аналогично, у вас аналогичная ошибка с:

 userAuth: state => state.user.roles === 'thinker'|| 'e-libre' || 'hacker' || 'admin',
reviewerAuth: state => state.user.roles === 'reviewer' || 'admin',
devAuth: state => state.user.roles === 'dev' || 'admin',
adminAuth: state => state.user.roles === 'admin',
  

Должно быть вместо:

 userAuth: state => state.user.roles === 'thinker'|| state.user.roles === 'e-libre' || state.user.roles === 'hacker' || state.user.roles === 'admin',
reviewerAuth: state => state.user.roles === 'reviewer' || state.user.roles === 'admin',
devAuth: state => state.user.roles === 'dev' || state.user.roles === 'admin',
adminAuth: state => state.user.roles === 'admin',
  

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

1. Большое вам спасибо за ваш ответ