javascript - Visa olika listobjekt beroende på om användaren är inloggad eller inte


Jag har en matris med möjliga sidomenyalternativ som jag vill visa på skärmen. Gästanvändaren ska bara se 2 av objekten och när användaren loggar in ska han kunna se alla 3 av dem. Hur skulle jag inte visa det första objektet i listan om användaren inte är inloggad?

apps: Array<SideNavItemModel> = [
{
  title: "sideNav.centralWeighingLink",
  url: "centralWeighing",
  id: "1",
  icon: "mdi-scale-balance",
  isAuthorized: false
},
{
  title: "sideNav.appsLink",
  url: "apps",
  id: "2",
  icon: "mdi-apps"
},
{
  title: "sideNav.2Link",
  url: "password",
  id: "3",
  icon: "mdi-key-variant"
},
]; 

Jag har en monterad metod som kontrollerar om $auth.user-objektet inte är null, och den sätter sedan värdet på isAuthorized till true.

Det här är koden som renderar listan nu:

    <v-list dense>
    <v-list-item v-for="app in apps" :key="app.id"
                 active-class="router-link-active" :to="`/${app.url}`" link>
      <div v-if="!$auth.user && app.isAuthorized === false ">
        <v-list-item-icon>
          <v-icon>{{ app.icon }}</v-icon>
        </v-list-item-icon>
        <v-list-item-content>
          <v-list-item-title>{{ $t(app.title) }}</v-list-item-title>
        </v-list-item-content>
      </div>
    </v-list-item>
  </v-list>

Jag vet inte hur jag ska skriva detta block så att det skulle utelämna det första objektet i listan utan att på något sätt hårdkoda det, eftersom raden nedan inte fungerar.

v-if="!$auth.user && app.isAuthorized === false"

Jag vet att det skulle vara enklare att använda metoden loggedIn, men jag kan inte använda den på grund av hur appen är byggd just nu.

Svar #1

Om du vill visa det första objektet efter att användaren har loggat in, behöver du bara ändra villkoret för det första objektet.

Initiera appar så här:

apps: Array<SideNavItemModel> = [
  {
    title: "sideNav.centralWeighingLink",
    url: "centralWeighing",
    id: "1",
    icon: "mdi-scale-balance",
    isAuthorized: false
  },
  {
    title: "sideNav.appsLink",
    url: "apps",
    id: "2",
    icon: "mdi-apps",
    isAuthorized: true
  },
  {
    title: "sideNav.2Link",
    url: "password",
    id: "3",
    icon: "mdi-key-variant",
    isAuthorized: true
  },
]; 

Och sedan återge listan så här:

 <v-list dense>
    <v-list-item v-for="app in apps" :key="app.id"
                 active-class="router-link-active" :to="`/${app.url}`" link>
      <div v-if="app.isAuthorized">
        <v-list-item-icon>
          <v-icon>{{ app.icon }}</v-icon>
        </v-list-item-icon>
        <v-list-item-content>
          <v-list-item-title>{{ $t(app.title) }}</v-list-item-title>
        </v-list-item-content>
      </div>
    </v-list-item>
  </v-list>

Efter att användaren har loggat in behöver man bara ställa in den första appens isAuthorized som true.

Bara säger mina tankar, hoppas det hjälper.

Svar #2

Efter att användaren loggat in, lagra token i lagret med mutationer. Observera att det kommer att vara en sträng men du bör konvertera det till ett boolean-värde med !!. ''=false men ' '=true.
Detta är allt du behöver.

new Vue({
  el: '#app',
  data() {
    return {
      hello: 'hellasdfo',
      token: false,
    }
  },
  created() {
    // store in store and get it with getters
    // this.token = !!this.$store.getters['token'] or !!this.$store.getters.token
    this.token = !!'some token';
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <p>Not LoggedIn</p>
  <p>Not LoggedIn</p>
  <p v-if="token">LoggedIn</p>
</div>